import { useContext } from "react"; import { QueryObserverResult, useQuery, UseQueryOptions } from "react-query"; import { ArgsProps } from "antd/lib/notification"; import { DataContext } from "@contexts/data"; import { CustomResponse, IDataContext, CrudSorting, CrudFilters, BaseRecord, HttpError, MetaDataQuery, } from "../../interfaces"; import { useTranslate, useCheckError } from "@hooks"; import { handleNotification } from "@definitions/helpers"; interface UseCustomConfig { sort?: CrudSorting; filters?: CrudFilters; query?: TQuery; payload?: TPayload; headers?: {}; } export type UseCustomProps = { url: string; method: "get" | "delete" | "head" | "options" | "post" | "put" | "patch"; config?: UseCustomConfig; queryOptions?: UseQueryOptions, TError>; successNotification?: ArgsProps | false; errorNotification?: ArgsProps | false; metaData?: MetaDataQuery; }; /** * `useCustom` is a modified version of `react-query`'s {@link https://react-query.tanstack.com/guides/queries `useQuery`} used for custom requests. * * It uses the `custom` method from the `dataProvider` which is passed to ``. * * @see {@link https://refine.dev/docs/api-references/hooks/data/useCustom} 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 TQuery - Values for query params * @typeParam TPayload - Values for params * */ export const useCustom = < TData = BaseRecord, TError extends HttpError = HttpError, TQuery = unknown, TPayload = unknown, >({ url, method, config, queryOptions, successNotification, errorNotification, metaData, }: UseCustomProps): QueryObserverResult< CustomResponse, TError > => { const { custom } = useContext(DataContext); const { mutate: checkError } = useCheckError(); const translate = useTranslate(); const queryResponse = useQuery, TError>( [`custom/${method}-${url}`, { ...config, ...metaData }], () => custom({ url, method, ...config, metaData }), { ...queryOptions, onSuccess: (data) => { queryOptions?.onSuccess?.(data); handleNotification(successNotification); }, onError: (err: TError) => { checkError(err); queryOptions?.onError?.(err); handleNotification(errorNotification, { key: `${method}-notification`, message: translate( "common:notifications.error", { statusCode: err.statusCode }, `Error (status code: ${err.statusCode})`, ), description: err.message, type: "error", }); }, }, ); return queryResponse; };