"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useTheme } from "../ThemeProvider"; import { useFamily } from "../FamilyProvider"; interface Member { id: string; userId: string; role: string; displayName: string; name: string; email: string; } interface Invite { id: string; email: string; displayName: string; role: string; expiresAt: string; } export default function SettingsPage() { const router = useRouter(); const { theme, mode, setMode } = useTheme(); const { tier, memberCount, familyId } = useFamily(); const [themeOpen, setThemeOpen] = useState(false); const [inviteOpen, setInviteOpen] = useState(false); const [membersOpen, setMembersOpen] = useState(false); const [familyOpen, setFamilyOpen] = useState(false); const [members, setMembers] = useState([]); const [invites, setInvites] = useState([]); const [showAddInvite, setShowAddInvite] = useState(false); const [inviteEmail, setInviteEmail] = useState(""); const [inviteRole, setInviteRole] = useState("caregiver"); const [inviteLoading, setInviteLoading] = useState(false); const [familyName, setFamilyName] = useState(""); const [signingOut, setSigningOut] = useState(false); // Check if can invite more members const canInvite = tier === "pro" || memberCount < 2; const handleSignOut = async () => { if (!confirm("Are you sure you want to sign out?")) return; setSigningOut(true); try { await fetch("/api/auth/signout", { method: "POST" }); router.push("/login"); } catch (err) { console.error("Sign out failed:", err); } setSigningOut(false); }; const themeOptions = [ { value: "light", label: "Light" }, { value: "dark", label: "Dark" }, { value: "system", label: "System" }, { value: "time", label: "Time of Day" }, ] as const; useEffect(() => { fetchInvites(); fetchMembers(); }, [familyId]); const fetchMembers = async () => { if (!familyId) return; try { const res = await fetch(`/api/family/members?familyId=${familyId}`); const data = await res.json(); setMembers(data.members || []); } catch (err) { console.error("Failed to fetch members:", err); } }; const fetchInvites = async () => { if (!familyId) return; try { const res = await fetch(`/api/invites?familyId=${familyId}`); const data = await res.json(); setInvites(data.invites || []); } catch (err) { console.error("Failed to fetch invites:", err); } }; const sendInvite = async () => { if (!inviteEmail || !familyId) return; setInviteLoading(true); try { const res = await fetch("/api/invites", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ familyId: familyId, email: inviteEmail, role: inviteRole, displayName: inviteEmail.split("@")[0], }), }); const data = await res.json(); if (data.success) { setInviteEmail(""); fetchInvites(); } else { alert(data.error); } } catch (err) { console.error("Failed to send invite:", err); } setInviteLoading(false); }; return (

Settings

{/* Notifications */}
🔔
Notifications
{/* Profile */}
👤
Profile
{/* Family - Collapsible */}
{familyOpen && (
setFamilyName(e.target.value)} placeholder="Family name" className="w-full p-2 border rounded-lg text-sm" />
Plan: {tier} {tier === "free" && ( )}
)}
👨‍👩‍👧
Family
{/* Invite Members - Collapsible */}
{inviteOpen && (
{/* Pro upgrade prompt */} {tier === "free" && !canInvite && (

Upgrade to Pro for unlimited family members

)} {/* Pending invites */} {invites.length > 0 && (
Pending Invites
{invites.map((invite) => (
{invite.email} Pending
))}
)} {/* Add invite form */} {canInvite && (
setInviteEmail(e.target.value)} placeholder="Email address" className="w-full p-2 border rounded-lg text-sm" />
)}
)}
{/* Family Members - Collapsible */}
{membersOpen && (
{members.length > 0 ? (
{members.map((member) => (
{member.displayName || member.name}
{member.email}
{member.role}
))}
) : (

No members yet

)}
)}
{/* Theme - Collapsible */}
{themeOpen && (
{themeOptions.map((opt) => ( ))}
)}
{/* App Version */}
App Version
Tia v1.0.0
{/* Sign Out */}
); }