import { useMemo } from 'react' import type { AiAgentId, AiAgentsStatus } from '../lib/aiAgents' import type { AppLocale, UiLanguagePreference } from '../lib/i18n' import type { ThemeMode } from '../lib/themeMode' import type { VaultAiGuidanceStatus } from '../lib/vaultAiGuidance' import type { NoteWidthMode, SidebarSelection, VaultEntry } from '../types' import type { NoteListFilter } from '../utils/noteListHelpers' import type { ViewMode } from './useViewMode' import { buildNavigationCommands } from './commands/navigationCommands' import { buildNoteCommands } from './commands/noteCommands' import { buildGitCommands } from './commands/gitCommands' import { buildViewCommands } from './commands/viewCommands' import { buildSettingsCommands } from './commands/settingsCommands' import { buildAiAgentCommands } from './commands/aiAgentCommands' import { buildTypeCommands } from './commands/typeCommands' import { buildFilterCommands } from './commands/filterCommands' import { localizeCommandActions } from './commands/localizeCommands' import { extractVaultTypes } from '../utils/vaultTypes' import type { GitRepositoryOption } from '../utils/gitRepositories' // Re-export types and helpers for backward compatibility export type { CommandAction, CommandGroup } from './commands/types' export { groupSortKey } from './commands/types' export { pluralizeType, buildTypeCommands } from './commands/typeCommands' export { extractVaultTypes } from '../utils/vaultTypes' export { buildViewCommands } from './commands/viewCommands' interface CommandRegistryConfig { activeTabPath: string | null entries: VaultEntry[] modifiedCount: number activeNoteHasIcon?: boolean mcpStatus?: string onInstallMcp?: () => void aiFeaturesEnabled?: boolean aiAgentsStatus?: AiAgentsStatus vaultAiGuidanceStatus?: VaultAiGuidanceStatus onOpenAiAgents?: () => void onRestoreVaultAiGuidance?: () => void onSetDefaultAiAgent?: (agent: AiAgentId) => void selectedAiAgent?: AiAgentId onCycleDefaultAiAgent?: () => void selectedAiAgentLabel?: string onReloadVault?: () => void onRepairVault?: () => void onSetNoteIcon?: () => void onRemoveNoteIcon?: () => void locale?: AppLocale systemLocale?: AppLocale selectedUiLanguage?: UiLanguagePreference onSetUiLanguage?: (language: UiLanguagePreference) => void onSetThemeMode?: (mode: ThemeMode) => void onChangeNoteType?: () => void onMoveNoteToFolder?: () => void canMoveNoteToFolder?: boolean onOpenInNewWindow?: () => void onRevealActiveFile?: (path: string) => void onCopyActiveFilePath?: (path: string) => void onOpenActiveFileExternal?: (path: string) => void onToggleFavorite?: (path: string) => void onToggleOrganized?: (path: string) => void onCustomizeNoteListColumns?: () => void canCustomizeNoteListColumns?: boolean noteListColumnsLabel?: string onRestoreDeletedNote?: () => void canRestoreDeletedNote?: boolean onQuickOpen: () => void onCreateNote: () => void onCreateNoteOfType: (type: string) => void onSave: () => void onPastePlainText: () => void onOpenSettings: () => void onOpenFeedback?: () => void onOpenVault?: () => void onCreateEmptyVault?: () => void onAddRemote?: () => void canAddRemote?: boolean gitFeaturesEnabled?: boolean isGitVault?: boolean gitRepositories?: GitRepositoryOption[] onInitializeGit?: () => void onCreateType?: () => void onDeleteNote: (path: string) => void onArchiveNote: (path: string) => void onUnarchiveNote: (path: string) => void onCommitPush: () => void onPull?: () => void onPullRepository?: (path: string) => void onResolveConflicts?: () => void onSetViewMode: (mode: ViewMode) => void onToggleInspector: () => void onToggleDiff?: () => void onToggleRawEditor?: () => void selectedViewName?: string onMoveSelectedViewUp?: () => void onMoveSelectedViewDown?: () => void canMoveSelectedViewUp?: boolean canMoveSelectedViewDown?: boolean onFindInNote?: () => void onReplaceInNote?: () => void noteWidth?: NoteWidthMode defaultNoteWidth?: NoteWidthMode onSetNoteWidth?: (mode: NoteWidthMode) => void onSetDefaultNoteWidth?: (mode: NoteWidthMode) => void onToggleAIChat?: () => void onToggleTableOfContents?: () => void activeNoteModified: boolean onCheckForUpdates?: () => void onZoomIn: () => void onZoomOut: () => void onZoomReset: () => void zoomLevel: number onSelect: (sel: SidebarSelection) => void onRenameFolder?: () => void onDeleteFolder?: () => void onRevealSelectedFolder?: () => void onCopySelectedFolderPath?: () => void showInbox?: boolean onGoBack?: () => void onGoForward?: () => void canGoBack?: boolean canGoForward?: boolean onRemoveActiveVault?: () => void onRestoreGettingStarted?: () => void isGettingStartedHidden?: boolean vaultCount?: number selection?: SidebarSelection noteListFilter?: NoteListFilter onSetNoteListFilter?: (filter: NoteListFilter) => void } export function useCommandRegistry(config: CommandRegistryConfig): import('./commands/types').CommandAction[] { const { activeTabPath, entries, modifiedCount, onQuickOpen, onCreateNote, onCreateNoteOfType, onSave, onPastePlainText, onOpenSettings, onOpenFeedback, onDeleteNote, onArchiveNote, onUnarchiveNote, onCommitPush, onPull, onResolveConflicts, onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, onFindInNote, onReplaceInNote, noteWidth, defaultNoteWidth, onSetNoteWidth, onSetDefaultNoteWidth, onToggleAIChat, onToggleTableOfContents, onOpenVault, onCreateEmptyVault, selectedViewName, onMoveSelectedViewUp, onMoveSelectedViewDown, canMoveSelectedViewUp, canMoveSelectedViewDown, activeNoteModified, onZoomIn, onZoomOut, onZoomReset, zoomLevel, onSelect, onRenameFolder, onDeleteFolder, onRevealSelectedFolder, onCopySelectedFolderPath, showInbox, onGoBack, onGoForward, canGoBack, canGoForward, onCheckForUpdates, onCreateType, onRemoveActiveVault, onRestoreGettingStarted, isGettingStartedHidden, vaultCount, mcpStatus, onInstallMcp, aiFeaturesEnabled, aiAgentsStatus, vaultAiGuidanceStatus, onOpenAiAgents, onRestoreVaultAiGuidance, onSetDefaultAiAgent, selectedAiAgent, onCycleDefaultAiAgent, selectedAiAgentLabel, onReloadVault, onRepairVault, locale, systemLocale, selectedUiLanguage, onSetUiLanguage, onSetThemeMode, onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder, onOpenInNewWindow, onRevealActiveFile, onCopyActiveFilePath, onOpenActiveFileExternal, onToggleFavorite, onToggleOrganized, onCustomizeNoteListColumns, canCustomizeNoteListColumns, onRestoreDeletedNote, canRestoreDeletedNote, selection, noteListFilter, onSetNoteListFilter, gitFeaturesEnabled, isGitVault, gitRepositories, onInitializeGit, onPullRepository, } = config const hasActiveNote = activeTabPath !== null const activeEntry = useMemo( () => (hasActiveNote ? entries.find(e => e.path === activeTabPath) : undefined), [entries, activeTabPath, hasActiveNote], ) const isArchived = activeEntry?.archived ?? false const isFavorite = activeEntry?.favorite ?? false const isSectionGroup = selection?.kind === 'sectionGroup' const noteListColumnsLabel = config.noteListColumnsLabel ?? ( selection?.kind === 'filter' && selection.filter === 'all' ? 'Customize All Notes columns' : 'Customize Inbox columns' ) const vaultTypes = useMemo(() => extractVaultTypes(entries), [entries]) const navigationCommands = useMemo(() => buildNavigationCommands({ onQuickOpen, onSelect, selection, onRenameFolder, onDeleteFolder, onRevealSelectedFolder, onCopySelectedFolderPath, showInbox, onGoBack, onGoForward, canGoBack, canGoForward, }), [ onQuickOpen, onSelect, selection, onRenameFolder, onDeleteFolder, onRevealSelectedFolder, onCopySelectedFolderPath, showInbox, onGoBack, onGoForward, canGoBack, canGoForward, ]) const noteCommands = useMemo(() => buildNoteCommands({ hasActiveNote, activeTabPath, activeFileKind: activeEntry?.fileKind ?? 'markdown', isArchived, onCreateNote, onCreateType, onSave, onFindInNote, onReplaceInNote, onPastePlainText, onDeleteNote, onArchiveNote, onUnarchiveNote, onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder, onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onOpenInNewWindow, onRevealActiveFile, onCopyActiveFilePath, onOpenActiveFileExternal, onToggleFavorite, isFavorite, onToggleOrganized, isOrganized: activeEntry?.organized ?? false, onRestoreDeletedNote, canRestoreDeletedNote, }), [ hasActiveNote, activeTabPath, activeEntry?.fileKind, isArchived, onCreateNote, onCreateType, onSave, onFindInNote, onReplaceInNote, onPastePlainText, onDeleteNote, onArchiveNote, onUnarchiveNote, onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder, onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onOpenInNewWindow, onRevealActiveFile, onCopyActiveFilePath, onOpenActiveFileExternal, onToggleFavorite, isFavorite, onToggleOrganized, activeEntry?.organized, onRestoreDeletedNote, canRestoreDeletedNote, ]) const gitCommands = useMemo(() => buildGitCommands({ modifiedCount, gitFeaturesEnabled, isGitVault, repositories: gitRepositories, canAddRemote: config.canAddRemote ?? false, onAddRemote: config.onAddRemote, onCommitPush, onInitializeGit, onPull, onPullRepository, onResolveConflicts, onSelect, }), [ modifiedCount, gitFeaturesEnabled, isGitVault, gitRepositories, config.canAddRemote, config.onAddRemote, onCommitPush, onInitializeGit, onPull, onPullRepository, onResolveConflicts, onSelect, ]) const viewCommands = useMemo(() => buildViewCommands({ aiFeaturesEnabled, hasActiveNote, activeNoteModified, onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, noteWidth, defaultNoteWidth, onSetNoteWidth, onSetDefaultNoteWidth, onToggleAIChat, onToggleTableOfContents, zoomLevel, onZoomIn, onZoomOut, onZoomReset, onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel, selectedViewName, onMoveSelectedViewUp, onMoveSelectedViewDown, canMoveSelectedViewUp, canMoveSelectedViewDown, }), [ aiFeaturesEnabled, hasActiveNote, activeNoteModified, onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, noteWidth, defaultNoteWidth, onSetNoteWidth, onSetDefaultNoteWidth, onToggleAIChat, onToggleTableOfContents, zoomLevel, onZoomIn, onZoomOut, onZoomReset, onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel, selectedViewName, onMoveSelectedViewUp, onMoveSelectedViewDown, canMoveSelectedViewUp, canMoveSelectedViewDown, ]) const settingsCommands = useMemo(() => buildSettingsCommands({ mcpStatus, vaultCount, isGettingStartedHidden, onOpenSettings, onOpenFeedback, onOpenVault, onCreateEmptyVault, onRemoveActiveVault, onRestoreGettingStarted, onCheckForUpdates, onInstallMcp, onReloadVault, onRepairVault, locale, systemLocale, selectedUiLanguage, onSetUiLanguage, onSetThemeMode, }), [ mcpStatus, vaultCount, isGettingStartedHidden, onOpenSettings, onOpenFeedback, onOpenVault, onCreateEmptyVault, onRemoveActiveVault, onRestoreGettingStarted, onCheckForUpdates, onInstallMcp, onReloadVault, onRepairVault, locale, systemLocale, selectedUiLanguage, onSetUiLanguage, onSetThemeMode, ]) const aiCommands = useMemo(() => buildAiAgentCommands({ aiFeaturesEnabled, aiAgentsStatus, vaultAiGuidanceStatus, selectedAiAgent, selectedAiAgentLabel, onOpenAiAgents, onRestoreVaultAiGuidance, onSetDefaultAiAgent, onCycleDefaultAiAgent, }), [ aiFeaturesEnabled, aiAgentsStatus, vaultAiGuidanceStatus, selectedAiAgent, selectedAiAgentLabel, onOpenAiAgents, onRestoreVaultAiGuidance, onSetDefaultAiAgent, onCycleDefaultAiAgent, ]) const typeCommands = useMemo( () => buildTypeCommands(vaultTypes, onCreateNoteOfType, onSelect), [vaultTypes, onCreateNoteOfType, onSelect], ) const filterCommands = useMemo( () => buildFilterCommands({ isSectionGroup, noteListFilter, onSetNoteListFilter }), [isSectionGroup, noteListFilter, onSetNoteListFilter], ) const commands = useMemo(() => [ ...navigationCommands, ...noteCommands, ...gitCommands, ...viewCommands, ...settingsCommands, ...aiCommands, ...typeCommands, ...filterCommands, ], [ navigationCommands, noteCommands, gitCommands, viewCommands, settingsCommands, aiCommands, typeCommands, filterCommands, ]) return useMemo(() => localizeCommandActions(commands, locale), [commands, locale]) }