Hotfix Rule: Force Fresh Data After CRUD Mutation

Task-h not implements
This commit is contained in:
phaichayon
2026-06-16 11:59:41 +07:00
parent 357414c247
commit 56683ee7b9
16 changed files with 763 additions and 186 deletions

View File

@@ -9,35 +9,61 @@ import {
import { documentTemplateKeys } from './queries';
import type { DocumentTemplateMutationPayload, DocumentTemplateVersionMutationPayload } from './types';
async function invalidateDocumentTemplateLists() {
await getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.lists() });
}
async function invalidateDocumentTemplateDetail(id: string) {
await getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.detail(id) });
}
async function invalidateDocumentTemplateVersions(id: string) {
await getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.versions(id) });
}
export const createDocumentTemplateMutation = mutationOptions({
mutationFn: (data: DocumentTemplateMutationPayload) => createDocumentTemplate(data),
onSuccess: () => {
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.all });
onSettled: async (_data, error) => {
if (!error) {
await invalidateDocumentTemplateLists();
}
}
});
export const updateDocumentTemplateMutation = mutationOptions({
mutationFn: ({ id, values }: { id: string; values: Partial<DocumentTemplateMutationPayload> }) =>
updateDocumentTemplate(id, values),
onSuccess: (_data, variables) => {
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.all });
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.detail(variables.id) });
onSettled: async (_data, error, variables) => {
if (!error) {
await Promise.all([
invalidateDocumentTemplateLists(),
invalidateDocumentTemplateDetail(variables.id)
]);
}
}
});
export const deleteDocumentTemplateMutation = mutationOptions({
mutationFn: (id: string) => deleteDocumentTemplate(id),
onSuccess: () => {
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.all });
onSettled: async (_data, error, id) => {
if (!error) {
getQueryClient().removeQueries({ queryKey: documentTemplateKeys.detail(id) });
getQueryClient().removeQueries({ queryKey: documentTemplateKeys.versions(id) });
await invalidateDocumentTemplateLists();
}
}
});
export const createDocumentTemplateVersionMutation = mutationOptions({
mutationFn: ({ id, values }: { id: string; values: DocumentTemplateVersionMutationPayload }) =>
createDocumentTemplateVersion(id, values),
onSuccess: (_data, variables) => {
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.all });
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.detail(variables.id) });
getQueryClient().invalidateQueries({ queryKey: documentTemplateKeys.versions(variables.id) });
onSettled: async (_data, error, variables) => {
if (!error) {
await Promise.all([
invalidateDocumentTemplateLists(),
invalidateDocumentTemplateDetail(variables.id),
invalidateDocumentTemplateVersions(variables.id)
]);
}
}
});

View File

@@ -4,10 +4,13 @@ import type { DocumentTemplateFilters } from './types';
export const documentTemplateKeys = {
all: ['crm-document-templates'] as const,
lists: () => [...documentTemplateKeys.all, 'list'] as const,
list: (filters: DocumentTemplateFilters) =>
[...documentTemplateKeys.all, 'list', filters] as const,
detail: (id: string) => [...documentTemplateKeys.all, 'detail', id] as const,
versions: (id: string) => [...documentTemplateKeys.all, 'versions', id] as const
[...documentTemplateKeys.lists(), filters] as const,
details: () => [...documentTemplateKeys.all, 'detail'] as const,
detail: (id: string) => [...documentTemplateKeys.details(), id] as const,
versionsRoot: () => [...documentTemplateKeys.all, 'versions'] as const,
versions: (id: string) => [...documentTemplateKeys.versionsRoot(), id] as const
};
export const documentTemplatesQueryOptions = (filters: DocumentTemplateFilters = {}) =>