Fix login flow to store and use real family_id

This commit is contained in:
Manohar Gupta 2026-05-10 23:37:54 +05:30
parent 1d4acd9c2a
commit 1932d2ae6b
4 changed files with 66 additions and 32 deletions

View file

@ -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 {
@ -95,12 +106,3 @@ export function FamilyProvider({ children: providerChildren }: { children: React
</FamilyContext.Provider>
);
}
// 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

View file

@ -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 });
}
}

View file

@ -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);