* WIP * Minor fixes * Added TODO * Fix post merge * Fix * Fixed warnings * Fixed comments * Fixed comments * Fixed naming * Removed comment * WIP * WIP 2 * Finished working version * Fixes * Fixed typing * Fixes * Fixes * Fixes * Naming fixes * WIP * Fix import * WIP * Working version on title * Fixed create record id overwrite * Removed unecessary callback * Masterpiece * Fixed delete on click outside drawer or delete * Cleaned * Cleaned * Cleaned * Minor fixes * Fixes * Fixed naming * WIP * Fix * Fixed create from target inline cell * Removed console.log * Fixed delete activity optimistic effect * Fixed no title * Fixed debounce and title body creation --------- Co-authored-by: Charles Bochet <charles@twenty.com>
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { ApolloCache, StoreObject } from '@apollo/client';
|
|
|
|
import { isCachedObjectRecordConnection } from '@/apollo/optimistic-effect/utils/isCachedObjectRecordConnection';
|
|
import { capitalize } from '~/utils/string/capitalize';
|
|
|
|
export const triggerDetachRelationOptimisticEffect = ({
|
|
cache,
|
|
sourceObjectNameSingular,
|
|
sourceRecordId,
|
|
targetObjectNameSingular,
|
|
fieldNameOnTargetRecord,
|
|
targetRecordId,
|
|
}: {
|
|
cache: ApolloCache<unknown>;
|
|
sourceObjectNameSingular: string;
|
|
sourceRecordId: string;
|
|
targetObjectNameSingular: string;
|
|
fieldNameOnTargetRecord: string;
|
|
targetRecordId: string;
|
|
}) => {
|
|
const targetRecordTypeName = capitalize(targetObjectNameSingular);
|
|
|
|
const targetRecordCacheId = cache.identify({
|
|
id: targetRecordId,
|
|
__typename: targetRecordTypeName,
|
|
});
|
|
|
|
cache.modify<StoreObject>({
|
|
id: targetRecordCacheId,
|
|
fields: {
|
|
[fieldNameOnTargetRecord]: (
|
|
targetRecordFieldValue,
|
|
{ isReference, readField },
|
|
) => {
|
|
const isRelationTargetFieldAnObjectRecordConnection =
|
|
isCachedObjectRecordConnection(
|
|
sourceObjectNameSingular,
|
|
targetRecordFieldValue,
|
|
);
|
|
|
|
if (isRelationTargetFieldAnObjectRecordConnection) {
|
|
const relationTargetFieldEdgesWithoutRelationSourceRecordToDetach =
|
|
targetRecordFieldValue.edges.filter(
|
|
({ node }) => readField('id', node) !== sourceRecordId,
|
|
);
|
|
|
|
return {
|
|
...targetRecordFieldValue,
|
|
edges: relationTargetFieldEdgesWithoutRelationSourceRecordToDetach,
|
|
};
|
|
}
|
|
|
|
const isRelationTargetFieldASingleObjectRecord = isReference(
|
|
targetRecordFieldValue,
|
|
);
|
|
|
|
if (isRelationTargetFieldASingleObjectRecord) {
|
|
return null;
|
|
}
|
|
|
|
return targetRecordFieldValue;
|
|
},
|
|
},
|
|
});
|
|
};
|