Files
twenty_crm/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerAttachRelationOptimisticEffect.ts
Thaïs 29339ef99a fix: detach relation records in cache on record deletion (#3707)
* fix: detach relation records in cache on record deletion

* fix: fix useGetRelationMetadata tests
2024-01-31 11:36:26 +01:00

60 lines
1.8 KiB
TypeScript

import { ApolloCache, StoreObject } from '@apollo/client';
import { isCachedObjectRecordConnection } from '@/apollo/optimistic-effect/utils/isCachedObjectRecordConnection';
import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge';
import { capitalize } from '~/utils/string/capitalize';
export const triggerAttachRelationOptimisticEffect = ({
cache,
objectNameSingular,
recordId,
relationObjectMetadataNameSingular,
relationFieldName,
relationRecordId,
}: {
cache: ApolloCache<unknown>;
objectNameSingular: string;
recordId: string;
relationObjectMetadataNameSingular: string;
relationFieldName: string;
relationRecordId: string;
}) => {
const recordTypeName = capitalize(objectNameSingular);
const relationRecordTypeName = capitalize(relationObjectMetadataNameSingular);
cache.modify<StoreObject>({
id: cache.identify({
id: relationRecordId,
__typename: relationRecordTypeName,
}),
fields: {
[relationFieldName]: (cachedFieldValue, { toReference }) => {
const nodeReference = toReference({
id: recordId,
__typename: recordTypeName,
});
if (!nodeReference) return cachedFieldValue;
if (
isCachedObjectRecordConnection(objectNameSingular, cachedFieldValue)
) {
// To many objects => add record to next relation field list
const nextEdges: CachedObjectRecordEdge[] = [
...cachedFieldValue.edges,
{
__typename: `${recordTypeName}Edge`,
node: nodeReference,
cursor: '',
},
];
return { ...cachedFieldValue, edges: nextEdges };
}
// To one object => attach next relation record
return nodeReference;
},
},
});
};