projects/deliberation_at_scale/packages/frontend/hooks/useProfile.ts (67 lines of code) (raw):
import { useCallback, useEffect, useState } from "react";
import { msg } from "@lingui/macro";
import { useLingui } from '@lingui/react';
import { supabaseClient } from "@/state/supabase";
import { useGetRoomsQuery, useGetUserQuery } from "@/generated/graphql";
import useRealtimeQuery from "./useRealtimeQuery";
import { useAppDispatch, useAppSelector } from "@/state/store";
import { setAuthUser, setAuthSession } from "@/state/slices/profile";
export default function useProfile() {
const { _ } = useLingui();
const dispatch = useAppDispatch();
const authUser = useAppSelector((state) => state.profile.authUser);
const authSession = useAppSelector((state) => state.profile.authSession);
const [loading, setLoading] = useState(true);
const authUserId = authUser?.id;
const { data: usersData, refetch: refetchUser } = useRealtimeQuery(useGetUserQuery({
variables: {
authUserId,
},
}));
const { data: roomsData } = useRealtimeQuery(useGetRoomsQuery(), {
tableEventsLookup: {
rooms: {
//refetchOperations: [],
//appendOnInsertEdgePaths: ['roomsCollection'],
},
},
});
const user = usersData?.usersCollection?.edges?.[0]?.node;
const userId = user?.id;
const rooms = roomsData?.roomsCollection?.edges;
const isLoggedIn = !!authUser && !!user;
const updateAuthUser = useCallback(async () => {
setLoading(true);
const { data: { user } } = await supabaseClient.auth.getUser();
const { data: { session } } = await supabaseClient.auth.getSession();
dispatch(setAuthUser(user));
dispatch(setAuthSession(session));
setLoading(false);
}, [dispatch]);
const flowStateNickName = useAppSelector((state) => state.flow.flowStateLookup?.['lobby']?.['nickName']);
const nickName = flowStateNickName ?? user?.nick_name ?? _(msg`You`);
useEffect(() => {
const { data: authListener } = supabaseClient.auth.onAuthStateChange((event) => {
if (!!authUser && !!authSession && event === 'INITIAL_SESSION') {
return;
}
updateAuthUser();
});
return () => {
authListener.subscription.unsubscribe();
};
}, [authSession, authUser, updateAuthUser]);
useEffect(() => {
refetchUser({
authUserId,
});
}, [authUserId, refetchUser]);
return {
authUser,
authSession,
user,
userId,
nickName,
rooms,
loading,
isLoggedIn,
};
}