/** Entry detail: snippet, meta, result (auto-open if pending), remedy, save. */ import { ChevronRight } from "lucide-preact"; import { useEffect, useState } from "preact/hooks"; import { coachEntry, deleteEntry, getEntry, updateEntry, type CoachResponse, type Entry, } from "../api"; import { Button } from "../components/Button"; import { CoachResultCard } from "../components/CoachResult"; import { ResultChips } from "../components/ResultChips"; import { Sheet } from "../components/Sheet"; import { usePendingResolve } from "../components/PendingResolve"; import { useToast } from "../components/Toast"; import { navigate } from "../router"; export function EntryDetail({ id }: { id: string }) { const toast = useToast(); const { openResolveId, refreshPendingSignal } = usePendingResolve(); const [entry, setEntry] = useState(null); const [draft, setDraft] = useState(null); const [confirming, setConfirming] = useState(false); const [coach, setCoach] = useState(null); const [busy, setBusy] = useState(false); useEffect(() => { let cancelled = false; getEntry(id) .then((data) => { if (cancelled) return; setEntry(data); setDraft(data); if (data.result === "pending") { openResolveId(data.id, data); } }) .catch((e) => { if (!cancelled) toast.show(e.message, "error"); }); return () => { cancelled = true; }; }, [id]); useEffect(() => { if (!refreshPendingSignal) return; getEntry(id) .then((data) => { setEntry(data); setDraft(data); }) .catch(() => {}); }, [refreshPendingSignal, id]); if (!entry || !draft) return
Loading…
; const save = async () => { setBusy(true); try { const updated = await updateEntry(id, { activity: draft.activity, happened: draft.happened, emotions: draft.emotions, intensity: draft.intensity, remedy: draft.remedy, result: draft.result, tags: draft.tags, notes: draft.notes, }); setEntry(updated); setDraft(updated); toast.show("Saved"); } catch (e) { toast.show(e instanceof Error ? e.message : "Update failed", "error"); } finally { setBusy(false); } }; return (

Entry

{draft.happened}

Date {new Date(entry.ts).toLocaleString()}
Activity {draft.activity || "—"}
Emotions {draft.emotions.join(", ") || "—"}
Intensity {draft.intensity}/10
Tags {draft.tags.join(", ") || "—"}
Result {entry.result === "pending" ? ( openResolveId(entry.id, entry)} /> ) : null}
setDraft({ ...draft, result })} /> setDraft({ ...draft, remedy: (e.target as HTMLInputElement).value }) } />
{coach ? : null}
setConfirming(false)}>

This permanently deletes this entry.

); } function PressableFinish({ onClick }: { onClick: () => void }) { return ( ); }