import { useMutation } from '@apollo/client'; import { useOptimisticEffect } from '@/apollo/optimistic-effect/hooks/useOptimisticEffect'; import { Currency, FieldMetadataType } from '~/generated-metadata/graphql'; import { capitalize } from '~/utils/string/capitalize'; import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier'; import { useFindOneObjectMetadataItem } from './useFindOneObjectMetadataItem'; const defaultFieldValues: Record = { [FieldMetadataType.Money]: { amount: null, currency: Currency.Usd }, [FieldMetadataType.Boolean]: false, [FieldMetadataType.Date]: null, [FieldMetadataType.Email]: '', [FieldMetadataType.Enum]: null, [FieldMetadataType.Number]: null, [FieldMetadataType.Relation]: null, [FieldMetadataType.Phone]: '', [FieldMetadataType.Text]: '', [FieldMetadataType.Url]: { link: '', text: '' }, [FieldMetadataType.Uuid]: '', }; export const useCreateOneObject = ({ objectNamePlural, }: Pick) => { const { triggerOptimisticEffects } = useOptimisticEffect(); const { foundObjectMetadataItem, objectNotFoundInMetadata, createOneMutation, } = useFindOneObjectMetadataItem({ objectNamePlural, }); // TODO: type this with a minimal type at least with Record const [mutate] = useMutation(createOneMutation); const createOneObject = foundObjectMetadataItem ? async (input: Record) => { const createdObject = await mutate({ variables: { input: { ...foundObjectMetadataItem.fields.reduce( (result, field) => ({ ...result, [field.name]: defaultFieldValues[field.type], }), {}, ), ...input, }, }, }); triggerOptimisticEffects( `${capitalize(foundObjectMetadataItem.nameSingular)}Edge`, createdObject.data[ `create${capitalize(foundObjectMetadataItem.nameSingular)}` ], ); } : undefined; return { createOneObject, objectNotFoundInMetadata, }; };