Closes #5899 <img width="1280" alt="Index - banner" src="https://github.com/twentyhq/twenty/assets/71827178/313cf20d-eb34-496a-8c7c-7589fbd55954"> --------- Co-authored-by: Charles Bochet <charles@twenty.com>
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { useRecoilState, useSetRecoilState } from 'recoil';
|
|
|
|
import { currentUserState } from '@/auth/states/currentUserState';
|
|
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
|
import { isCurrentUserLoadedState } from '@/auth/states/isCurrentUserLoadingState';
|
|
import { workspacesState } from '@/auth/states/workspaces';
|
|
import { ColorScheme } from '@/workspace-member/types/WorkspaceMember';
|
|
import { useGetCurrentUserQuery } from '~/generated/graphql';
|
|
import { isDefined } from '~/utils/isDefined';
|
|
|
|
export const UserProviderEffect = () => {
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
const [isCurrentUserLoaded, setIsCurrentUserLoaded] = useRecoilState(
|
|
isCurrentUserLoadedState,
|
|
);
|
|
const setCurrentUser = useSetRecoilState(currentUserState);
|
|
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
|
|
const setWorkspaces = useSetRecoilState(workspacesState);
|
|
|
|
const setCurrentWorkspaceMember = useSetRecoilState(
|
|
currentWorkspaceMemberState,
|
|
);
|
|
|
|
const { loading: queryLoading, data: queryData } = useGetCurrentUserQuery({
|
|
skip: isCurrentUserLoaded,
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (!queryLoading) {
|
|
setIsLoading(false);
|
|
setIsCurrentUserLoaded(true);
|
|
}
|
|
|
|
if (!isDefined(queryData?.currentUser)) return;
|
|
|
|
setCurrentUser(queryData.currentUser);
|
|
setCurrentWorkspace(queryData.currentUser.defaultWorkspace);
|
|
|
|
const { workspaceMember, workspaces: userWorkspaces } =
|
|
queryData.currentUser;
|
|
|
|
if (isDefined(workspaceMember)) {
|
|
setCurrentWorkspaceMember({
|
|
...workspaceMember,
|
|
colorScheme: (workspaceMember.colorScheme as ColorScheme) ?? 'Light',
|
|
});
|
|
}
|
|
|
|
if (isDefined(userWorkspaces)) {
|
|
const workspaces = userWorkspaces
|
|
.map(({ workspace }) => workspace)
|
|
.filter(isDefined);
|
|
|
|
setWorkspaces(workspaces);
|
|
}
|
|
}, [
|
|
setCurrentUser,
|
|
isLoading,
|
|
queryLoading,
|
|
setCurrentWorkspace,
|
|
setCurrentWorkspaceMember,
|
|
setWorkspaces,
|
|
queryData?.currentUser,
|
|
setIsCurrentUserLoaded,
|
|
]);
|
|
|
|
return <></>;
|
|
};
|