Skip to content

Commit c3d2470

Browse files
author
deepshekhardas
committed
fix(core): prevent cached show page data in create forms
1 parent 779d52a commit c3d2470

4 files changed

Lines changed: 19 additions & 5 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
"@refinedev/refine-core": patch
3+
"@refinedev/refine-react-hook-form": patch
4+
---
5+
6+
fix(core, react-hook-form): prevent cached show-page data from overwriting create modal defaultValues
7+
8+
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.
9+
10+
- **core:** Don't pass `id` to `useOne` for create actions, preventing the cache key collision at the source.
11+
- **react-hook-form:** Guard the `useModalForm` visibility reset effect against create actions.

‎packages/core/src/hooks/form/index.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export const useForm = <
156156

157157
const queryResult = useOne<TQueryFnData, TError, TData>({
158158
resource: identifier,
159-
id,
159+
id: isCreate ? undefined : id,
160160
queryOptions: {
161161
// Only enable the query if it's not a create action and the `id` is defined
162162
...props.queryOptions,

‎packages/react-hook-form/src/useModalForm/index.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export const useModalForm = <
187187

188188
// compensate for setting of initial form values in useForm since it doesnt track modal visibility
189189
React.useEffect(() => {
190-
if (!visible || !query?.data?.data) return;
190+
if (!visible || !query?.data?.data || action === "create") return;
191191

192192
const formData = query.data.data;
193193
if (!formData) return;
@@ -197,7 +197,7 @@ export const useModalForm = <
197197
keepDirtyValues: true,
198198
}),
199199
});
200-
}, [visible, query?.data?.data, autoResetFormWhenClose]);
200+
}, [visible, query?.data?.data, autoResetFormWhenClose, action]);
201201

202202
React.useEffect(() => {
203203
if (initiallySynced === false && syncWithLocationKey) {

‎packages/react-hook-form/test/index.tsx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
type IResourceItem,
77
type I18nProvider,
88
type IRefineOptions,
9+
type RouterProvider,
910
} from "@refinedev/core";
1011

1112
import { MockJSONServer, mockRouterProvider } from "./dataMocks";
@@ -15,6 +16,7 @@ interface ITestWrapperProps {
1516
dataProvider?: DataProvider;
1617
resources?: IResourceItem[];
1718
routerInitialEntries?: string[];
19+
routerProvider?: RouterProvider;
1820
i18nProvider?: I18nProvider;
1921
options?: IRefineOptions;
2022
}
@@ -25,6 +27,7 @@ export const TestWrapper: (
2527
dataProvider,
2628
resources,
2729
routerInitialEntries,
30+
routerProvider,
2831
i18nProvider,
2932
options,
3033
}) => {
@@ -34,12 +37,12 @@ export const TestWrapper: (
3437
<Refine
3538
i18nProvider={i18nProvider}
3639
dataProvider={dataProvider ?? MockJSONServer}
37-
routerProvider={mockRouterProvider()}
40+
routerProvider={routerProvider ?? mockRouterProvider()}
3841
resources={resources ?? [{ name: "posts" }]}
3942
options={{
4043
...options,
4144
reactQuery: {
42-
clientConfig: {
45+
clientConfig: options?.reactQuery?.clientConfig ?? {
4346
defaultOptions: {
4447
queries: {
4548
retry: false,

0 commit comments

Comments
 (0)