projects/deliberation_at_scale/packages/frontend/components/Providers.tsx (53 lines of code) (raw):
'use client';
import { ApolloProvider } from '@apollo/client';
import { Provider as ReduxProvider } from 'react-redux';
import { apolloClient } from '@/state/apollo';
import store from '@/state/store';
import ConditionalLocalMediaProvider from './LocalMedia/conditional';
import ConditionalRoomConnectionProvider from './RoomConnection/conditional';
import { useEffect } from 'react';
import { useSearchParams } from 'next/navigation';
import { supabaseClient } from '@/state/supabase';
import { Toaster } from 'react-hot-toast';
interface Props {
children: React.ReactNode;
}
export default function Providers({ children }: Props) {
// Get access token and refresh token from query params
const params = useSearchParams();
const accessToken = params?.get('access_token') as string;
const refreshToken = params?.get('refresh_token') as string;
// login using the hash parameter provided by Supabase
useEffect(() => {
const hash = window.location.hash;
const formattedHash = hash.slice(1);
const result = formattedHash.split('&').reduce(function (res: Record<string, string>, item) {
const parts: string[] = item.split('=');
res[parts[0]] = parts[1];
return res;
}, {});
const accessToken = result['access_token'];
const refreshToken = result['refresh_token'];
supabaseClient.auth.setSession({
access_token: accessToken,
refresh_token: refreshToken,
});
}, []);
// using the query parameters provided by us
useEffect(() => {
if (!accessToken || !refreshToken) {
return;
}
supabaseClient.auth.setSession({
access_token: accessToken,
refresh_token: refreshToken,
});
}, [accessToken, refreshToken]);
return (
<ApolloProvider client={apolloClient}>
<ReduxProvider store={store}>
<ConditionalLocalMediaProvider>
<ConditionalRoomConnectionProvider>
{children}
<Toaster position='bottom-center'/>
</ConditionalRoomConnectionProvider>
</ConditionalLocalMediaProvider>
</ReduxProvider>
</ApolloProvider>
);
}