dialog-wrapper.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { Fragment, useCallback } from 'react'
  2. import type { ReactNode } from 'react'
  3. import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'
  4. import cn from '@/utils/classnames'
  5. type DialogProps = {
  6. className?: string
  7. children: ReactNode
  8. show: boolean
  9. onClose?: () => void
  10. inWorkflow?: boolean
  11. }
  12. const DialogWrapper = ({
  13. className,
  14. children,
  15. show,
  16. onClose,
  17. inWorkflow = true,
  18. }: DialogProps) => {
  19. const close = useCallback(() => onClose?.(), [onClose])
  20. return (
  21. <Transition appear show={show} as={Fragment}>
  22. <Dialog as="div" className="relative z-40" onClose={close}>
  23. <TransitionChild>
  24. <div className={cn(
  25. 'fixed inset-0 bg-black bg-opacity-25',
  26. 'data-[closed]:opacity-0',
  27. 'data-[enter]:opacity-100 data-[enter]:duration-300 data-[enter]:ease-out',
  28. 'data-[leave]:opacity-0 data-[leave]:duration-200 data-[leave]:ease-in',
  29. )} />
  30. </TransitionChild>
  31. <div className="fixed inset-0">
  32. <div className={cn('flex min-h-full flex-col items-end justify-center pb-2', inWorkflow ? 'pt-[112px]' : 'pr-2 pt-[64px]')}>
  33. <TransitionChild>
  34. <DialogPanel className={cn(
  35. 'relative flex h-0 w-[420px] grow flex-col overflow-hidden border-components-panel-border bg-components-panel-bg-alt p-0 text-left align-middle shadow-xl transition-all',
  36. inWorkflow ? 'rounded-l-2xl border-b-[0.5px] border-l-[0.5px] border-t-[0.5px]' : 'rounded-2xl border-[0.5px]',
  37. 'data-[closed]:scale-95 data-[closed]:opacity-0',
  38. 'data-[enter]:scale-100 data-[enter]:opacity-100 data-[enter]:duration-300 data-[enter]:ease-out',
  39. 'data-[leave]:scale-95 data-[leave]:opacity-0 data-[leave]:duration-200 data-[leave]:ease-in',
  40. className,
  41. )}>
  42. {children}
  43. </DialogPanel>
  44. </TransitionChild>
  45. </div>
  46. </div>
  47. </Dialog>
  48. </Transition >
  49. )
  50. }
  51. export default DialogWrapper