import { useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { api } from '../api' import { downloadJSON, pickJSONFile } from '../components' export default function Home() { const [adventures, setAdventures] = useState(null) const [search, setSearch] = useState('') const navigate = useNavigate() useEffect(() => { api.listAdventures().then(setAdventures).catch(() => setAdventures([])) }, []) const visible = useMemo(() => { if (!adventures) return null const q = search.trim().toLowerCase() if (!q) return adventures return adventures.filter((a) => `${a.title} ${a.scenario_title || ''}`.toLowerCase().includes(q)) }, [adventures, search]) const remove = async (e, id) => { e.stopPropagation() if (!confirm('Delete this adventure permanently?')) return await api.deleteAdventure(id) setAdventures(adventures.filter((a) => a.id !== id)) } const exportOne = async (e, adv) => { e.stopPropagation() const bundle = await api.exportAdventure(adv.id) const safe = adv.title.replace(/[^\w-]+/g, '_').slice(0, 60) || 'adventure' downloadJSON(bundle, `${safe}.json`) } const importOne = async () => { try { const bundle = await pickJSONFile() const adv = await api.importAdventure(bundle) navigate(`/play/${adv.id}`) } catch (err) { alert(err.message) } } return (
{adv.scenario_title ? `From “${adv.scenario_title}” · ` : ''} {adv.action_count} actions