"use client"; import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { CardContent, CardHeader, CardTitle } from "@kandev/ui/card"; import { useResponsiveBreakpoint } from "@/hooks/use-responsive-breakpoint"; import type { PluginRecord } from "@/lib/types/plugins"; import { buildPluginShortcutEntries, resolveShortcutEntry, type ShortcutEntry, } from "@/lib/keyboard/plugin-shortcuts"; import type { KeyboardShortcut } from "@/lib/keyboard/constants"; import { UNBOUND_SHORTCUT, type StoredShortcutOverrides } from "@/lib/keyboard/shortcut-overrides"; import { ShortcutRecorder, useShortcutConflictLabels, } from "@/components/settings/keyboard-shortcuts-card"; import { SettingsCard } from "../settings-card"; import { usePluginShortcutDraft } from "./use-plugin-shortcut-draft"; type PluginShortcutEntry = Extract; export function PluginShortcutsCard({ plugin, plugins, }: { plugin: PluginRecord; plugins: PluginRecord[]; }) { const { t } = useTranslation(); const { isMobile, isFinePointer } = useResponsiveBreakpoint(); const pluginEntries = useMemo(() => buildPluginShortcutEntries(plugins), [plugins]); const selectedEntries = useMemo( () => pluginEntries.filter( (entry): entry is PluginShortcutEntry => entry.source === "plugin" && entry.pluginId === plugin.id, ), [plugin.id, pluginEntries], ); const { saved, draft, setDraft, isDirty } = usePluginShortcutDraft( `plugin-shortcuts:${plugin.id}`, ); const conflictLabels = useShortcutConflictLabels(pluginEntries, draft, t); if (selectedEntries.length === 0) return null; const touchSized = isMobile || !isFinePointer; return ( {t("plugins:shortcuts")}

{t("plugins:shortcutsDescription")}

{selectedEntries.map((entry) => ( setDraft((current) => ({ ...current, [id]: shortcut }))} onReset={(id) => setDraft((current) => { const next = { ...current }; delete next[id]; return next; }) } onClear={(id) => setDraft((current) => ({ ...current, [id]: UNBOUND_SHORTCUT, })) } /> ))}

{t("settings:clickAShortcutToRecordA")}

); } function PluginShortcutRow({ entry, plugin, overrides, baselineOverrides, conflictsWith, touchSized, onChange, onReset, onClear, }: { entry: PluginShortcutEntry; plugin: PluginRecord; overrides: StoredShortcutOverrides; baselineOverrides: StoredShortcutOverrides; conflictsWith?: string[]; touchSized: boolean; onChange: (id: string, shortcut: KeyboardShortcut) => void; onReset: (id: string) => void; onClear: (id: string) => void; }) { const keybinding = plugin.ui?.keybindings?.find(({ id }) => id === entry.keybindingId); const current = resolveShortcutEntry(entry, overrides); return ( ); }