import React, { useState } from 'react'
import {
BookOpen,
CircleHelp,
ExternalLink,
Github,
Keyboard,
Loader2,
MessageSquareText,
RefreshCw,
RotateCw,
School,
ScrollText,
Settings
} from 'lucide-react'
import { toast } from 'sonner'
import logo from '../../../../../resources/logo.svg'
import { useAppStore } from '@/store'
import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger
} from '@/components/ui/dropdown-menu'
import { useMountedRef } from '@/hooks/useMountedRef'
import { useShortcutKeyDetails } from '@/hooks/useShortcutLabel'
import { ShortcutKeyCombo } from '@/components/ShortcutKeyCombo'
import { showOnboardingFromRenderer } from '../onboarding/show-onboarding-event'
import { SetupGuideProgressRing } from '../setup-guide/SetupGuideProgressRing'
import { useSetupGuideProgress } from '../setup-guide/use-setup-guide-progress'
import { SidebarFeedbackDialog } from './SidebarFeedbackDialog'
import { translate } from '@/i18n/i18n'
const DOCS_URL = 'https://www.onorca.dev/docs'
const CHANGELOG_URL = 'https://onorca.dev/changelog'
const GITHUB_URL = 'https://github.com/stablyai/orca'
const DISCORD_URL = 'https://discord.gg/fzjDKHxv8Q'
const X_URL = 'https://x.com/orca_build'
function openExternalUrl(url: string): void {
void window.api.shell.openUrl(url)
}
function DiscordIcon(): React.JSX.Element {
return (
)
}
function XIcon(): React.JSX.Element {
return (
)
}
function ExternalMenuItem({
label,
url,
icon
}: {
label: string
url: string
icon: React.ReactNode
}): React.JSX.Element {
return (
openExternalUrl(url)}>
{icon}
{label}
)
}
export function SidebarSettingsHelpMenu(): React.JSX.Element {
const openModal = useAppStore((s) => s.openModal)
const openSettingsPage = useAppStore((s) => s.openSettingsPage)
const openSettingsTarget = useAppStore((s) => s.openSettingsTarget)
const updateStatus = useAppStore((s) => s.updateStatus)
const setupProgress = useSetupGuideProgress(true, false, false)
const settingsShortcut = useShortcutKeyDetails('app.settings')
const [menuOpen, setMenuOpen] = useState(false)
const [feedbackOpen, setFeedbackOpen] = useState(false)
const [showAdminOptions, setShowAdminOptions] = useState(false)
const [isRestartingOrca, setIsRestartingOrca] = useState(false)
const lastShowOnboardingAtRef = React.useRef(0)
const mountedRef = useMountedRef()
const showMilestones =
setupProgress.ready && setupProgress.coreDoneCount < setupProgress.coreTotal
const handleMenuOpenChange = (open: boolean): void => {
setMenuOpen(open)
if (!open) {
setShowAdminOptions(false)
}
}
const revealAdminOptions = (altKey: boolean): void => {
// Why: onboarding replay and restart stay off the default Help menu; holding
// Option/Alt before opening is an intentional power-user affordance.
setShowAdminOptions(altKey)
}
const handleShowOnboarding = (): void => {
const now = Date.now()
if (now - lastShowOnboardingAtRef.current < 500) {
return
}
lastShowOnboardingAtRef.current = now
void showOnboardingFromRenderer()
}
const handleRestartOrca = (): void => {
if (isRestartingOrca) {
return
}
setIsRestartingOrca(true)
toast.info(
translate('auto.components.sidebar.SidebarSettingsHelpMenu.5161eef55d', 'Restarting Orca…')
)
void window.api.app.restart().catch((error) => {
if (mountedRef.current) {
setIsRestartingOrca(false)
toast.error(
translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.4e8f5710d3',
"Couldn't restart Orca."
),
{
description: error instanceof Error ? error.message : undefined
}
)
}
})
}
const openShortcutsSettings = (): void => {
openSettingsTarget({ pane: 'shortcuts', repoId: null })
openSettingsPage()
}
const handleCheckForUpdates = (event: Event): void => {
const shiftKey = (event as PointerEvent).shiftKey
void window.api.updater.check({ includePrerelease: shiftKey })
}
const openMilestones = (): void => {
openModal('setup-guide', { telemetrySource: 'help_menu' })
}
return (
<>
{translate('auto.components.sidebar.SidebarSettingsHelpMenu.a428c25998', 'Settings')}
{settingsShortcut.keys.length > 0 ? (
) : null}
{translate('auto.components.sidebar.SidebarSettingsHelpMenu.2991a0106c', 'Help')}
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.e565171a7c',
'Keyboard Shortcuts'
)}
setFeedbackOpen(true)}>
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.4cf5b868d7',
'Send Feedback'
)}
{showMilestones ? (
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.f8a2c91d4e',
'Milestones'
)}
) : null}
{showAdminOptions ? (
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.b7e4d2a19c',
'Onboarding'
)}
) : null}
}
/>
}
/>
}
/>
openExternalUrl(DISCORD_URL)}>
{translate('auto.components.sidebar.SidebarSettingsHelpMenu.eb9884e55b', 'Discord')}
openExternalUrl(X_URL)}>
{translate('auto.components.sidebar.SidebarSettingsHelpMenu.c4f8e1b72a', 'X')}
{updateStatus.state === 'checking' ? (
) : (
)}
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.29c56f30ee',
'Check for Updates'
)}
{showAdminOptions ? (
<>
{translate(
'auto.components.sidebar.SidebarSettingsHelpMenu.ad3d3ed7f1',
'Restart Orca'
)}
>
) : null}
>
)
}