* Proof of concept ComponentState * Migrate to createState and createFamilyState * Refactor * Fix * Fix tests * Fix lint * Fix tests * Re-enable coverage
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { useQuery } from '@apollo/client';
|
|
import { useSetRecoilState } from 'recoil';
|
|
|
|
import { currentUserState } from '@/auth/states/currentUserState';
|
|
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
|
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
|
|
import { ColorScheme } from '@/workspace-member/types/WorkspaceMember';
|
|
import { isNonNullable } from '~/utils/isNonNullable';
|
|
|
|
export const UserProvider = ({ children }: React.PropsWithChildren) => {
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
const setCurrentUser = useSetRecoilState(currentUserState());
|
|
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState());
|
|
|
|
const setCurrentWorkspaceMember = useSetRecoilState(
|
|
currentWorkspaceMemberState(),
|
|
);
|
|
|
|
const { loading: queryLoading, data: queryData } = useQuery(GET_CURRENT_USER);
|
|
|
|
useEffect(() => {
|
|
if (!queryLoading) {
|
|
setIsLoading(false);
|
|
}
|
|
if (isNonNullable(queryData?.currentUser)) {
|
|
setCurrentUser(queryData.currentUser);
|
|
setCurrentWorkspace(queryData.currentUser.defaultWorkspace);
|
|
}
|
|
if (isNonNullable(queryData?.currentUser?.workspaceMember)) {
|
|
const workspaceMember = queryData.currentUser.workspaceMember;
|
|
setCurrentWorkspaceMember({
|
|
...workspaceMember,
|
|
colorScheme: (workspaceMember.colorScheme as ColorScheme) ?? 'Light',
|
|
});
|
|
}
|
|
}, [
|
|
setCurrentUser,
|
|
isLoading,
|
|
queryLoading,
|
|
setCurrentWorkspace,
|
|
setCurrentWorkspaceMember,
|
|
queryData?.currentUser,
|
|
]);
|
|
|
|
return isLoading ? <></> : <>{children}</>;
|
|
};
|