import { useEffect } from 'react' import type { useCreateBlockNote } from '@blocknote/react' import { DEFAULT_AI_AGENT, type AiAgentId, type AiAgentReadiness } from '../lib/aiAgents' import type { AiTarget } from '../lib/aiTargets' import type { AppLocale } from '../lib/i18n' import type { VaultEntry, GitCommit, WorkspaceIdentity } from '../types' import type { NoteListItem } from '../utils/ai-context' import { Inspector, type FrontmatterValue } from './Inspector' import type { FrontmatterOpOptions } from '../hooks/frontmatterOps' import { AiPanelView } from './AiPanel' import { useAiPanelController } from './useAiPanelController' import { NEW_AI_CHAT_EVENT } from '../utils/aiPromptBridge' import { TableOfContentsPanel } from './TableOfContentsPanel' interface EditorRightPanelProps { showAIChat?: boolean showTableOfContents?: boolean inspectorCollapsed: boolean inspectorWidth: number editor: ReturnType defaultAiAgent?: AiAgentId defaultAiTarget?: AiTarget defaultAiAgentReadiness?: AiAgentReadiness defaultAiAgentReady?: boolean onUnsupportedAiPaste?: (message: string) => void inspectorEntry: VaultEntry | null inspectorContent: string | null entries: VaultEntry[] gitHistory: GitCommit[] vaultPath: string vaultPaths?: string[] noteList?: NoteListItem[] noteListFilter?: { type: string | null; query: string } onToggleInspector: () => void onToggleAIChat?: () => void onToggleTableOfContents?: () => void onNavigateWikilink: (target: string) => void onViewCommitDiff: (commitHash: string) => Promise onUpdateFrontmatter?: (path: string, key: string, value: FrontmatterValue, options?: FrontmatterOpOptions) => Promise onDeleteProperty?: (path: string, key: string, options?: FrontmatterOpOptions) => Promise onAddProperty?: (path: string, key: string, value: FrontmatterValue, options?: FrontmatterOpOptions) => Promise onCreateMissingType?: (path: string, missingType: string, nextTypeName: string) => Promise onCreateAndOpenNote?: (title: string) => Promise onChangeWorkspace?: (entry: VaultEntry, workspace: WorkspaceIdentity) => Promise | void onInitializeProperties?: (path: string) => void onToggleRawEditor?: () => void onOpenNote?: (path: string) => void onFileCreated?: (relativePath: string) => void onFileModified?: (relativePath: string) => void onVaultChanged?: () => void workspaces?: WorkspaceIdentity[] locale?: AppLocale } type AiPanelSectionProps = Pick< EditorRightPanelProps, | 'defaultAiAgent' | 'defaultAiAgentReadiness' | 'defaultAiAgentReady' | 'defaultAiTarget' | 'entries' | 'inspectorEntry' | 'inspectorWidth' | 'locale' | 'noteList' | 'noteListFilter' | 'onFileCreated' | 'onFileModified' | 'onOpenNote' | 'onToggleAIChat' | 'onUnsupportedAiPaste' | 'onVaultChanged' | 'vaultPath' | 'vaultPaths' > & { activeNoteContent: string | null } function AiPanelSection({ activeNoteContent, defaultAiAgent = DEFAULT_AI_AGENT, defaultAiAgentReadiness, defaultAiAgentReady = true, defaultAiTarget, entries, inspectorEntry, inspectorWidth, locale, noteList, noteListFilter, onFileCreated, onFileModified, onOpenNote, onToggleAIChat, onUnsupportedAiPaste, onVaultChanged, vaultPath, vaultPaths, }: AiPanelSectionProps) { const aiPanelController = useAiPanelController({ vaultPath, vaultPaths, defaultAiAgent, defaultAiTarget, defaultAiAgentReady, defaultAiAgentReadiness, activeEntry: inspectorEntry, activeNoteContent, entries, noteList, noteListFilter, locale, onOpenNote, onFileCreated, onFileModified, onVaultChanged, }) const { handleNewChat } = aiPanelController useEffect(() => { const handleRequestedNewChat = () => { handleNewChat() } window.addEventListener(NEW_AI_CHAT_EVENT, handleRequestedNewChat) return () => window.removeEventListener(NEW_AI_CHAT_EVENT, handleRequestedNewChat) }, [handleNewChat]) return (
onToggleAIChat?.()} onOpenNote={onOpenNote} onUnsupportedAiPaste={onUnsupportedAiPaste} defaultAiAgent={defaultAiAgent} defaultAiTarget={defaultAiTarget} defaultAiAgentReadiness={defaultAiAgentReadiness} defaultAiAgentReady={defaultAiAgentReady} locale={locale} activeEntry={inspectorEntry} entries={entries} />
) } export function EditorRightPanel({ showAIChat, showTableOfContents, inspectorCollapsed, inspectorWidth, editor, defaultAiAgent = DEFAULT_AI_AGENT, defaultAiTarget, defaultAiAgentReadiness, defaultAiAgentReady = true, onUnsupportedAiPaste, inspectorEntry, inspectorContent, entries, gitHistory, vaultPath, vaultPaths, noteList, noteListFilter, onToggleInspector, onToggleAIChat, onToggleTableOfContents, onNavigateWikilink, onViewCommitDiff, onUpdateFrontmatter, onDeleteProperty, onAddProperty, onCreateMissingType, onCreateAndOpenNote, onChangeWorkspace, onInitializeProperties, onToggleRawEditor, onOpenNote, onFileCreated, onFileModified, onVaultChanged, workspaces, locale, }: EditorRightPanelProps) { if (!inspectorCollapsed) { return (
) } if (showTableOfContents) { return (
onToggleTableOfContents?.()} sourceContent={inspectorContent} />
) } if (showAIChat) { return } return null }