Skip to content

Commit b7ff689

Browse files
committed
fix: provide updated props to resolveFields
1 parent c22b3a9 commit b7ff689

2 files changed

Lines changed: 28 additions & 14 deletions

File tree

packages/core/lib/__tests__/use-resolved-fields.spec.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ describe("use-resolved-fields", () => {
247247
});
248248
});
249249

250-
it("tracks lastFields when rerendering", async () => {
250+
it("calls resolver with appropriate fields on props change", async () => {
251251
const mockResolveFields = jest.fn().mockResolvedValue({
252252
title: { type: "textarea" },
253253
});
@@ -261,9 +261,13 @@ describe("use-resolved-fields", () => {
261261
params = renderHook(() => useResolvedFields());
262262
});
263263

264+
// update state and trigger re-render
264265
useAppContextMock.mockReturnValue({
265266
...context,
266-
state: { ...context.state, data: { root: { foo: "bar" } } }, // trigger re-render
267+
state: {
268+
...context.state,
269+
data: { ...context.state.data, root: { props: { foo: "bar" } } },
270+
},
267271
});
268272

269273
await act(() => {
@@ -275,20 +279,20 @@ describe("use-resolved-fields", () => {
275279
expect(result.current[0]).toEqual({ title: { type: "textarea" } });
276280
expect(result.current[1]).toBe(false);
277281
expect(mockResolveFields).toHaveBeenCalledTimes(2);
278-
expect(mockResolveFields).toHaveBeenCalledWith(
279-
{ props: {}, readOnly: undefined },
282+
expect(mockResolveFields.mock.calls[1]).toEqual([
283+
{ props: { foo: "bar" }, readOnly: undefined },
280284
{
281285
appState: {
282-
data: { content: [], root: { props: {} } },
286+
data: { content: [], root: { props: { foo: "bar" } } }, // props changed
283287
ui: { itemSelector: null },
284288
},
285-
changed: {},
289+
changed: { foo: true }, // track changed
286290
fields: { title: { type: "text" } },
287-
lastData: {},
288-
lastFields: { title: { type: "textarea" } },
291+
lastData: { props: {}, readOnly: undefined },
292+
lastFields: { title: { type: "textarea" } }, // track previous fields due to re-render
289293
parent: null,
290-
}
291-
);
294+
},
295+
]);
292296
});
293297
});
294298

packages/core/lib/use-resolved-fields.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,13 @@ export const useResolvedFields = (): [FieldsType, boolean] => {
5555
}
5656
) => defaultFields;
5757

58-
const componentData: ComponentOrRootData = selectedItem
59-
? selectedItem
60-
: { props: rootProps, readOnly: data.root.readOnly };
58+
const componentData: ComponentOrRootData = useMemo(
59+
() =>
60+
selectedItem
61+
? selectedItem
62+
: { props: rootProps, readOnly: data.root.readOnly },
63+
[selectedItem, rootProps, data.root.readOnly]
64+
);
6165

6266
const hasComponentResolver = selectedItem && componentConfig?.resolveFields;
6367
const hasRootResolver = !selectedItem && config.root?.resolveFields;
@@ -131,7 +135,13 @@ export const useResolvedFields = (): [FieldsType, boolean] => {
131135
}
132136
}
133137
setResolvedFields(defaultFields);
134-
}, [defaultFields, state.ui.itemSelector, hasResolver, parent]);
138+
}, [
139+
defaultFields,
140+
state.ui.itemSelector,
141+
hasResolver,
142+
parent,
143+
resolveFields,
144+
]);
135145

136146
useOnValueChange<ItemSelector | null>(
137147
state.ui.itemSelector,

0 commit comments

Comments
 (0)