Files
twenty/packages/twenty-front/src/modules/metadata-store/effect-components/ViewSSEEffect.tsx
T
Lucas Bordeau 0fa8063054 Handle ObjectMetadataItem, FieldMetadataItem and NavigationMenuItem with SSE events (#18235)
This PR allows to handle ObjectMetadataItem, FieldMetadataItem and
NavigationMenuItem SSE events.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-25 23:18:00 +01:00

76 lines
2.2 KiB
TypeScript

import { useListenToMetadataOperationBrowserEvent } from '@/browser-event/hooks/useListenToMetadataOperationBrowserEvent';
import { useListenToEventsForQuery } from '@/sse-db-event/hooks/useListenToEventsForQuery';
import { coreViewsState } from '@/views/states/coreViewState';
import { type CoreViewWithoutRelations } from '@/views/types/CoreViewWithoutRelations';
import { useStore } from 'jotai';
import { AllMetadataName } from '~/generated-metadata/graphql';
export const ViewSSEEffect = () => {
const queryId = 'view-metadata-sse-effect';
const store = useStore();
useListenToEventsForQuery({
queryId,
operationSignature: {
metadataName: AllMetadataName.view,
variables: {},
},
});
useListenToMetadataOperationBrowserEvent({
metadataName: AllMetadataName.view,
onMetadataOperationBrowserEvent: (eventDetail) => {
switch (eventDetail.operation.type) {
case 'create': {
const createdView = eventDetail.operation
.createdRecord as unknown as CoreViewWithoutRelations;
store.set(coreViewsState.atom, (prevCoreViews) => [
...prevCoreViews,
{
...createdView,
viewFields: [],
viewFieldGroups: [],
viewFilterGroups: [],
viewSorts: [],
viewFilters: [],
viewGroups: [],
},
]);
break;
}
case 'update': {
const updatedView = eventDetail.operation
.updatedRecord as unknown as CoreViewWithoutRelations;
store.set(coreViewsState.atom, (prevCoreViews) =>
prevCoreViews.map((coreView) =>
coreView.id === updatedView.id
? {
...coreView,
...updatedView,
}
: coreView,
),
);
break;
}
case 'delete': {
const deletedViewId = eventDetail.operation.deletedRecordId as string;
store.set(coreViewsState.atom, (prevCoreViews) =>
prevCoreViews.filter((coreView) => coreView.id !== deletedViewId),
);
break;
}
default:
return;
}
},
});
return null;
};