import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useBookStore } from '@renderer/stores/useBookStore' import { useReferenceStore } from '@renderer/stores/useReferenceStore' import { useEditStore } from '@renderer/stores/useEditStore' type RefItem = { id: string kind: 'setting' | 'outline' | 'inspiration' title: string preview: string } export function ReferencePanel(): React.JSX.Element { const { t } = useTranslation() const open = useReferenceStore((s) => s.open) const pinned = useReferenceStore((s) => s.pinned) const tab = useReferenceStore((s) => s.tab) const query = useReferenceStore((s) => s.query) const setTab = useReferenceStore((s) => s.setTab) const setQuery = useReferenceStore((s) => s.setQuery) const setOpen = useReferenceStore((s) => s.setOpen) const setPinned = useReferenceStore((s) => s.setPinned) const switchTarget = useEditStore((s) => s.switchTarget) const outlines = useBookStore((s) => s.outlines) const settings = useBookStore((s) => s.settings) const inspirations = useBookStore((s) => s.inspirations) const [detailItem, setDetailItem] = useState(null) const items = useMemo(() => { const q = query.trim().toLowerCase() const match = (title: string, body: string) => !q || title.toLowerCase().includes(q) || body.toLowerCase().includes(q) if (tab === 'setting') { return settings .filter((s) => match(s.name, s.description)) .map((s) => ({ id: s.id, kind: 'setting' as const, title: s.name, preview: s.description })) } if (tab === 'outline') { return outlines .filter((o) => match(o.title, o.description)) .map((o) => ({ id: o.id, kind: 'outline' as const, title: o.title, preview: o.description })) } return inspirations .filter((i) => match(i.title, i.content)) .map((i) => ({ id: i.id, kind: 'inspiration' as const, title: i.title, preview: i.content })) }, [tab, query, settings, outlines, inspirations]) if (!open) return
return (
{t('reference.title')}
setQuery(e.target.value)} />
{(['setting', 'outline', 'inspiration'] as const).map((id) => ( ))}
{items.map((item) => (
{ const plain = item.preview.replace(/<[^>]+>/g, '').slice(0, 200) e.dataTransfer.setData('text/plain', plain) }} onClick={() => setDetailItem(item)} onDoubleClick={() => void switchTarget({ kind: item.kind, id: item.id })} role="button" tabIndex={0} data-testid={`ref-item-${item.id}`} >
{item.title}
{item.preview.replace(/<[^>]+>/g, '').slice(0, 40)}
))}
{detailItem && (
{detailItem.title}
{detailItem.preview.replace(/<[^>]+>/g, '')}
)}
) }