From 5b0d4d8038e770fc601c8332b81e78245b2e8eb7 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 12 Feb 2026 15:54:42 +0100 Subject: [PATCH 1/2] feat: added invalidation map --- src/assets/useMutationEffects.ts | 10 +++++++--- src/lib/config/queryConfig.context.tsx | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/assets/useMutationEffects.ts b/src/assets/useMutationEffects.ts index fa422d2..4fb14b2 100644 --- a/src/assets/useMutationEffects.ts +++ b/src/assets/useMutationEffects.ts @@ -1,6 +1,6 @@ import { useCallback } from "react"; -import { OpenApiQueryConfig } from "@povio/openapi-codegen-cli"; +import { OpenApiQueryConfig } from "../lib/config/queryConfig.context"; import { QueryKey, useQueryClient } from "@tanstack/react-query"; import { QueryModule } from "./queryModules"; @@ -40,7 +40,11 @@ export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyEqual(queryKey, key)); - return isCurrentModule || isInvalidateModule || isInvalidateKey; + + const map = config.invalidationMap?.[currentModule]; + const isMappedKey = !!map && map.some((key) => isQueryKeyEqual(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; }, }); @@ -48,7 +52,7 @@ export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); } }, - [queryClient, currentModule, config.preferUpdate], + [queryClient, currentModule, config.preferUpdate, config.invalidationMap], ); return { runMutationEffects }; diff --git a/src/lib/config/queryConfig.context.tsx b/src/lib/config/queryConfig.context.tsx index ba109a0..57d02cd 100644 --- a/src/lib/config/queryConfig.context.tsx +++ b/src/lib/config/queryConfig.context.tsx @@ -1,18 +1,28 @@ import { createContext, use, useMemo } from "react"; import { PropsWithChildren } from "react"; +import type { QueryKey } from "@tanstack/react-query"; export namespace OpenApiQueryConfig { - interface Type { + export interface Type { preferUpdate?: boolean; invalidateCurrentModule?: boolean; + invalidationMap?: Record; } const Context = createContext({}); type ProviderProps = Type; - export const Provider = ({ preferUpdate, invalidateCurrentModule, children }: PropsWithChildren) => { - const value = useMemo(() => ({ preferUpdate, invalidateCurrentModule }), [preferUpdate, invalidateCurrentModule]); + export const Provider = ({ + preferUpdate, + invalidateCurrentModule, + invalidationMap, + children, + }: PropsWithChildren) => { + const value = useMemo( + () => ({ preferUpdate, invalidateCurrentModule, invalidationMap }), + [preferUpdate, invalidateCurrentModule, invalidationMap], + ); return {children}; }; From d34402b3ecf89fecbc790c1fa9e5fd0171b1b873 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 12 Feb 2026 16:14:00 +0100 Subject: [PATCH 2/2] feat: added invalidation map --- src/assets/useMutationEffects.ts | 11 +++++++++-- src/lib/config/queryConfig.context.tsx | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/assets/useMutationEffects.ts b/src/assets/useMutationEffects.ts index 4fb14b2..5558247 100644 --- a/src/assets/useMutationEffects.ts +++ b/src/assets/useMutationEffects.ts @@ -10,6 +10,7 @@ export interface MutationEffectsOptions { invalidateModules?: QueryModule[]; invalidateKeys?: QueryKey[]; preferUpdate?: boolean; + context?: any; } export interface UseMutationEffectsProps { @@ -22,7 +23,13 @@ export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { const runMutationEffects = useCallback( async (data: TData, options: MutationEffectsOptions = {}, updateKeys?: QueryKey[]) => { - const { invalidateCurrentModule = true, invalidateModules, invalidateKeys, preferUpdate } = options; + const { + invalidateCurrentModule = true, + invalidateModules, + invalidateKeys, + preferUpdate, + context, + } = options; const shouldUpdate = preferUpdate || (preferUpdate === undefined && config.preferUpdate); const shouldInvalidateCurrentModule = invalidateCurrentModule || (invalidateCurrentModule === undefined && config.invalidateCurrentModule); @@ -41,7 +48,7 @@ export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyEqual(queryKey, key)); - const map = config.invalidationMap?.[currentModule]; + const map = config.invalidationMap?.(context)?.[currentModule]; const isMappedKey = !!map && map.some((key) => isQueryKeyEqual(queryKey, key)); return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; diff --git a/src/lib/config/queryConfig.context.tsx b/src/lib/config/queryConfig.context.tsx index 57d02cd..1f9dfe0 100644 --- a/src/lib/config/queryConfig.context.tsx +++ b/src/lib/config/queryConfig.context.tsx @@ -6,7 +6,7 @@ export namespace OpenApiQueryConfig { export interface Type { preferUpdate?: boolean; invalidateCurrentModule?: boolean; - invalidationMap?: Record; + invalidationMap?: (context?: any) => Record; } const Context = createContext({});