import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useBookStore } from '@renderer/stores/useBookStore' import { useKnowledgeStore } from '@renderer/stores/useKnowledgeStore' import { ipcCall } from '@renderer/lib/ipc-client' import { NamingCheckModal } from '@renderer/components/ai/NamingCheckModal' import { KnowledgeEditorDialog, loadKnowledgeEntries } from '@renderer/components/knowledge/KnowledgeEditorDialog' export function KnowledgePanel(): React.JSX.Element { const { t } = useTranslation() const bookId = useBookStore((s) => s.currentBookId) const { entries, stats, tab, forgottenOnly, editorOpen, editingId, setTab, openEditor, closeEditor, approve, reject, deleteEntry, batchApprove } = useKnowledgeStore() const [namingOpen, setNamingOpen] = useState(false) const [selected, setSelected] = useState>(new Set()) const [pendingCount, setPendingCount] = useState(0) useEffect(() => { if (!bookId) return void loadKnowledgeEntries(bookId, tab, forgottenOnly).then(({ entries, stats }) => { useKnowledgeStore.setState({ entries, stats }) }) }, [bookId, tab, forgottenOnly]) useEffect(() => { if (!bookId) return void ipcCall(() => window.electronAPI.knowledge.list(bookId, { status: 'pending' })).then( (list) => setPendingCount(list.length) ) }, [bookId, entries]) const handleBatchApprove = async (): Promise => { if (!bookId || selected.size === 0) return await batchApprove(bookId, [...selected]) setSelected(new Set()) } return ( <>
{tab === 'foreshadow' && (
{t('knowledge.statsSummary', { buried: stats.buried, resolved: stats.resolved, forgotten: stats.forgotten })}
)} {tab === 'pending' && selected.size > 0 && ( )}
{entries.map((entry) => (
{tab === 'pending' && ( { const next = new Set(selected) if (e.target.checked) next.add(entry.id) else next.delete(entry.id) setSelected(next) }} /> )}
{entry.title}
{t(`knowledge.type.${entry.type}`)} ยท {t(`knowledge.status.${entry.status}`)}
{entry.content &&
{entry.content}
}
{entry.status === 'pending' && bookId && ( <> )} {bookId && ( )}
))} {entries.length === 0 && (
{t('knowledge.empty')}
)}
setNamingOpen(false)} /> ) }