Skip to content

Commit 9d6c673

Browse files
Arun kumarArun kumar
authored andcommitted
Fix: Add lastFieldMetadataItemUpdateState for select field refresh
1 parent 905898d commit 9d6c673

File tree

6 files changed

+97
-0
lines changed

6 files changed

+97
-0
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ 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';
16+
import { v4 as uuidv4 } from 'uuid';
1417

1518
export const useUpdateOneFieldMetadataItem = () => {
1619
const { refreshObjectMetadataItems } =
@@ -26,6 +29,10 @@ export const useUpdateOneFieldMetadataItem = () => {
2629

2730
const { enqueueErrorSnackBar } = useSnackBar();
2831

32+
const setLastFieldMetadataItemUpdate = useSetRecoilState(
33+
lastFieldMetadataItemUpdateState,
34+
);
35+
2936
const updateOneFieldMetadataItem = async ({
3037
objectMetadataId,
3138
fieldMetadataIdToUpdate,
@@ -60,6 +67,12 @@ export const useUpdateOneFieldMetadataItem = () => {
6067
await refreshObjectMetadataItems();
6168
await refreshCoreViewsByObjectMetadataId(objectMetadataId);
6269

70+
setLastFieldMetadataItemUpdate({
71+
fieldMetadataItemId: fieldMetadataIdToUpdate,
72+
objectMetadataId,
73+
eventId: uuidv4(),
74+
});
75+
6376
return {
6477
status: 'successful',
6578
response,
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { LastFieldMetadataItemUpdate } from '@/object-metadata/types/LastFieldMetadataItemUpdate';
2+
import { createState } from 'twenty-ui/utilities';
3+
4+
export const lastFieldMetadataItemUpdateState =
5+
createState<LastFieldMetadataItemUpdate>({
6+
key: 'lastFieldMetadataItemUpdateState',
7+
defaultValue: null,
8+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export type LastFieldMetadataItemUpdate = {
2+
fieldMetadataItemId: string;
3+
objectMetadataId: string;
4+
eventId: string;
5+
} | null;

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,60 @@
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.eventId === 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(lastFieldMetadataItemUpdate.eventId);
49+
resetVirtualizationBecauseDataChanged();
50+
}
51+
}, [
52+
lastFieldMetadataItemUpdate,
53+
lastProcessedFieldMetadataUpdate,
54+
setLastProcessedFieldMetadataUpdate,
55+
visibleRecordFields,
56+
resetVirtualizationBecauseDataChanged,
57+
]);
58+
59+
return <></>;
60+
};
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<string | null>({
6+
key: 'lastProcessedFieldMetadataUpdateComponentState',
7+
componentInstanceContext: ContextStoreComponentInstanceContext,
8+
defaultValue: null,
9+
});

0 commit comments

Comments
 (0)