quivr/frontend/lib/context/SupabaseProvider/supabase-provider.tsx

58 lines
1.3 KiB
TypeScript
Raw Normal View History

"use client";
import type { SupabaseClient } from "@supabase/auth-helpers-nextjs";
import {
createBrowserSupabaseClient,
Session,
} from "@supabase/auth-helpers-nextjs";
import { useRouter } from "next/navigation";
import { createContext, useContext, useEffect, useState } from "react";
type MaybeSession = Session | null;
export type SupabaseContext = {
supabase: SupabaseClient;
session: MaybeSession;
};
const Context = createContext<SupabaseContext | undefined>(undefined);
export const SupabaseProvider = ({
children,
session,
}: {
children: React.ReactNode;
session: MaybeSession;
}): JSX.Element => {
const [supabase] = useState(() => createBrowserSupabaseClient());
const router = useRouter();
useEffect(() => {
const {
data: { subscription },
} = supabase.auth.onAuthStateChange(() => {
router.refresh();
});
return () => {
subscription.unsubscribe();
};
}, [router, supabase]);
return (
<Context.Provider value={{ supabase, session }}>
<>{children}</>
</Context.Provider>
);
};
export const useSupabase = (): SupabaseContext => {
const context = useContext(Context);
if (context === undefined) {
throw new Error("useSupabase must be used inside SupabaseProvider");
}
return context;
};