Files
twenty/packages/twenty-front/src/modules/context-store/components/MainContextStoreProviderEffect.tsx
Charles Bochet b6e344e7be Various fixes (#11448)
# Scrollbar fix

Fixes https://github.com/twentyhq/twenty/issues/11403

<img width="1512" alt="image"
src="https://github.com/user-attachments/assets/b13fe0f2-8c61-4ea8-9ea1-e61e571a90da"
/>

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
2025-04-09 01:03:43 +02:00

155 lines
4.5 KiB
TypeScript

import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState';
import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType';
import { useSetLastVisitedObjectMetadataId } from '@/navigation/hooks/useSetLastVisitedObjectMetadataId';
import { useSetLastVisitedViewForObjectMetadataNamePlural } from '@/navigation/hooks/useSetLastVisitedViewForObjectMetadataNamePlural';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
import { View } from '@/views/types/View';
import { ViewType } from '@/views/types/ViewType';
import { useEffect } from 'react';
import { useRecoilValue } from 'recoil';
type MainContextStoreProviderEffectProps = {
viewId?: string;
objectMetadataItem?: ObjectMetadataItem;
isRecordIndexPage: boolean;
isRecordShowPage: boolean;
isSettingsPage: boolean;
};
export const MainContextStoreProviderEffect = ({
viewId,
objectMetadataItem,
isRecordIndexPage,
isRecordShowPage,
isSettingsPage,
}: MainContextStoreProviderEffectProps) => {
const { setLastVisitedViewForObjectMetadataNamePlural } =
useSetLastVisitedViewForObjectMetadataNamePlural();
const { setLastVisitedObjectMetadataId } =
useSetLastVisitedObjectMetadataId();
const [contextStoreCurrentViewId, setContextStoreCurrentViewId] =
useRecoilComponentStateV2(
contextStoreCurrentViewIdComponentState,
MAIN_CONTEXT_STORE_INSTANCE_ID,
);
const [contextStoreCurrentViewType, setContextStoreCurrentViewType] =
useRecoilComponentStateV2(
contextStoreCurrentViewTypeComponentState,
MAIN_CONTEXT_STORE_INSTANCE_ID,
);
const [
contextStoreCurrentObjectMetadataItemId,
setContextStoreCurrentObjectMetadataItemId,
] = useRecoilComponentStateV2(
contextStoreCurrentObjectMetadataItemIdComponentState,
MAIN_CONTEXT_STORE_INSTANCE_ID,
);
const view = useRecoilValue(
prefetchViewFromViewIdFamilySelector({
viewId: viewId ?? '',
}),
);
useEffect(() => {
if (contextStoreCurrentObjectMetadataItemId !== objectMetadataItem?.id) {
setContextStoreCurrentObjectMetadataItemId(objectMetadataItem?.id);
}
if (!objectMetadataItem) {
return;
}
setLastVisitedViewForObjectMetadataNamePlural({
objectNamePlural: objectMetadataItem.namePlural,
viewId: viewId ?? '',
});
setLastVisitedObjectMetadataId({
objectMetadataItemId: objectMetadataItem.id,
});
}, [
contextStoreCurrentObjectMetadataItemId,
objectMetadataItem,
setContextStoreCurrentObjectMetadataItemId,
setLastVisitedObjectMetadataId,
setLastVisitedViewForObjectMetadataNamePlural,
viewId,
]);
useEffect(() => {
if (isSettingsPage) {
setContextStoreCurrentViewId(undefined);
return;
}
if (contextStoreCurrentViewId !== viewId) {
setContextStoreCurrentViewId(viewId);
}
}, [
contextStoreCurrentViewId,
isSettingsPage,
setContextStoreCurrentViewId,
viewId,
]);
useEffect(() => {
const viewType = getViewType({
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
view,
});
if (contextStoreCurrentViewType !== viewType) {
setContextStoreCurrentViewType(viewType);
}
}, [
contextStoreCurrentViewType,
setContextStoreCurrentViewType,
view,
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
]);
return null;
};
const getViewType = ({
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
view,
}: {
isSettingsPage: boolean;
isRecordShowPage: boolean;
isRecordIndexPage: boolean;
view?: View;
}) => {
if (isSettingsPage) {
return null;
}
if (isRecordIndexPage) {
return view?.type === ViewType.Kanban
? ContextStoreViewType.Kanban
: ContextStoreViewType.Table;
}
if (isRecordShowPage) {
return ContextStoreViewType.ShowPage;
}
return null;
};