diff --git a/docs/screenshots/issue-35-mobile-onboarding.png b/docs/screenshots/issue-35-mobile-onboarding.png new file mode 100644 index 0000000..072d607 Binary files /dev/null and b/docs/screenshots/issue-35-mobile-onboarding.png differ diff --git a/frontend/src/lib/supabase.ts b/frontend/src/lib/supabase.ts index f10bc78..e9aa08a 100644 --- a/frontend/src/lib/supabase.ts +++ b/frontend/src/lib/supabase.ts @@ -1,36 +1,52 @@ -import { createClient } from '@supabase/supabase-js'; +import { createClient, SupabaseClient } from '@supabase/supabase-js'; -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL!; -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY!; +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL ?? ''; +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY ?? ''; -export const supabase = createClient(supabaseUrl, supabaseAnonKey); +export const supabase: SupabaseClient = + supabaseUrl && supabaseAnonKey + ? createClient(supabaseUrl, supabaseAnonKey) + : (null as unknown as SupabaseClient); // Helper to get current session export async function getSession() { - const { data: { session } } = await supabase.auth.getSession(); - return session; + if (!supabase) return null; + try { + const { data: { session } } = await supabase.auth.getSession(); + return session; + } catch { + return null; + } } // Helper to get current user export async function getCurrentUser() { + if (!supabase) return null; const { data: { user } } = await supabase.auth.getUser(); return user; } // Helper to sign in anonymously export async function signInAnonymously() { + if (!supabase) { + return { data: null, error: { message: 'Supabase not configured. Add VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY to .env' } as any }; + } const { data, error } = await supabase.auth.signInAnonymously(); return { data, error }; } // Helper to sign out export async function signOut() { + if (!supabase) return { error: null }; const { error } = await supabase.auth.signOut(); return { error }; } // Helper to create user profile export async function createProfile(userId: string, nickname: string, avatar: string) { + if (!supabase) { + return { data: null, error: { message: 'Supabase not configured' } as any }; + } const { data, error } = await supabase .from('profiles') .insert({ @@ -46,6 +62,7 @@ export async function createProfile(userId: string, nickname: string, avatar: st // Helper to get user profile export async function getProfile(userId: string) { + if (!supabase) return { data: null, error: { message: 'Supabase not configured' } as any }; const { data, error } = await supabase .from('profiles') .select('*') diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 4773060..f4a4f60 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -11,10 +11,14 @@ export default function Home() { }, []); async function checkSession() { - const session = await getSession(); - if (session) { - navigate('/dashboard'); - } else { + try { + const session = await getSession(); + if (session) { + navigate('/dashboard'); + } + } catch { + // ignore + } finally { setLoading(false); } } diff --git a/frontend/src/pages/Onboarding.tsx b/frontend/src/pages/Onboarding.tsx index 09dd7b8..12a276c 100644 --- a/frontend/src/pages/Onboarding.tsx +++ b/frontend/src/pages/Onboarding.tsx @@ -55,8 +55,8 @@ export default function Onboarding() { } return ( -
3-20 characters, no personal info