/
dimaWebexplorer
/
investmentAssistant
Обзор
Документация
Войти
/
dimaWebexplorer
/
investmentAssistant
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
llmcode
frontend/src/shared/api/createQueryHelper.ts
66 строк
2 KB
Дима
added frontend
07 ноя 2025, 02:03
07 ноя 2025, 02:03
931d048
Код
Авторство
О чём код?
import { useQuery, useMutation, useQueryClient, type UseQueryOptions, type UseMutationOptions, } from "@tanstack/react-query"; type QueryFactory<TData> = { queryKey: readonly unknown[]; queryFn: () => Promise<TData>; options?: Omit<UseQueryOptions<TData, Error, TData, readonly unknown[]>, "queryKey" | "queryFn">; }; type MutationFactory<TData, TVariables> = { mutationFn: (variables: TVariables) => Promise<TData>; invalidate?: readonly unknown[][]; updateQuery?: { key: readonly unknown[]; updater: (oldData: any, newData: TData) => any; }; options?: UseMutationOptions<TData, Error, TVariables>; }; export function createQueryHook<TData>(factory: QueryFactory<TData>) { return ( additionalOptions?: Omit< UseQueryOptions<TData, Error, TData, readonly unknown[]>, "queryKey" | "queryFn" > ) => useQuery<TData>({ queryKey: factory.queryKey, queryFn: factory.queryFn, ...factory.options, ...additionalOptions, }); } export function createMutationHook<TData, TVariables>(factory: MutationFactory<TData, TVariables>) { return (additionalOptions?: Omit<UseMutationOptions<TData, Error, TVariables>, "mutationFn">) => { const queryClient = useQueryClient(); return useMutation<TData, Error, TVariables>({ mutationFn: factory.mutationFn, ...factory.options, ...additionalOptions, onSuccess: (data, variables, context) => { if (factory.invalidate) { for (const key of factory.invalidate) { queryClient.invalidateQueries({ queryKey: key, exact: false }); } } if (factory.updateQuery) { queryClient.setQueryData(factory.updateQuery.key, (old: TData | undefined) => factory.updateQuery!.updater(old, data) ); } factory.options?.onSuccess?.(data, variables, context); additionalOptions?.onSuccess?.(data, variables, context); }, }); }; }