"use client"; import { useState, useEffect } from "react"; import { AppShell } from "@/components/AppShell"; import { WeeklyReflection } from "@/components/WeeklyReflection"; import { FilterPanel } from "@/components/FilterPanel"; import { EntryRow } from "@/components/EntryRow"; import { Loader2 } from "lucide-react"; import type { EntryWithTags, FilterState } from "@/lib/types"; import { APP_NAME } from "@/lib/constants"; export default function TimelinePage() { const [entries, setEntries] = useState([]); const [filteredEntries, setFilteredEntries] = useState([]); const [isLoading, setIsLoading] = useState(true); const [filters, setFilters] = useState({ moods: [], tagId: null, roughDay: null, }); useEffect(() => { async function loadEntries() { try { const res = await fetch("/api/entries"); if (res.ok) { setEntries(await res.json()); } } catch (error) { console.error("Failed to load entries:", error); } finally { setIsLoading(false); } } loadEntries(); }, []); // Apply filters client-side useEffect(() => { let result = entries; if (filters.moods.length > 0) { result = result.filter((e) => e.mood && filters.moods.includes(e.mood)); } if (filters.tagId) { result = result.filter((e) => e.tags.some((t) => t.id === filters.tagId)); } if (filters.roughDay === true) { result = result.filter((e) => e.roughDay); } else if (filters.roughDay === false) { result = result.filter((e) => !e.roughDay); } setFilteredEntries(result); }, [entries, filters]); return (

{APP_NAME}

Timeline

{isLoading ? (
) : ( <> {filteredEntries.length === 0 ? (
{entries.length === 0 ? (

No entries yet. Start your first check-in!

) : (

No entries match your filters.

)}
) : (
{filteredEntries.map((entry) => ( ))}
)} )}
); }