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}
) }