From 1932d2ae6b7e70e910bd5343d654c6c6cbcbea12 Mon Sep 17 00:00:00 2001 From: Mannu Date: Sun, 10 May 2026 23:37:54 +0530 Subject: [PATCH] Fix login flow to store and use real family_id --- src/app/FamilyProvider.tsx | 30 ++++++----- .../{ => admin/(login)}/admin-login/page.tsx | 0 src/app/api/auth/signin/route.ts | 51 +++++++++++++------ src/app/login/page.tsx | 17 ++++++- 4 files changed, 66 insertions(+), 32 deletions(-) rename src/app/{ => admin/(login)}/admin-login/page.tsx (100%) diff --git a/src/app/FamilyProvider.tsx b/src/app/FamilyProvider.tsx index 42c3b61..72d0ba0 100644 --- a/src/app/FamilyProvider.tsx +++ b/src/app/FamilyProvider.tsx @@ -46,7 +46,11 @@ export function FamilyProvider({ children: providerChildren }: { children: React useEffect(() => { async function fetchFamilyData() { try { - const res = await fetch("/api/children?familyId=default"); + // Get family_id from localStorage (set during login) + const storedFamilyId = localStorage.getItem("family_id"); + const familyIdToUse = storedFamilyId || "default"; + + const res = await fetch(`/api/children?familyId=${familyIdToUse}`); const data = await res.json(); if (data.children?.length > 0) { @@ -62,9 +66,16 @@ export function FamilyProvider({ children: providerChildren }: { children: React setChildId(childList[0].id); } - setFamilyId("default"); - setTier("free"); - setMemberCount(2); + setFamilyId(familyIdToUse); + + // Get tier and limits from family + const familyRes = await fetch(`/api/family?familyId=${familyIdToUse}`); + const familyData = await familyRes.json(); + + if (familyData.family) { + setTier(familyData.family.tier || "free"); + setMemberCount(familyData.family.max_members || 2); + } } catch (err) { console.error("Failed to fetch family:", err); } finally { @@ -94,13 +105,4 @@ export function FamilyProvider({ children: providerChildren }: { children: React {providerChildren} ); -} - -// Note: Call useFamily() in any page to get: -// - familyId: The current family ID -// - childId: The selected child ID -// - child: The selected child object -// - children: List of all children -// - loading: Whether data is loading -// - tier: "free" or "pro" -// - memberCount: Number of family members \ No newline at end of file +} \ No newline at end of file diff --git a/src/app/admin-login/page.tsx b/src/app/admin/(login)/admin-login/page.tsx similarity index 100% rename from src/app/admin-login/page.tsx rename to src/app/admin/(login)/admin-login/page.tsx diff --git a/src/app/api/auth/signin/route.ts b/src/app/api/auth/signin/route.ts index 71abf7e..f20d40f 100644 --- a/src/app/api/auth/signin/route.ts +++ b/src/app/api/auth/signin/route.ts @@ -1,7 +1,5 @@ import { NextResponse } from "next/server"; -import { db } from "@/db"; -import { users } from "@/db/schema/auth"; -import { eq } from "drizzle-orm"; +import { sql } from "@/db"; export async function POST(request: Request) { const { email } = await request.json(); @@ -11,23 +9,44 @@ export async function POST(request: Request) { } try { - // Find or create user - let user = await db.query.users.findFirst({ - where: eq(users.email, email), - }); + // Find user + const users = await sql` + SELECT u.id, u.email, fm.family_id as family_id + FROM users u + LEFT JOIN family_members fm ON fm.user_id = u.id + WHERE u.email = ${email} + LIMIT 1 + `; - if (!user) { - const [newUser] = await db - .insert(users) - .values({ email }) - .returning(); - user = newUser; + if (!users || users.length === 0) { + return NextResponse.json({ error: "User not found" }, { status: 404 }); } - // For demo, just return success - in real app, send magic link via email - return NextResponse.json({ success: true, userId: user.id }); + const user = users[0]; + const familyId = user.family_id; + + // Get family info + let family = null; + if (familyId) { + const families = await sql` + SELECT id, name, tier, max_children, max_members + FROM families WHERE id = ${familyId} + `; + if (families.length > 0) { + family = families[0]; + } + } + + // Return user and family info + return NextResponse.json({ + success: true, + userId: user.id, + email: user.email, + familyId: familyId, + family: family, + }); } catch (error) { - console.error(error); + console.error("Signin error:", error); return NextResponse.json({ error: String(error) }, { status: 500 }); } } \ No newline at end of file diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index d516b29..962f78a 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -19,8 +19,21 @@ export default function LoginPage() { body: JSON.stringify({ email }), }); - if (res.ok) { + const data = await res.json(); + + if (data.success) { + // Store user and family info + localStorage.setItem("user_id", data.userId); + localStorage.setItem("user_email", data.email); + if (data.familyId) { + localStorage.setItem("family_id", data.familyId); + } + if (data.family) { + localStorage.setItem("family", JSON.stringify(data.family)); + } router.push("/"); + } else { + alert(data.error || "Sign in failed"); } } catch (err) { console.error(err); @@ -55,4 +68,4 @@ export default function LoginPage() { ); -} +} \ No newline at end of file