import { useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Plus, Trash2, X } from 'lucide-react' import { shedTemplates, siloTemplates } from '../../data/createData' import { createDocument, getDefaultShedContent, getDefaultTitle, listDocuments, type DocumentRecord, } from '../../lib/documents' import { getStoredUser } from '../../lib/api' import { templatesApi, type ApiTemplate } from '../../lib/api' interface TemplatesFlyoutProps { sidebarCollapsed: boolean onClose: () => void } export default function TemplatesFlyout({ sidebarCollapsed, onClose }: TemplatesFlyoutProps) { const navigate = useNavigate() const author = getStoredUser()?.full_name ?? 'You' const [customTemplates, setCustomTemplates] = useState([]) const [category, setCategory] = useState('All') const [showCreate, setShowCreate] = useState(false) const [name, setName] = useState('') const [description, setDescription] = useState('') const [templateCategory, setTemplateCategory] = useState('General') const [emoji, setEmoji] = useState('📄') const [bodyHtml, setBodyHtml] = useState('') const [error, setError] = useState(null) const [placement, setPlacement] = useState('top') const [placements, setPlacements] = useState([]) const [shareTemplateId, setShareTemplateId] = useState(null) const [shareIdentifier, setShareIdentifier] = useState('') useEffect(() => { void templatesApi.list().then(setCustomTemplates).catch(() => setError('Could not load your templates.')) void listDocuments().then((documents) => setPlacements(documents.filter((document) => document.type === 'stead' || document.type === 'silo'))) }, []) const categories = useMemo( () => ['All', ...Array.from(new Set(customTemplates.map((template) => template.category)))], [customTemplates], ) const visibleTemplates = category === 'All' ? customTemplates : customTemplates.filter((template) => template.category === category) async function createShed(templateId: (typeof shedTemplates)[number]['id']) { if (templateId === 'templates') return const doc = await createDocument( 'shed', getDefaultTitle('shed', templateId), getDefaultShedContent(templateId), templateId, author, ) onClose() navigate(`/workspace/shed/${doc.id}`) } async function createSilo(html: string, label: string) { const doc = await createDocument( 'silo', `${label} — ${new Date().toLocaleDateString()}`, { body: '', bodyHtml: html, status: 'draft' }, undefined, author, ) onClose() navigate(`/workspace/silo/${doc.id}`) } async function createCustomTemplate(template: ApiTemplate) { const doc = await createDocument( 'silo', template.name, { ...template.content, status: 'draft' }, undefined, author, placement.startsWith('space:') ? placement.slice(6) : undefined, placement.startsWith('page:') ? placement.slice(5) : undefined, ) onClose() navigate(`/workspace/silo/${doc.id}`) } async function shareTemplate(templateId: string) { if (!shareIdentifier.trim()) return try { const updated = await templatesApi.share(templateId, shareIdentifier.trim()) setCustomTemplates((current) => current.map((template) => template.id === updated.id ? updated : template)) setShareTemplateId(null) setShareIdentifier('') } catch (err) { setError(err instanceof Error ? err.message : 'Could not share template.') } } async function saveTemplate(event: React.FormEvent) { event.preventDefault() if (!name.trim()) return try { const template = await templatesApi.create({ name: name.trim(), description: description.trim(), category: templateCategory.trim() || 'General', emoji: emoji || '📄', content: { body: '', bodyHtml, status: 'draft' }, }) setCustomTemplates((current) => [template, ...current]) setName('') setDescription('') setBodyHtml('') setShowCreate(false) } catch (err) { setError(err instanceof Error ? err.message : 'Could not save template.') } } async function removeTemplate(id: string) { try { await templatesApi.delete(id) setCustomTemplates((current) => current.filter((template) => template.id !== id)) } catch (err) { setError(err instanceof Error ? err.message : 'Could not delete template.') } } return ( <>