From d7360e797402e9b2bf4311fb32e445d32f7f8df3 Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 12:08:36 +0100 Subject: [PATCH 1/3] feat(Dialog): add useDialogContainer hook --- .changeset/stale-jobs-pump.md | 5 +++ .../overlays/Dialog/dialog-container.tsx | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 .changeset/stale-jobs-pump.md create mode 100644 src/components/overlays/Dialog/dialog-container.tsx diff --git a/.changeset/stale-jobs-pump.md b/.changeset/stale-jobs-pump.md new file mode 100644 index 000000000..6b5c9e8f8 --- /dev/null +++ b/.changeset/stale-jobs-pump.md @@ -0,0 +1,5 @@ +--- +'@cube-dev/ui-kit': minor +--- + +Add useDialogContainer hook to manage dialogs. diff --git a/src/components/overlays/Dialog/dialog-container.tsx b/src/components/overlays/Dialog/dialog-container.tsx new file mode 100644 index 000000000..809b5c006 --- /dev/null +++ b/src/components/overlays/Dialog/dialog-container.tsx @@ -0,0 +1,39 @@ +import React, { useState, useMemo } from 'react'; + +import { useEvent } from '../../../_internal/index'; + +import { DialogContainer } from './DialogContainer'; + +/** + * Generic hook to manage a dialog component. + * + * @param Component - A React component that represents the dialog content. It must accept props of type P. + * @returns An object with `open` function to open the dialog with provided props and `rendered` JSX element to include in your component tree. + */ +export function useDialogContainer

(Component: React.ComponentType

) { + const [isOpen, setIsOpen] = useState(false); + const [componentProps, setComponentProps] = useState

(null); + + // 'open' accepts props required by the Component and opens the dialog + const open = useEvent((props: P) => { + setComponentProps(props); + setIsOpen(true); + }); + + const close = useEvent(() => { + setIsOpen(false); + }); + + // Render the dialog only when componentProps is set + const rendered = useMemo(() => { + if (!componentProps) return null; + + return ( + + + + ); + }, [componentProps, isOpen]); + + return { open, close, rendered }; +} From 56d6cbc606ed2f8d53e43aad87f1e845a71f168c Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 12:22:30 +0100 Subject: [PATCH 2/3] feat(Dialog): add useDialogContainer hook * 2 --- src/components/overlays/Dialog/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/overlays/Dialog/index.ts b/src/components/overlays/Dialog/index.ts index 90b118522..3eecaa079 100644 --- a/src/components/overlays/Dialog/index.ts +++ b/src/components/overlays/Dialog/index.ts @@ -2,3 +2,4 @@ export * from './DialogContainer'; export * from './DialogForm'; export * from './DialogTrigger'; export * from './Dialog'; +export * from './dialog-container'; From 7ddaec9f0857e9100750623aa5359d47f5d176a3 Mon Sep 17 00:00:00 2001 From: Andrey Yamanov Date: Tue, 25 Mar 2025 12:25:02 +0100 Subject: [PATCH 3/3] feat(Dialog): add useDialogContainer hook * 3 --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 89b6b79c6..9637b208c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -88,6 +88,7 @@ export { DialogTrigger, DialogContainer, DialogForm, + useDialogContainer, } from './components/overlays/Dialog'; export type { CubeDialogTriggerProps,