From 7c9fa596198012ae791a62862a881df8b56aa981 Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 14:44:54 +0100 Subject: [PATCH 1/4] feat(Dialog): add useDialogContainer hook --- src/components/overlays/Dialog/DialogForm.tsx | 5 ++++- .../overlays/Dialog/dialog-container.tsx | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/overlays/Dialog/DialogForm.tsx b/src/components/overlays/Dialog/DialogForm.tsx index c7141d744..400e127a7 100644 --- a/src/components/overlays/Dialog/DialogForm.tsx +++ b/src/components/overlays/Dialog/DialogForm.tsx @@ -85,7 +85,10 @@ export function DialogForm( onDismiss?.(); if (!preserve) { - form?.resetFields(); + // let animations finish before resetting the form + setTimeout(() => { + form?.resetFields(); + }, 250); } } diff --git a/src/components/overlays/Dialog/dialog-container.tsx b/src/components/overlays/Dialog/dialog-container.tsx index 809b5c006..2107a70ea 100644 --- a/src/components/overlays/Dialog/dialog-container.tsx +++ b/src/components/overlays/Dialog/dialog-container.tsx @@ -1,9 +1,23 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, ReactElement } from 'react'; import { useEvent } from '../../../_internal/index'; import { DialogContainer } from './DialogContainer'; +// Overload for dialogs that expect no props +export function useDialogContainer(Component: React.ComponentType<{}>): { + open: () => void; + close: () => void; + rendered: ReactElement | null; +}; + +// Overload for dialogs that require props +export function useDialogContainer

(Component: React.ComponentType

): { + open: (props: P) => void; + close: () => void; + rendered: ReactElement | null; +}; + /** * Generic hook to manage a dialog component. * @@ -16,7 +30,7 @@ export function useDialogContainer

(Component: React.ComponentType

) { // 'open' accepts props required by the Component and opens the dialog const open = useEvent((props: P) => { - setComponentProps(props); + setComponentProps(props === undefined ? ({} as P) : props); setIsOpen(true); }); From 7b18b49adef2dc25a04eb98c6bdbfefc5a320474 Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 14:52:29 +0100 Subject: [PATCH 2/4] feat(Dialog): add useDialogContainer hook * 2 --- .../overlays/Dialog/dialog-container.tsx | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/components/overlays/Dialog/dialog-container.tsx b/src/components/overlays/Dialog/dialog-container.tsx index 2107a70ea..809b5c006 100644 --- a/src/components/overlays/Dialog/dialog-container.tsx +++ b/src/components/overlays/Dialog/dialog-container.tsx @@ -1,23 +1,9 @@ -import React, { useState, useMemo, ReactElement } from 'react'; +import React, { useState, useMemo } from 'react'; import { useEvent } from '../../../_internal/index'; import { DialogContainer } from './DialogContainer'; -// Overload for dialogs that expect no props -export function useDialogContainer(Component: React.ComponentType<{}>): { - open: () => void; - close: () => void; - rendered: ReactElement | null; -}; - -// Overload for dialogs that require props -export function useDialogContainer

(Component: React.ComponentType

): { - open: (props: P) => void; - close: () => void; - rendered: ReactElement | null; -}; - /** * Generic hook to manage a dialog component. * @@ -30,7 +16,7 @@ export function useDialogContainer

(Component: React.ComponentType

) { // 'open' accepts props required by the Component and opens the dialog const open = useEvent((props: P) => { - setComponentProps(props === undefined ? ({} as P) : props); + setComponentProps(props); setIsOpen(true); }); From a643c9f2633ac496dc5de323e7a7bb870f0b8ab2 Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 15:02:24 +0100 Subject: [PATCH 3/4] feat(Dialog): add useDialogContainer hook * 3 --- src/components/overlays/Dialog/DialogForm.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/overlays/Dialog/DialogForm.tsx b/src/components/overlays/Dialog/DialogForm.tsx index 400e127a7..4d3c969b1 100644 --- a/src/components/overlays/Dialog/DialogForm.tsx +++ b/src/components/overlays/Dialog/DialogForm.tsx @@ -123,7 +123,10 @@ export function DialogForm( onClose?.(); if (!preserve) { - form?.resetFields(); + // let animations finish before resetting the form + setTimeout(() => { + form.resetFields(); + }, 250); } }} onSubmitFailed={onSubmitFailed} From 0dcfbffbbef5e3c2be02f1a38e683130e7e2f83a Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 15:08:40 +0100 Subject: [PATCH 4/4] feat(Dialog): add useDialogContainer hook * 4 --- .changeset/great-shoes-speak.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/great-shoes-speak.md diff --git a/.changeset/great-shoes-speak.md b/.changeset/great-shoes-speak.md new file mode 100644 index 000000000..b08714086 --- /dev/null +++ b/.changeset/great-shoes-speak.md @@ -0,0 +1,5 @@ +--- +'@cube-dev/ui-kit': patch +--- + +Postpone form reset in DialogForm until closing transition is over.