diff --git a/app/api/households/[id]/money-date-prompts/route.ts b/app/api/households/[id]/money-date-prompts/route.ts new file mode 100644 index 0000000..54a408f --- /dev/null +++ b/app/api/households/[id]/money-date-prompts/route.ts @@ -0,0 +1,9 @@ +import { NextRequest } from "next/server"; +import { proxyRequest } from "@/lib/backend"; + +export async function GET( + req: NextRequest, + { params }: { params: { id: string } } +) { + return proxyRequest(req, `households/${params.id}/money-date-prompts`); +} diff --git a/app/settings/households/page.tsx b/app/settings/households/page.tsx index 1e56c2c..6b2a4c4 100644 --- a/app/settings/households/page.tsx +++ b/app/settings/households/page.tsx @@ -155,6 +155,22 @@ type FairSplitResult = { rationale: string; }; +type MoneyDatePrompt = { + id: string; + topic: string; + question: string; + why: string; + actionLabel: string; + priority: "high" | "medium" | "low"; +}; + +type MoneyDatePromptResponse = { + householdId: string; + generatedAt: string; + cadenceSuggestion: "weekly" | "monthly" | string; + prompts: MoneyDatePrompt[]; +}; + const money = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", @@ -213,6 +229,8 @@ export default function HouseholdSettingsPage() { const [fairSplitResult, setFairSplitResult] = useState(null); const [fairSplitStatus, setFairSplitStatus] = useState(""); const [privacyStatus, setPrivacyStatus] = useState(""); + const [moneyDatePrompts, setMoneyDatePrompts] = useState(null); + const [moneyDateStatus, setMoneyDateStatus] = useState(""); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [status, setStatus] = useState(""); @@ -231,11 +249,13 @@ export default function HouseholdSettingsPage() { setDashboard(null); setGoals([]); setInvites([]); + setMoneyDatePrompts(null); return; } loadDashboard(selectedId); loadGoals(selectedId); loadInvites(selectedId); + loadMoneyDatePrompts(selectedId); }, [selectedId]); const loadHouseholds = async () => { @@ -282,6 +302,18 @@ export default function HouseholdSettingsPage() { setInvites(res.data ?? []); }; + const loadMoneyDatePrompts = async (id: string) => { + setMoneyDateStatus("Loading prompts..."); + const res = await apiFetch(`/api/households/${id}/money-date-prompts`); + if (res.error) { + setMoneyDatePrompts(null); + setMoneyDateStatus(res.error.message ?? "Unable to load money date prompts."); + return; + } + setMoneyDatePrompts(res.data ?? null); + setMoneyDateStatus(""); + }; + const createHousehold = async (event: FormEvent) => { event.preventDefault(); const name = newName.trim(); @@ -451,6 +483,7 @@ export default function HouseholdSettingsPage() { } setPrivacyStatus(enabled ? "Privacy mode enabled." : "Privacy mode disabled."); await loadDashboard(selectedId); + await loadMoneyDatePrompts(selectedId); }; const maxCashflow = Math.max( @@ -479,7 +512,11 @@ export default function HouseholdSettingsPage() { + + {moneyDateStatus ?

{moneyDateStatus}

: null} +
+ {(moneyDatePrompts?.prompts ?? []).map((prompt) => ( +
+
+

{prompt.topic}

+ + {prompt.priority} + +
+

{prompt.question}

+

{prompt.why}

+

{prompt.actionLabel}

+
+ ))} + {!moneyDateStatus && !moneyDatePrompts?.prompts.length ? ( +

No prompts generated yet.

+ ) : null} +
+ +