import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import type { AiSession } from '@shared/types' import { ipcCall } from '@renderer/lib/ipc-client' import { useAiStore } from '@renderer/stores/useAiStore' interface AiSessionMenuProps { bookId: string session: AiSession | null } export function AiSessionMenu({ bookId, session }: AiSessionMenuProps): React.JSX.Element | null { const { t } = useTranslation() const loadSessions = useAiStore((s) => s.loadSessions) const selectSession = useAiStore((s) => s.selectSession) const [open, setOpen] = useState(false) const [exportOpen, setExportOpen] = useState(false) useEffect(() => { if (!open) return const close = (): void => { setOpen(false) setExportOpen(false) } window.addEventListener('click', close) return () => window.removeEventListener('click', close) }, [open]) if (!session) return null const handleRename = async (): Promise => { setOpen(false) const title = window.prompt(t('ai.session.renamePrompt'), session.title) if (!title?.trim() || title.trim() === session.title) return await ipcCall(() => window.electronAPI.ai.sessionUpdate(bookId, session.id, { title: title.trim() }) ) await loadSessions(bookId, true) } const handleArchiveToggle = async (): Promise => { setOpen(false) await ipcCall(() => window.electronAPI.ai.sessionUpdate(bookId, session.id, { archived: !session.archived }) ) await loadSessions(bookId, true) } const handleExport = async (format: 'markdown' | 'txt'): Promise => { setOpen(false) setExportOpen(false) await ipcCall(() => window.electronAPI.ai.sessionExport(bookId, session.id, format)) } const handleDelete = async (): Promise => { setOpen(false) if (!window.confirm(t('ai.session.deleteConfirm', { title: session.title || t('ai.untitledSession') }))) { return } await ipcCall(() => window.electronAPI.ai.sessionDelete(bookId, session.id)) await loadSessions(bookId, true) const next = useAiStore.getState().sessions[0] if (next) await selectSession(next.id) } return (
{open && (
e.stopPropagation()}> {exportOpen && (
)}
)}
) }