92 lines
2.8 KiB
TypeScript
92 lines
2.8 KiB
TypeScript
import { useMetadataStore } from '@/metadata-store/hooks/useMetadataStore';
|
|
import { useIsLogged } from '@/auth/hooks/useIsLogged';
|
|
import { isCurrentUserLoadedState } from '@/auth/states/isCurrentUserLoadedState';
|
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
|
import { coreViewsState } from '@/views/states/coreViewState';
|
|
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
|
|
import { useRecoilValueV2 } from '@/ui/utilities/state/jotai/hooks/useRecoilValueV2';
|
|
import { useStore } from 'jotai';
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace';
|
|
import {
|
|
ViewType as CoreViewType,
|
|
useFindAllCoreViewsLazyQuery,
|
|
} from '~/generated-metadata/graphql';
|
|
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
|
|
|
const INDEX_VIEW_TYPES = [
|
|
CoreViewType.TABLE,
|
|
CoreViewType.KANBAN,
|
|
CoreViewType.CALENDAR,
|
|
];
|
|
|
|
export const ViewMetadataProviderInitialEffect = () => {
|
|
const isLoggedIn = useIsLogged();
|
|
const isCurrentUserLoaded = useRecoilValueV2(isCurrentUserLoadedState);
|
|
const currentWorkspace = useRecoilValueV2(currentWorkspaceState);
|
|
const store = useStore();
|
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
|
|
const { updateDraft, applyChanges } = useMetadataStore();
|
|
|
|
const [findAllCoreViews] = useFindAllCoreViewsLazyQuery();
|
|
|
|
const setIndexCoreViews = useCallback(
|
|
(indexViews: CoreViewWithRelations[]) => {
|
|
const existingCoreViews = store.get(coreViewsState.atom);
|
|
const existingFieldsWidgetViews = existingCoreViews.filter(
|
|
(view) => view.type === CoreViewType.FIELDS_WIDGET,
|
|
);
|
|
const mergedViews = [...indexViews, ...existingFieldsWidgetViews];
|
|
|
|
if (!isDeeplyEqual(existingCoreViews, mergedViews)) {
|
|
store.set(coreViewsState.atom, mergedViews);
|
|
}
|
|
},
|
|
[store],
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (isInitialized) {
|
|
return;
|
|
}
|
|
if (!isCurrentUserLoaded) {
|
|
return;
|
|
}
|
|
|
|
if (!isLoggedIn || !isWorkspaceActiveOrSuspended(currentWorkspace)) {
|
|
setIsInitialized(true);
|
|
return;
|
|
}
|
|
|
|
const loadViews = async () => {
|
|
const result = await findAllCoreViews({
|
|
variables: { viewTypes: INDEX_VIEW_TYPES },
|
|
fetchPolicy: 'network-only',
|
|
});
|
|
|
|
if (isDefined(result.data?.getCoreViews)) {
|
|
setIndexCoreViews(result.data.getCoreViews);
|
|
updateDraft('views', result.data.getCoreViews);
|
|
applyChanges();
|
|
}
|
|
|
|
setIsInitialized(true);
|
|
};
|
|
|
|
loadViews();
|
|
}, [
|
|
isInitialized,
|
|
isCurrentUserLoaded,
|
|
isLoggedIn,
|
|
currentWorkspace,
|
|
findAllCoreViews,
|
|
setIndexCoreViews,
|
|
updateDraft,
|
|
applyChanges,
|
|
]);
|
|
|
|
return null;
|
|
};
|