diff --git a/app/api/households/[id]/privacy/route.ts b/app/api/households/[id]/privacy/route.ts new file mode 100644 index 0000000..133238e --- /dev/null +++ b/app/api/households/[id]/privacy/route.ts @@ -0,0 +1,9 @@ +import { NextRequest } from "next/server"; +import { proxyRequest } from "@/lib/backend"; + +export async function PATCH( + req: NextRequest, + { params }: { params: { id: string } } +) { + return proxyRequest(req, `households/${params.id}/privacy`); +} diff --git a/app/settings/households/page.tsx b/app/settings/households/page.tsx index 08a8cbe..1e56c2c 100644 --- a/app/settings/households/page.tsx +++ b/app/settings/households/page.tsx @@ -109,6 +109,11 @@ type HouseholdGoal = { type DashboardData = { household: Household; members: HouseholdMember[]; + privacyMode: { + enabled: boolean; + hideIndividualBalances: boolean; + hideIndividualTransactions: boolean; + }; summary: { memberCount: number; accountCount: number; @@ -207,6 +212,7 @@ export default function HouseholdSettingsPage() { }); const [fairSplitResult, setFairSplitResult] = useState(null); const [fairSplitStatus, setFairSplitStatus] = useState(""); + const [privacyStatus, setPrivacyStatus] = useState(""); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [status, setStatus] = useState(""); @@ -428,6 +434,25 @@ export default function HouseholdSettingsPage() { await loadInvites(selectedId); }; + const updatePrivacyMode = async (enabled: boolean) => { + if (!selectedId) return; + setPrivacyStatus("Updating privacy mode..."); + const res = await apiFetch<{ privacyMode: DashboardData["privacyMode"] }>(`/api/households/${selectedId}/privacy`, { + method: "PATCH", + body: JSON.stringify({ + enabled, + hideIndividualBalances: true, + hideIndividualTransactions: true, + }), + }); + if (res.error) { + setPrivacyStatus(res.error.message ?? "Unable to update privacy mode."); + return; + } + setPrivacyStatus(enabled ? "Privacy mode enabled." : "Privacy mode disabled."); + await loadDashboard(selectedId); + }; + const maxCashflow = Math.max( 1, ...(dashboard?.cashflow ?? []).map((month) => Math.max(month.income, month.expenses)), @@ -564,6 +589,42 @@ export default function HouseholdSettingsPage() { +
+
+
+

Financial independence

+

Privacy mode

+

+ When enabled, the shared dashboard only shows joint household accounts and joint transactions. Individual mine/theirs balances and activity stay out of the shared view. +

+ {privacyStatus ?

{privacyStatus}

: null} +
+ +
+ {dashboard.privacyMode.enabled ? ( +
+
+

Individual balances hidden

+

Mine/theirs account balances are excluded from cards and ownership totals.

+
+
+

Individual transactions hidden

+

Recent transactions and cashflow use joint account activity only.

+
+
+ ) : null} +
+