* refactor: apply relation optimistic effects on record update Related to #3509 * refactor: remove need to pass relation id field to create and update mutations * fix: fix tests * fix: fix SingleEntitySelect glitch * fix: fix usePersistField tests * fix: fix wrong import after rebase * fix: fix several tests * fix: fix test types
77 lines
2.9 KiB
TypeScript
77 lines
2.9 KiB
TypeScript
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { TriggerUpdateRelationFieldOptimisticEffectParams } from '@/apollo/optimistic-effect/utils/triggerUpdateRelationFieldOptimisticEffect';
|
|
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
|
|
|
export const useGetRelationFieldsToOptimisticallyUpdate = () =>
|
|
useRecoilCallback(
|
|
({ snapshot }) =>
|
|
<UpdatedObjectRecord extends ObjectRecord = ObjectRecord>({
|
|
cachedRecord,
|
|
objectMetadataItem,
|
|
updateRecordInput,
|
|
}: {
|
|
cachedRecord: UpdatedObjectRecord & { __typename: string };
|
|
objectMetadataItem: ObjectMetadataItem;
|
|
updateRecordInput: Partial<Omit<UpdatedObjectRecord, 'id'>>;
|
|
}) =>
|
|
Object.entries(updateRecordInput).reduce<
|
|
Pick<
|
|
TriggerUpdateRelationFieldOptimisticEffectParams,
|
|
| 'relationObjectMetadataNameSingular'
|
|
| 'relationFieldName'
|
|
| 'previousRelationRecord'
|
|
| 'nextRelationRecord'
|
|
>[]
|
|
>((result, [fieldName, nextRelationRecord]) => {
|
|
const fieldDefinition = objectMetadataItem.fields.find(
|
|
(fieldMetadataItem) => fieldMetadataItem.name === fieldName,
|
|
);
|
|
|
|
if (fieldDefinition?.type !== FieldMetadataType.Relation)
|
|
return result;
|
|
|
|
const relationObjectMetadataNameSingular = (
|
|
fieldDefinition.toRelationMetadata?.fromObjectMetadata ||
|
|
fieldDefinition.fromRelationMetadata?.toObjectMetadata
|
|
)?.nameSingular;
|
|
const relationFieldMetadataId =
|
|
fieldDefinition.toRelationMetadata?.fromFieldMetadataId ||
|
|
fieldDefinition.fromRelationMetadata?.toFieldMetadataId;
|
|
|
|
if (!relationObjectMetadataNameSingular || !relationFieldMetadataId)
|
|
return result;
|
|
|
|
const relationObjectMetadataItem = snapshot
|
|
.getLoadable(
|
|
objectMetadataItemFamilySelector({
|
|
objectName: relationObjectMetadataNameSingular,
|
|
objectNameType: 'singular',
|
|
}),
|
|
)
|
|
.valueOrThrow();
|
|
|
|
if (!relationObjectMetadataItem) return result;
|
|
|
|
const relationFieldName = relationObjectMetadataItem.fields.find(
|
|
(fieldMetadataItem) =>
|
|
fieldMetadataItem.id === relationFieldMetadataId,
|
|
)?.name;
|
|
|
|
if (!relationFieldName) return result;
|
|
|
|
return [
|
|
...result,
|
|
{
|
|
relationObjectMetadataNameSingular,
|
|
relationFieldName,
|
|
previousRelationRecord: cachedRecord[fieldName],
|
|
nextRelationRecord,
|
|
},
|
|
];
|
|
}, []),
|
|
);
|