From 93523ca84f767c6f953d95881b069efc6cc1adbe Mon Sep 17 00:00:00 2001 From: Damien Clarke Date: Mon, 10 Jan 2022 15:47:49 +1100 Subject: [PATCH] fix: remount Branch component if base form changes --- packages/dendriform/src/Dendriform.tsx | 4 ++-- packages/dendriform/test/Dendriform.test.tsx | 25 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/dendriform/src/Dendriform.tsx b/packages/dendriform/src/Dendriform.tsx index 6c96fa0..0fc67d7 100644 --- a/packages/dendriform/src/Dendriform.tsx +++ b/packages/dendriform/src/Dendriform.tsx @@ -962,7 +962,7 @@ export class Dendriform { const renderer = aIsRenderer ? a : b; const deps = aIsRenderer ? b : c; const form = aIsRenderer ? this : this.branch(a); - return renderer(form)} deps={deps} />; + return renderer(form)} deps={deps} />; } renderAll, K2 extends keyof Val, K3 extends keyof Val,K2>, K4 extends keyof Val,K2>,K3>, W extends Val,K2>,K3>[K4]>(path: [K1, K2, K3, K4], renderer: Renderer,P>>, deps?: unknown[]): React.ReactElement; @@ -988,7 +988,7 @@ export class Dendriform { }); }; - return ; + return ; } } diff --git a/packages/dendriform/test/Dendriform.test.tsx b/packages/dendriform/test/Dendriform.test.tsx index 0ded781..ba7fa0d 100644 --- a/packages/dendriform/test/Dendriform.test.tsx +++ b/packages/dendriform/test/Dendriform.test.tsx @@ -21,6 +21,13 @@ type MyComponentProps = { form: Dendriform; }; +type MyComponentIndexProps = { + foo: number; + bar?: number; + form: Dendriform; + index: number; +}; + type NotSetTestValue = { foo?: string; bar?: string; @@ -1121,6 +1128,24 @@ describe(`Dendriform`, () => { expect(renderer).toHaveBeenCalledTimes(2); }); + test(`should render one level with changing form`, () => { + const form = new Dendriform(['A','B','C']); + + const renderer = jest.fn(form =>
{form.value}
); + + const MyComponent = (props: MyComponentIndexProps) => { + return props.form.render(props.index, renderer, [props.foo]); + }; + + const wrapper = mount(); + + expect(renderer).toHaveBeenCalledTimes(1); + + // should update if base form change + wrapper.setProps({foo: 1, bar: 1, form, index: 1}); + expect(renderer).toHaveBeenCalledTimes(2); + }); + test(`should render multiple levels with deps`, () => { const form = new Dendriform([[['A','B']]]);