algospaced-dsa / algospaced-ui /src /supabaseClient.ts
iamfebin's picture
feat: implement sandbox mode
a95fdd1
Raw
History Blame Contribute Delete
2.03 kB
import { createClient, SupabaseClient } from '@supabase/supabase-js';
let supabaseInstance: SupabaseClient | null = null;
export function initializeSupabase(url: string, key: string) {
if (url && key) {
supabaseInstance = createClient(url, key);
}
}
// Proxy wrapper that delegates all calls to the dynamically initialized instance
export const supabase = new Proxy({} as any, {
get(_target, prop) {
if (prop === 'auth' && localStorage.getItem('algospaced_sandbox_mode') === 'true') {
const mockSession = {
access_token: 'sandbox',
user: {
id: 'sandbox-user-id',
email: 'sandbox@algospaced.io',
email_confirmed_at: new Date().toISOString(),
last_sign_in_at: new Date().toISOString(),
role: 'authenticated',
aud: 'authenticated',
}
};
return {
getSession: async () => ({ data: { session: mockSession }, error: null }),
getUser: async () => ({ data: { user: mockSession.user }, error: null }),
onAuthStateChange: (callback: any) => {
setTimeout(() => callback('SIGNED_IN', mockSession), 0);
return {
data: {
subscription: {
unsubscribe: () => {}
}
}
};
},
signOut: async () => {
localStorage.removeItem('algospaced_sandbox_mode');
window.location.reload();
return { error: null };
}
};
}
if (!supabaseInstance) {
// Fallback: try loading from build-time environment if not initialized yet
const url = import.meta.env.VITE_SUPABASE_URL || '';
const key = import.meta.env.VITE_SUPABASE_ANON_KEY || '';
if (url && key) {
supabaseInstance = createClient(url, key);
} else {
throw new Error("Supabase client is not initialized. Please call initializeSupabase(url, key) first.");
}
}
return (supabaseInstance as any)[prop];
}
}) as unknown as SupabaseClient;