|
import React from 'react' |
|
import * as Dialog from '@radix-ui/react-dialog' |
|
import { Cross2Icon } from '@radix-ui/react-icons' |
|
import classes from './styles.module.css' |
|
import NiceModal, { useModal } from '@ebay/nice-modal-react' |
|
import { debounce } from 'lodash-es' |
|
import classNames from 'classnames' |
|
|
|
const { |
|
DialogOverlay, |
|
DialogContent, |
|
DialogTitle, |
|
DialogDescription, |
|
Button, |
|
IconButton, |
|
green, |
|
} = classes |
|
|
|
const MyDialog = NiceModal.create<{ |
|
title?: string |
|
description?: string |
|
children?: React.ReactNode |
|
button?: string |
|
}>(({ title, description, children, button }) => { |
|
const modal = useModal() |
|
return ( |
|
<Dialog.Root |
|
defaultOpen={true} |
|
open={modal.visible} |
|
onOpenChange={(value) => { |
|
if (value) modal.show() |
|
else modal.hide() |
|
}} |
|
> |
|
<Dialog.Portal> |
|
<Dialog.Overlay className={DialogOverlay} /> |
|
<Dialog.Content className={DialogContent}> |
|
<Dialog.Title className={DialogTitle}>{title}</Dialog.Title> |
|
<Dialog.Description className={DialogDescription}> |
|
{description} |
|
</Dialog.Description> |
|
<div> {children}</div> |
|
<div |
|
style={{ |
|
display: 'flex', |
|
marginTop: 25, |
|
justifyContent: 'flex-end', |
|
}} |
|
> |
|
<Dialog.Close asChild> |
|
<button |
|
className={classNames(Button, green)} |
|
onClick={() => { |
|
modal.resolve('action') |
|
}} |
|
> |
|
{button} |
|
</button> |
|
</Dialog.Close> |
|
</div> |
|
<Dialog.Close asChild> |
|
<button className={IconButton}> |
|
<Cross2Icon /> |
|
</button> |
|
</Dialog.Close> |
|
</Dialog.Content> |
|
</Dialog.Portal> |
|
</Dialog.Root> |
|
) |
|
}) |
|
|
|
declare type NiceModalArgs<T> = T extends |
|
| keyof JSX.IntrinsicElements |
|
| React.JSXElementConstructor<any> |
|
? Omit<React.ComponentProps<T>, 'id'> |
|
: Record<string, unknown> |
|
|
|
export type ShowProps = NiceModalArgs<typeof MyDialog> |
|
|
|
export function GetDialog(wait = 0) { |
|
const show = debounce((props: ShowProps) => { |
|
NiceModal.show(MyDialog, props) |
|
}, wait) |
|
|
|
return { |
|
show: (props: ShowProps) => { |
|
show(props) |
|
}, |
|
hide: () => { |
|
show.cancel() |
|
HideDialog() |
|
}, |
|
} |
|
} |
|
|
|
export async function ShowDialog(props: ShowProps): Promise<string> { |
|
console.log(props) |
|
return await NiceModal.show(MyDialog, props) |
|
} |
|
|
|
export function HideDialog() { |
|
return NiceModal.hide(MyDialog) |
|
} |
|
|