@adventurelabs/scout-core
Version:
Core utilities and helpers for Adventure Labs Scout applications
47 lines (46 loc) • 2 kB
JavaScript
"use client";
import { jsx as _jsx } from "react/jsx-runtime";
import { useScoutRefresh } from "../hooks/useScoutRefresh";
import { createContext, useContext, useMemo, useRef } from "react";
import { createBrowserClient } from "@supabase/ssr";
// Create context for the Supabase client
const SupabaseContext = createContext(null);
const ConnectionStatusContext = createContext(null);
// Hook to use the Supabase client
export function useSupabase() {
const supabase = useContext(SupabaseContext);
if (!supabase) {
throw new Error("useSupabase must be used within a SupabaseProvider");
}
return supabase;
}
// Hook to use connection status
export function useConnectionStatus() {
const connectionStatus = useContext(ConnectionStatusContext);
if (!connectionStatus) {
throw new Error("useConnectionStatus must be used within a ScoutRefreshProvider");
}
return connectionStatus;
}
export function ScoutRefreshProvider({ children }) {
// Use refs to store the URL and key to prevent unnecessary recreations
const urlRef = useRef(process.env.NEXT_PUBLIC_SUPABASE_URL || "");
const anonKeyRef = useRef(process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "");
// Create a single Supabase client instance that only runs once
const supabaseClient = useMemo(() => {
console.log("[ScoutRefreshProvider] Creating Supabase client");
return createBrowserClient(urlRef.current, anonKeyRef.current);
}, []); // Empty dependency array ensures this only runs once
useScoutRefresh();
// // Log connection status changes for debugging
// if (connectionStatus.lastError) {
// console.warn(
// "[ScoutRefreshProvider] DB Listener error:",
// connectionStatus.lastError
// );
// }
// if (connectionStatus.isConnected) {
// console.log("[ScoutRefreshProvider] ✅ DB Listener connected");
// }
return (_jsx(SupabaseContext.Provider, { value: supabaseClient, children: children }));
}