import { useContext } from "react"; import { useQueryClient, useMutation, UseMutationResult } from "react-query"; import { DataContext } from "@contexts/data"; import { IDataContext, BaseRecord, CreateManyResponse, HttpError, SuccessErrorNotification, MetaDataQuery, } from "../../interfaces"; import { useCacheQueries, useTranslate, usePublish } from "@hooks"; import { handleNotification } from "@definitions"; import pluralize from "pluralize"; type useCreateManyParams = { resource: string; values: TVariables[]; metaData?: MetaDataQuery; } & SuccessErrorNotification; export type UseCreateManyReturnType< TData extends BaseRecord = BaseRecord, TError = HttpError, TVariables = {}, > = UseMutationResult< CreateManyResponse, TError, useCreateManyParams, unknown >; /** * `useCreateMany` is a modified version of `react-query`'s {@link https://react-query.tanstack.com/reference/useMutation `useMutation`} for multiple create mutations. * * It uses `createMany` method as mutation function from the `dataProvider` which is passed to ``. * * @see {@link https://refine.dev/docs/api-references/hooks/data/useCreateMany} for more details. * * @typeParam TData - Result data of the query extends {@link https://refine.dev/docs/api-references/interfaceReferences#baserecord `BaseRecord`} * @typeParam TError - Custom error object that extends {@link https://refine.dev/docs/api-references/interfaceReferences#httperror `HttpError`} * @typeParam TVariables - Values for mutation function * */ export const useCreateMany = < TData extends BaseRecord = BaseRecord, TError extends HttpError = HttpError, TVariables = {}, >(): UseCreateManyReturnType => { const { createMany } = useContext(DataContext); const getAllQueries = useCacheQueries(); const translate = useTranslate(); const queryClient = useQueryClient(); const publish = usePublish(); const mutation = useMutation< CreateManyResponse, TError, useCreateManyParams >( ({ resource, values, metaData }: useCreateManyParams) => createMany({ resource, variables: values, metaData, }), { onSuccess: (response, { resource, successNotification }) => { const resourcePlural = pluralize.plural(resource); handleNotification(successNotification, { description: translate( "notifications.createSuccess", { resource: translate( `${resource}.${resource}`, resource, ), }, `Successfully created ${resourcePlural}`, ), message: translate("notifications.success", "Success"), type: "success", }); getAllQueries(resource).forEach((query) => { queryClient.invalidateQueries(query.queryKey); }); publish?.({ channel: `resources/${resource}`, type: "created", payload: { ids: response.data .filter((item) => item?.id !== undefined) .map((item) => item.id!.toString()), }, date: new Date(), }); }, onError: (err: TError, { resource, errorNotification }) => { handleNotification(errorNotification, { description: err.message, message: translate( "notifications.createError", { resource: translate( `${resource}.${resource}`, resource, ), statusCode: err.statusCode, }, `There was an error creating ${resource} (status code: ${err.statusCode}`, ), type: "error", }); }, }, ); return mutation; };