index.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { Dialog, Transition } from '@headlessui/react'
  2. import { Fragment } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import ConfirmUI from '../confirm-ui'
  5. // https://headlessui.com/react/dialog
  6. type IConfirm = {
  7. className?: string
  8. isShow: boolean
  9. onClose: () => void
  10. type?: 'info' | 'warning'
  11. title: string
  12. content: string
  13. confirmText?: string
  14. onConfirm: () => void
  15. cancelText?: string
  16. onCancel: () => void
  17. }
  18. export default function Confirm({
  19. isShow,
  20. onClose,
  21. type = 'warning',
  22. title,
  23. content,
  24. confirmText,
  25. cancelText,
  26. onConfirm,
  27. onCancel,
  28. }: IConfirm) {
  29. const { t } = useTranslation()
  30. const confirmTxt = confirmText || `${t('common.operation.confirm')}`
  31. const cancelTxt = cancelText || `${t('common.operation.cancel')}`
  32. return (
  33. <Transition appear show={isShow} as={Fragment}>
  34. <Dialog as="div" className="relative z-[100]" onClose={onClose} onClick={e => e.preventDefault()}>
  35. <Transition.Child
  36. as={Fragment}
  37. enter="ease-out duration-300"
  38. enterFrom="opacity-0"
  39. enterTo="opacity-100"
  40. leave="ease-in duration-200"
  41. leaveFrom="opacity-100"
  42. leaveTo="opacity-0"
  43. >
  44. <div className="fixed inset-0 bg-black bg-opacity-25" />
  45. </Transition.Child>
  46. <div className="fixed inset-0 overflow-y-auto">
  47. <div className="flex items-center justify-center min-h-full p-4 text-center">
  48. <Transition.Child
  49. as={Fragment}
  50. enter="ease-out duration-300"
  51. enterFrom="opacity-0 scale-95"
  52. enterTo="opacity-100 scale-100"
  53. leave="ease-in duration-200"
  54. leaveFrom="opacity-100 scale-100"
  55. leaveTo="opacity-0 scale-95"
  56. >
  57. <Dialog.Panel className={'w-full max-w-md transform overflow-hidden rounded-2xl bg-white text-left align-middle shadow-xl transition-all'}>
  58. <ConfirmUI
  59. type={type}
  60. title={title}
  61. content={content}
  62. confirmText={confirmTxt}
  63. cancelText={cancelTxt}
  64. onConfirm={onConfirm}
  65. onCancel={onCancel}
  66. />
  67. </Dialog.Panel>
  68. </Transition.Child>
  69. </div>
  70. </div>
  71. </Dialog>
  72. </Transition>
  73. )
  74. }