import MarkdownArticle from '@/components/Note/MarkdownArticle/MarkdownArticle'
import { Button } from '@/components/ui/button'
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle
} from '@/components/ui/dialog'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { createFakeEvent } from '@/lib/event'
import {
isRadixDialogOpen,
OPEN_NEW_POST_SHORTCUT_KEY,
shouldIgnoreKeyboardShortcutEvent
} from '@/lib/keyboard-shortcuts'
import { cn } from '@/lib/utils'
import postEditorService from '@/services/post-editor.service'
import { CircleHelp } from 'lucide-react'
import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'
import {
KeyboardShortcutsHelpContext,
useKeyboardShortcutsHelp
} from '@/contexts/keyboard-shortcuts-help-context'
import { useTranslation } from 'react-i18next'
import readmeMarkdown from '../../../README.md?raw'
export { useKeyboardShortcutsHelp } from '@/contexts/keyboard-shortcuts-help-context'
function Kbd({ children }: { children: ReactNode }) {
return (
{children}
)
}
function KbdRow({ keys, label }: { keys: ReactNode; label: string }) {
return (
)
}
function ShortcutsPanel() {
const { t } = useTranslation()
return (
{t('shortcuts.intro')}
{t('shortcuts.sectionApp')}
?
{t('shortcuts.or')}
F1
>
}
/>
Shift
+
Alt
+
F
>
}
/>
Shift
+
Alt
+
S
>
}
/>
Shift
+
Alt
+
N
>
}
/>
{t('shortcuts.sectionSearch')}
↑
↓
{t('shortcuts.then')}
Enter
>
}
/>
Esc} />
{t('shortcuts.sectionStandard')}
Tab
{t('shortcuts.or')}
Shift
+
Tab
>
}
/>
Enter
{t('shortcuts.or')}
Space
>
}
/>
Esc} />
↑
↓
PgUp
PgDn
Home
End
>
}
/>
Alt
+
←
>
}
/>
)
}
function ReadmeOverviewPanel({ className }: { className?: string }) {
const readmeEvent = useMemo(
() =>
createFakeEvent({
id: '0'.repeat(64),
pubkey: '0'.repeat(64),
content: readmeMarkdown,
created_at: 0,
kind: 1,
tags: [],
sig: '0'.repeat(128)
}),
[]
)
return (
)
}
export function KeyboardShortcutsHelpProvider({ children }: { children: ReactNode }) {
const [open, setOpen] = useState(false)
const openHelp = useCallback(() => setOpen(true), [])
const { t } = useTranslation()
useEffect(() => {
const onKeyDown = (e: KeyboardEvent) => {
if (open) return
if (shouldIgnoreKeyboardShortcutEvent(e.target)) return
if (isRadixDialogOpen()) return
const isQuestionMark =
e.key === '?' || (e.shiftKey && e.code === 'Slash' && !e.ctrlKey && !e.metaKey && !e.altKey)
if (isQuestionMark && !e.ctrlKey && !e.metaKey && !e.altKey) {
e.preventDefault()
setOpen(true)
return
}
if (e.key === 'F1' && !e.ctrlKey && !e.metaKey && !e.altKey) {
e.preventDefault()
setOpen(true)
return
}
if (
e.altKey &&
e.shiftKey &&
e.key.toLowerCase() === OPEN_NEW_POST_SHORTCUT_KEY &&
!e.ctrlKey &&
!e.metaKey
) {
e.preventDefault()
postEditorService.requestOpenNewPost()
}
}
document.addEventListener('keydown', onKeyDown, true)
return () => document.removeEventListener('keydown', onKeyDown, true)
}, [open])
const value = useMemo(() => ({ openHelp }), [openHelp])
return (
{children}
)
}
/** Titlebar-sized help control (e.g. home feed, next to profile). */
export function KeyboardShortcutsHelpButton() {
const { openHelp } = useKeyboardShortcutsHelp()
const { t } = useTranslation()
return (
)
}