diff --git a/src/main.tsx b/src/main.tsx index 9543fb3..cee7de1 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -9,15 +9,12 @@ import '@fontsource/geist-mono'; import '@fontsource/jetbrains-mono'; import wisp, { init } from "@renderdragonorg/wisp"; -import { bindSupabase } from "@renderdragonorg/wisp/supabase"; -import { supabase } from "@/integrations/supabase/client"; const convexUrl = import.meta.env.VITE_CONVEX_URL; const wispSecret = import.meta.env.VITE_WISP_SECRET; if (convexUrl) { init({ convexUrl, wispSecret: wispSecret || undefined }); - bindSupabase(supabase); } // expose for console debugging diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index ed6240f..84bde06 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -2,6 +2,34 @@ import { useState, useEffect } from "react"; import { User, Session } from "@supabase/supabase-js"; import { supabase } from "@/integrations/supabase/client"; import { AuthContext, AuthResult } from "@/providers/AuthContext"; +import wisp from "@renderdragonorg/wisp"; + +function tryIdentify(userId: string, retries = 3) { + try { wisp.identify(userId); } + catch { + if (retries > 0) setTimeout(() => tryIdentify(userId, retries - 1), 500); + } +} +function tryReset() { + try { wisp.reset(); } catch { /* wisp not initialized */ } +} +function tryTrackIdentify(session: Session | null, retries = 3) { + const user = session?.user; + if (!user?.id) return; + try { + const meta = user.user_metadata as Record || {}; + const identities = (user.identities ?? []) as Array<{ provider?: string | null }>; + const primaryIdentity = identities.find((i) => i.provider === (user.app_metadata?.provider as string)) ?? identities[0]; + wisp.track("session_identify", { + email: user.email, + name: meta.full_name as string | undefined, + provider: primaryIdentity?.provider ?? user.app_metadata?.provider ?? "email", + }); + } catch { + if (retries > 0) setTimeout(() => tryTrackIdentify(session, retries - 1), 500); + } +} + export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const [user, setUser] = useState(null); const [session, setSession] = useState(null); @@ -14,12 +42,23 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { setSession(session); setUser(session?.user ?? null); setLoading(false); + + if (event === "SIGNED_IN" && session?.user.id) { + tryIdentify(session.user.id); + tryTrackIdentify(session); + } else if (event === "SIGNED_OUT") { + tryReset(); + } }); supabase.auth.getSession().then(({ data: { session } }) => { setSession(session); setUser(session?.user ?? null); setLoading(false); + if (session?.user.id) { + tryIdentify(session.user.id); + tryTrackIdentify(session); + } }); return () => subscription.unsubscribe();