Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/stale-jobs-pump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@cube-dev/ui-kit': minor
---

Add useDialogContainer hook to manage dialogs.
39 changes: 39 additions & 0 deletions src/components/overlays/Dialog/dialog-container.tsx
Original file line number Diff line number Diff line change
@@ -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<P>(Component: React.ComponentType<P>) {
const [isOpen, setIsOpen] = useState(false);
const [componentProps, setComponentProps] = useState<P | null>(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 (
<DialogContainer isOpen={isOpen} onDismiss={close}>
<Component {...componentProps} />
</DialogContainer>
);
}, [componentProps, isOpen]);

return { open, close, rendered };
}
1 change: 1 addition & 0 deletions src/components/overlays/Dialog/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './DialogContainer';
export * from './DialogForm';
export * from './DialogTrigger';
export * from './Dialog';
export * from './dialog-container';
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export {
DialogTrigger,
DialogContainer,
DialogForm,
useDialogContainer,
} from './components/overlays/Dialog';
export type {
CubeDialogTriggerProps,
Expand Down
Loading