"use client"; import { useEffect, useState } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { MoreHorizontal, Pencil, Trash2, Flame } from "lucide-react"; import { toast } from "sonner"; interface Habit { id: string; name: string; description?: string; domain: string; frequency?: string; difficulty?: string; streak?: number; } interface Domain { id: string; name: string; color: string; } export function HabitCard() { const [habits, setHabits] = useState([]); const [domainMap, setDomainMap] = useState>(new Map()); const [domains, setDomains] = useState([]); const [loading, setLoading] = useState(true); const [deleteId, setDeleteId] = useState(null); const [deleting, setDeleting] = useState(false); const [editing, setEditing] = useState(null); const [editName, setEditName] = useState(""); const [editDescription, setEditDescription] = useState(""); const [editDomain, setEditDomain] = useState(""); const [editFrequency, setEditFrequency] = useState("daily"); const [editDifficulty, setEditDifficulty] = useState("medium"); const [saving, setSaving] = useState(false); useEffect(() => { fetchHabits(); fetchDomains(); }, []); useEffect(() => { if (editing) { setEditName(editing.name); setEditDescription(editing.description || ""); setEditDomain(editing.domain); setEditFrequency(editing.frequency || "daily"); setEditDifficulty(editing.difficulty || "medium"); } }, [editing]); async function fetchHabits() { try { const res = await fetch("/api/habits?sort=-created"); const data = await res.json(); setHabits(data.items || []); } catch { toast.error("Unable to load habits"); } finally { setLoading(false); } } async function fetchDomains() { try { const res = await fetch("/api/domains?sort=sort_order"); const data = await res.json(); const items = data.items || []; const map = new Map(); for (const d of items) map.set(d.id, d.name); setDomainMap(map); setDomains(items); } catch {} } async function handleDelete(id: string) { setDeleting(true); try { const res = await fetch("/api/habits/" + id, { method: "DELETE" }); if (!res.ok) throw new Error(); toast.success("Habit deleted"); setHabits((h) => h.filter((x) => x.id !== id)); } catch { toast.error("Unable to delete habit"); } finally { setDeleting(false); setDeleteId(null); } } async function handleSave() { if (!editing || !editName.trim()) return; setSaving(true); try { const res = await fetch("/api/habits/" + editing.id, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: editName.trim(), description: editDescription || undefined, domain: editDomain, frequency: editFrequency, difficulty: editDifficulty, }), }); if (!res.ok) throw new Error(); toast.success("Habit updated"); setEditing(null); await fetchHabits(); } catch { toast.error("Unable to update habit"); } finally { setSaving(false); } } if (loading) return

Loading habits...

; return ( <> {habits.length === 0 ? (

No habits yet. Create your first habit to get started!

) : (
{habits.map((habit) => (
{habit.name} {habit.streak && habit.streak > 0 && ( {habit.streak} )}
{domainMap.get(habit.domain) || habit.domain} {habit.frequency && {habit.frequency}} {habit.difficulty && {habit.difficulty}}
setEditing(habit)}> Edit setDeleteId(habit.id)}> Delete
))}
)} {/* Edit Habit Dialog */} !o && setEditing(null)}> Edit habit Update your habit details.
setEditName(e.target.value)} autoFocus required />