From c3d2470d69c2db3dcb03952aa8857a0d5f4978f3 Mon Sep 17 00:00:00 2001 From: deepshekhardas Date: Sat, 18 Jul 2026 12:36:43 +0530 Subject: [PATCH] fix(core): prevent cached show page data in create forms --- .changeset/fix-create-modal-cached-data.md | 11 +++++++++++ packages/core/src/hooks/form/index.ts | 2 +- packages/react-hook-form/src/useModalForm/index.ts | 4 ++-- packages/react-hook-form/test/index.tsx | 7 +++++-- 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 .changeset/fix-create-modal-cached-data.md diff --git a/.changeset/fix-create-modal-cached-data.md b/.changeset/fix-create-modal-cached-data.md new file mode 100644 index 0000000000000..be590b110d299 --- /dev/null +++ b/.changeset/fix-create-modal-cached-data.md @@ -0,0 +1,11 @@ +--- +"@refinedev/refine-core": patch +"@refinedev/refine-react-hook-form": patch +--- + +fix(core, react-hook-form): prevent cached show-page data from overwriting create modal defaultValues + +When opening a create modal on a show page for the same resource, the form's `defaultValues` were overwritten by cached data from the show page's `useOne` query. This happened because `useForm` passed the URL-derived `id` to `useOne` even for create actions, causing a query key collision with the cached entry. + +- **core:** Don't pass `id` to `useOne` for create actions, preventing the cache key collision at the source. +- **react-hook-form:** Guard the `useModalForm` visibility reset effect against create actions. diff --git a/packages/core/src/hooks/form/index.ts b/packages/core/src/hooks/form/index.ts index 10facf3d0e7c5..2e41bfd8a807d 100644 --- a/packages/core/src/hooks/form/index.ts +++ b/packages/core/src/hooks/form/index.ts @@ -156,7 +156,7 @@ export const useForm = < const queryResult = useOne({ resource: identifier, - id, + id: isCreate ? undefined : id, queryOptions: { // Only enable the query if it's not a create action and the `id` is defined ...props.queryOptions, diff --git a/packages/react-hook-form/src/useModalForm/index.ts b/packages/react-hook-form/src/useModalForm/index.ts index 3895c50aad1c9..aa028d7e0a1ee 100644 --- a/packages/react-hook-form/src/useModalForm/index.ts +++ b/packages/react-hook-form/src/useModalForm/index.ts @@ -187,7 +187,7 @@ export const useModalForm = < // compensate for setting of initial form values in useForm since it doesnt track modal visibility React.useEffect(() => { - if (!visible || !query?.data?.data) return; + if (!visible || !query?.data?.data || action === "create") return; const formData = query.data.data; if (!formData) return; @@ -197,7 +197,7 @@ export const useModalForm = < keepDirtyValues: true, }), }); - }, [visible, query?.data?.data, autoResetFormWhenClose]); + }, [visible, query?.data?.data, autoResetFormWhenClose, action]); React.useEffect(() => { if (initiallySynced === false && syncWithLocationKey) { diff --git a/packages/react-hook-form/test/index.tsx b/packages/react-hook-form/test/index.tsx index 0c2ce0fb2e8de..54cb490cb530f 100644 --- a/packages/react-hook-form/test/index.tsx +++ b/packages/react-hook-form/test/index.tsx @@ -6,6 +6,7 @@ import { type IResourceItem, type I18nProvider, type IRefineOptions, + type RouterProvider, } from "@refinedev/core"; import { MockJSONServer, mockRouterProvider } from "./dataMocks"; @@ -15,6 +16,7 @@ interface ITestWrapperProps { dataProvider?: DataProvider; resources?: IResourceItem[]; routerInitialEntries?: string[]; + routerProvider?: RouterProvider; i18nProvider?: I18nProvider; options?: IRefineOptions; } @@ -25,6 +27,7 @@ export const TestWrapper: ( dataProvider, resources, routerInitialEntries, + routerProvider, i18nProvider, options, }) => { @@ -34,12 +37,12 @@ export const TestWrapper: (