// apps/mobile/lib/auth-context.tsx // Supabase 세션 Context + 로그인 시 Expo Push 토큰 자동 등록 import { createContext, useContext, useEffect, useState, type ReactNode } from 'react' import type { Session, User } from '@supabase/supabase-js' import { supabase } from './supabase' import { registerPushToken } from './push' interface AuthContextValue { session: Session | null user: User | null loading: boolean devBypass: () => void } const AuthContext = createContext({ session: null, user: null, loading: true, devBypass: () => {} }) // DEV 전용 — 가짜 유저로 로그인 우회 const DEV_USER: User = { id: 'dev-user-00000', email: 'dev@d3ro.local', app_metadata: {}, user_metadata: {}, aud: 'authenticated', created_at: new Date().toISOString() } as User export function AuthProvider({ children }: { children: ReactNode }): React.ReactElement { const [session, setSession] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { supabase.auth .getSession() .then(({ data }) => { setSession(data.session) if (data.session?.user.id) { void registerPushToken(data.session.user.id) } }) .finally(() => setLoading(false)) const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, newSession) => { setSession(newSession) if (newSession?.user.id) { void registerPushToken(newSession.user.id) } }) return () => { subscription.unsubscribe() } }, []) const [devMode, setDevMode] = useState(false) function devBypass(): void { setDevMode(true) } const effectiveUser = devMode ? DEV_USER : (session?.user ?? null) return ( {children} ) } export function useAuth(): AuthContextValue { return useContext(AuthContext) }