Spaces:
Sleeping
Sleeping
File size: 2,973 Bytes
cbbb114 74baa7b cbbb114 74baa7b cbbb114 74baa7b cbbb114 74baa7b cbbb114 74baa7b 59a9b47 cbbb114 74baa7b 59a9b47 74baa7b 59a9b47 74baa7b cbbb114 74baa7b cbbb114 74baa7b cbbb114 74baa7b cbbb114 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | "use client";
import { useEffect } from "react";
import { createClient } from "@/lib/supabase/client";
/**
* ExtensionBridge — syncs auth to Chrome extension.
* Uses window.postMessage which content script picks up.
* Handles: initial load, sign in, sign out, token refresh, tab switch.
*/
export function ExtensionBridge() {
const supabase = createClient();
function sendAuthToExtension(token: string, email: string, name: string, userId: string, plan: string) {
// Content script listens for this via window.addEventListener("message")
window.postMessage({
type: "CLAUSEGUARD_AUTH_SYNC",
token, email, name, userId, plan,
}, window.location.origin);
}
async function syncCurrentUser() {
try {
const { data: { user } } = await supabase.auth.getUser();
if (!user) {
sendAuthToExtension("", "", "", "", "free");
return;
}
const { data: { session } } = await supabase.auth.getSession();
if (!session) {
sendAuthToExtension("", "", "", "", "free");
return;
}
const { data: profile } = await supabase
.from("profiles")
.select("plan, full_name")
.eq("id", user.id)
.single();
sendAuthToExtension(
session.access_token,
user.email || "",
profile?.full_name || user.user_metadata?.full_name || user.user_metadata?.name || "",
user.id,
profile?.plan || "free",
);
} catch {}
}
useEffect(() => {
// Sync on initial page load (already logged in user opens new tab)
syncCurrentUser();
// Sync on every auth state change
const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => {
// Handle ALL events that mean "user is logged in"
if (session && (event === "SIGNED_IN" || event === "INITIAL_SESSION" || event === "TOKEN_REFRESHED")) {
let profileData = null;
try {
const result = await supabase
.from("profiles")
.select("plan, full_name")
.eq("id", session.user.id)
.single();
profileData = result.data;
} catch {
// ignore
}
sendAuthToExtension(
session.access_token,
session.user.email || "",
profileData?.full_name || session.user.user_metadata?.full_name || "",
session.user.id,
profileData?.plan || "free",
);
}
if (event === "SIGNED_OUT") {
sendAuthToExtension("", "", "", "", "free");
}
});
// Also sync when tab becomes visible (user switches back to this tab)
function onVisible() {
if (document.visibilityState === "visible") syncCurrentUser();
}
document.addEventListener("visibilitychange", onVisible);
return () => {
subscription.unsubscribe();
document.removeEventListener("visibilitychange", onVisible);
};
}, []);
return null;
}
|