import { Archive, BarChart3, Plus, Trash2, X } from 'lucide-react' import { type FormEvent, useState } from 'react' import { Link } from 'react-router-dom' import { Checkbox } from '../../components/ui/Checkbox' import { Switch } from '../../components/ui/Switch' import { cn } from '../../lib/utils' import { useCreateTopic, useDeleteTopic, useUpdateTopic } from '../../hooks/useAdmin' import { useTopics } from '../../hooks/useTopics' const RETENTION_OPTIONS = [ { label: '7 days', value: 7 }, { label: '30 days', value: 30 }, { label: '90 days', value: 90 }, { label: '365 days', value: 365 }, { label: 'Forever', value: 0 }, ] export function TopicsAdminPage() { const { data: topics } = useTopics() const createTopic = useCreateTopic() const updateTopic = useUpdateTopic() const deleteTopic = useDeleteTopic() const [slug, setSlug] = useState('') const [displayName, setDisplayName] = useState('') const [formError, setFormError] = useState(null) const [selected, setSelected] = useState>(new Set()) const handleCreate = (e: FormEvent) => { e.preventDefault() setFormError(null) createTopic.mutate( { slug, displayName }, { onSuccess: () => { setSlug('') setDisplayName('') }, onError: (err) => setFormError(err instanceof Error ? err.message : 'Failed to create topic'), }, ) } const toggleSelected = (id: string) => { setSelected((prev) => { const next = new Set(prev) if (next.has(id)) next.delete(id) else next.add(id) return next }) } const handleBulkRetention = (days: number) => { selected.forEach((id) => updateTopic.mutate({ id, changes: { retentionDays: days } })) setSelected(new Set()) } const handleBulkArchive = () => { if (!window.confirm(`Archive ${selected.size} topic${selected.size === 1 ? '' : 's'}?`)) return selected.forEach((id) => updateTopic.mutate({ id, changes: { archived: true } })) setSelected(new Set()) } return (
setSlug(e.target.value)} placeholder="homeassistant" className="w-full rounded-lg border border-base-border bg-base-raised px-3 py-2 text-sm text-slate-100 placeholder:text-slate-600 focus:border-accent focus:outline-none" />
setDisplayName(e.target.value)} placeholder="Home Assistant" className="w-full rounded-lg border border-base-border bg-base-raised px-3 py-2 text-sm text-slate-100 placeholder:text-slate-600 focus:border-accent focus:outline-none" />
{formError &&

{formError}

}
{selected.size > 0 && (
{selected.size} selected
)}
{topics?.map((topic) => { const isSelected = selected.has(topic.id) return (
toggleSelected(topic.id)} label={`Select ${topic.displayName}`} />

{topic.displayName}

{topic.slug} · {topic.totalCount.toLocaleString()} total

Stats
) })}
) }