Skip to content

Commit 45a3502

Browse files
Arun kumarArun kumar
authored andcommitted
fix: refactor field metadata update logic to separate effect
1 parent 905898d commit 45a3502

File tree

6 files changed

+100
-1
lines changed

6 files changed

+100
-1
lines changed

packages/twenty-front/src/modules/object-metadata/hooks/useUpdateOneFieldMetadataItem.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import {
55

66
import { useMetadataErrorHandler } from '@/metadata-error-handler/hooks/useMetadataErrorHandler';
77
import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItems';
8+
import { lastFieldMetadataItemUpdateState } from '@/object-metadata/states/lastFieldMetadataItemUpdateState';
89
import { type MetadataRequestResult } from '@/object-metadata/types/MetadataRequestResult.type';
910
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
1011
import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId';
1112
import { ApolloError } from '@apollo/client';
1213
import { t } from '@lingui/core/macro';
14+
import { useSetRecoilState } from 'recoil';
1315
import { CrudOperationType } from 'twenty-shared/types';
1416

1517
export const useUpdateOneFieldMetadataItem = () => {
@@ -26,6 +28,10 @@ export const useUpdateOneFieldMetadataItem = () => {
2628

2729
const { enqueueErrorSnackBar } = useSnackBar();
2830

31+
const setLastFieldMetadataItemUpdate = useSetRecoilState(
32+
lastFieldMetadataItemUpdateState,
33+
);
34+
2935
const updateOneFieldMetadataItem = async ({
3036
objectMetadataId,
3137
fieldMetadataIdToUpdate,
@@ -60,6 +66,12 @@ export const useUpdateOneFieldMetadataItem = () => {
6066
await refreshObjectMetadataItems();
6167
await refreshCoreViewsByObjectMetadataId(objectMetadataId);
6268

69+
setLastFieldMetadataItemUpdate({
70+
fieldMetadataItemId: fieldMetadataIdToUpdate,
71+
objectMetadataId,
72+
timestamp: Date.now(),
73+
});
74+
6375
return {
6476
status: 'successful',
6577
response,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { createState } from 'twenty-ui/utilities';
2+
3+
export type LastFieldMetadataItemUpdate = {
4+
fieldMetadataItemId: string;
5+
objectMetadataId: string;
6+
timestamp: number;
7+
} | null;
8+
9+
export const lastFieldMetadataItemUpdateState =
10+
createState<LastFieldMetadataItemUpdate>({
11+
key: 'lastFieldMetadataItemUpdateState',
12+
defaultValue: null,
13+
});

packages/twenty-front/src/modules/object-record/record-table/components/RecordTableBodyEffectsWrapper.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { RecordTableBodyFocusKeyboardEffect } from '@/object-record/record-table
55
import { RecordTableRecordGroupBodyEffects } from '@/object-record/record-table/record-table-body/components/RecordTableRecordGroupBodyEffects';
66
import { RecordTableNoRecordGroupScrollToPreviousRecordEffect } from '@/object-record/record-table/virtualization/components/RecordTableNoRecordGroupScrollToPreviousRecordEffect';
77
import { RecordTableVirtualizedInitialDataLoadEffect } from '@/object-record/record-table/virtualization/components/RecordTableVirtualizedInitialDataLoadEffect';
8+
import { RecordTableVirtualizedFieldMetadataUpdateEffect } from '@/object-record/record-table/virtualization/components/RecordTableVirtualizedFieldMetadataUpdateEffect';
89

910
export interface RecordTableBodyEffectsWrapperProps {
1011
hasRecordGroups: boolean;
@@ -23,6 +24,7 @@ export const RecordTableBodyEffectsWrapper = ({
2324
<>
2425
<RecordTableNoRecordGroupScrollToPreviousRecordEffect />
2526
<RecordTableVirtualizedInitialDataLoadEffect />
27+
<RecordTableVirtualizedFieldMetadataUpdateEffect />
2628
</>
2729
)}
2830
<RecordTableBodyEscapeHotkeyEffect />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { lastFieldMetadataItemUpdateState } from '@/object-metadata/states/lastFieldMetadataItemUpdateState';
2+
import { visibleRecordFieldsComponentSelector } from '@/object-record/record-field/states/visibleRecordFieldsComponentSelector';
3+
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
4+
import { useResetVirtualizationBecauseDataChanged } from '@/object-record/record-table/virtualization/hooks/useResetVirtualizationBecauseDataChanged';
5+
import { lastProcessedFieldMetadataUpdateComponentState } from '@/object-record/record-table/virtualization/states/lastProcessedFieldMetadataUpdateComponentState';
6+
import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState';
7+
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
8+
import { useEffect } from 'react';
9+
import { useRecoilValue } from 'recoil';
10+
11+
export const RecordTableVirtualizedFieldMetadataUpdateEffect = () => {
12+
const { objectNameSingular } = useRecordTableContextOrThrow();
13+
14+
const { resetVirtualizationBecauseDataChanged } =
15+
useResetVirtualizationBecauseDataChanged(objectNameSingular);
16+
17+
const visibleRecordFields = useRecoilComponentValue(
18+
visibleRecordFieldsComponentSelector,
19+
);
20+
21+
const lastFieldMetadataItemUpdate = useRecoilValue(
22+
lastFieldMetadataItemUpdateState,
23+
);
24+
25+
const [
26+
lastProcessedFieldMetadataUpdate,
27+
setLastProcessedFieldMetadataUpdate,
28+
] = useRecoilComponentState(lastProcessedFieldMetadataUpdateComponentState);
29+
30+
useEffect(() => {
31+
if (!lastFieldMetadataItemUpdate) {
32+
return;
33+
}
34+
35+
if (
36+
lastFieldMetadataItemUpdate.timestamp === lastProcessedFieldMetadataUpdate
37+
) {
38+
return;
39+
}
40+
41+
const isFieldInCurrentView = visibleRecordFields.some(
42+
(field) =>
43+
field.fieldMetadataItemId ===
44+
lastFieldMetadataItemUpdate.fieldMetadataItemId,
45+
);
46+
47+
if (isFieldInCurrentView) {
48+
setLastProcessedFieldMetadataUpdate(
49+
lastFieldMetadataItemUpdate.timestamp,
50+
);
51+
resetVirtualizationBecauseDataChanged();
52+
}
53+
}, [
54+
lastFieldMetadataItemUpdate,
55+
lastProcessedFieldMetadataUpdate,
56+
setLastProcessedFieldMetadataUpdate,
57+
visibleRecordFields,
58+
resetVirtualizationBecauseDataChanged,
59+
]);
60+
61+
return <></>;
62+
};

packages/twenty-front/src/modules/object-record/record-table/virtualization/components/RecordTableVirtualizedInitialDataLoadEffect.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { useRecoilValue } from 'recoil';
22

3+
import { visibleRecordFieldsComponentSelector } from '@/object-record/record-field/states/visibleRecordFieldsComponentSelector';
34
import { useRecordIndexTableFetchMore } from '@/object-record/record-index/hooks/useRecordIndexTableFetchMore';
45
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
56

6-
import { visibleRecordFieldsComponentSelector } from '@/object-record/record-field/states/visibleRecordFieldsComponentSelector';
77
import { useTriggerInitialRecordTableDataLoad } from '@/object-record/record-table/virtualization/hooks/useTriggerInitialRecordTableDataLoad';
88
import { isInitializingVirtualTableDataLoadingComponentState } from '@/object-record/record-table/virtualization/states/isInitializingVirtualTableDataLoadingComponentState';
99
import { lastContextStoreVirtualizedViewIdComponentState } from '@/object-record/record-table/virtualization/states/lastContextStoreVirtualizedViewIdComponentState';
1010
import { lastContextStoreVirtualizedVisibleRecordFieldsComponentState } from '@/object-record/record-table/virtualization/states/lastContextStoreVirtualizedVisibleRecordFieldsComponentState';
11+
1112
import { lastRecordTableQueryIdentifierComponentState } from '@/object-record/record-table/virtualization/states/lastRecordTableQueryIdentifierComponentState';
1213
import { isFetchingMoreRecordsFamilyState } from '@/object-record/states/isFetchingMoreRecordsFamilyState';
1314
import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
2+
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
3+
4+
export const lastProcessedFieldMetadataUpdateComponentState =
5+
createComponentState<number | null>({
6+
key: 'lastProcessedFieldMetadataUpdateComponentState',
7+
componentInstanceContext: ContextStoreComponentInstanceContext,
8+
defaultValue: null,
9+
});

0 commit comments

Comments
 (0)