import { z } from 'zod'; import { useAppDispatch, useLoading } from 'soapbox/hooks'; import { importEntities } from '../actions'; import { parseEntitiesPath } from './utils'; import type { Entity } from '../types'; import type { EntityCallbacks, EntityFn, EntitySchema, ExpandedEntitiesPath } from './types'; interface UseCreateEntityOpts { schema?: EntitySchema } function useCreateEntity( expandedPath: ExpandedEntitiesPath, entityFn: EntityFn, opts: UseCreateEntityOpts = {}, ) { const dispatch = useAppDispatch(); const [isLoading, setPromise] = useLoading(); const { entityType, listKey } = parseEntitiesPath(expandedPath); async function createEntity(data: Data, callbacks: EntityCallbacks = {}): Promise { try { const result = await setPromise(entityFn(data)); const schema = opts.schema || z.custom(); const entity = schema.parse(result.data); // TODO: optimistic updating dispatch(importEntities([entity], entityType, listKey)); if (callbacks.onSuccess) { callbacks.onSuccess(entity); } } catch (error) { if (callbacks.onError) { callbacks.onError(error); } } } return { createEntity, isLoading, }; } export { useCreateEntity };