45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import {
|
|
MutationCache,
|
|
QueryClient,
|
|
type MutationMeta,
|
|
} from "@tanstack/react-query";
|
|
|
|
import i18n from "../i18n";
|
|
import { toastManager } from "../toast/toast-manager";
|
|
import { errorMessageKey } from "./error-message";
|
|
|
|
function mutationErrorMessage(
|
|
error: unknown,
|
|
meta: MutationMeta | undefined,
|
|
): string {
|
|
if (meta?.errorMessage) return i18n.t(meta.errorMessage);
|
|
const { key, opts } = errorMessageKey(error);
|
|
return i18n.t(key, opts);
|
|
}
|
|
|
|
/** Builds the app's QueryClient, including the MutationCache that bridges every
|
|
* mutation to the toast region (catch-all error toast + opt-in success toast).
|
|
* Shared by main.tsx and tests so the toast wiring stays consistent. */
|
|
export function makeQueryClient(): QueryClient {
|
|
return new QueryClient({
|
|
defaultOptions: { queries: { retry: false, refetchOnWindowFocus: false } },
|
|
mutationCache: new MutationCache({
|
|
onError: (error, _vars, _ctx, mutation) => {
|
|
if (mutation.meta?.suppressErrorToast) return;
|
|
toastManager.add({
|
|
type: "error",
|
|
description: mutationErrorMessage(error, mutation.meta),
|
|
});
|
|
},
|
|
onSuccess: (_data, _vars, _ctx, mutation) => {
|
|
if (mutation.meta?.successMessage) {
|
|
toastManager.add({
|
|
type: "success",
|
|
description: i18n.t(mutation.meta.successMessage),
|
|
});
|
|
}
|
|
},
|
|
}),
|
|
});
|
|
}
|