1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 'use client'
- import { Dialog } from '@headlessui/react'
- import { useTranslation } from 'react-i18next'
- import { XMarkIcon } from '@heroicons/react/24/outline'
- import Button from '../button'
- import cn from '@/utils/classnames'
- export type IDrawerProps = {
- title?: string
- description?: string
- panelClassname?: string
- children: React.ReactNode
- footer?: React.ReactNode
- mask?: boolean
- positionCenter?: boolean
- isOpen: boolean
- showClose?: boolean
- clickOutsideNotOpen?: boolean
- onClose: () => void
- onCancel?: () => void
- onOk?: () => void
- }
- export default function Drawer({
- title = '',
- description = '',
- panelClassname = '',
- children,
- footer,
- mask = true,
- positionCenter,
- showClose = false,
- isOpen,
- clickOutsideNotOpen,
- onClose,
- onCancel,
- onOk,
- }: IDrawerProps) {
- const { t } = useTranslation()
- return (
- <Dialog
- unmount={false}
- open={isOpen}
- onClose={() => !clickOutsideNotOpen && onClose()}
- className="fixed z-30 inset-0 overflow-y-auto"
- >
- <div className={cn('flex w-screen h-screen justify-end', positionCenter && '!justify-center')}>
- {/* mask */}
- <Dialog.Overlay
- className={cn('z-40 fixed inset-0', mask && 'bg-black bg-opacity-30')}
- />
- <div className={cn('relative z-50 flex flex-col justify-between bg-white w-full max-w-sm p-6 overflow-hidden text-left align-middle shadow-xl', panelClassname)}>
- <>
- {title && <Dialog.Title
- as="h3"
- className="text-lg font-medium leading-6 text-gray-900"
- >
- {title}
- </Dialog.Title>}
- {showClose && <Dialog.Title className="flex items-center mb-4" as="div">
- <XMarkIcon className='w-4 h-4 text-gray-500' onClick={onClose} />
- </Dialog.Title>}
- {description && <Dialog.Description className='text-gray-500 text-xs font-normal mt-2'>{description}</Dialog.Description>}
- {children}
- </>
- {footer || (footer === null
- ? null
- : <div className="mt-10 flex flex-row justify-end">
- <Button
- className='mr-2'
- onClick={() => {
- onCancel && onCancel()
- }}>{t('common.operation.cancel')}</Button>
- <Button
- onClick={() => {
- onOk && onOk()
- }}>{t('common.operation.save')}</Button>
- </div>)}
- </div>
- </div>
- </Dialog>
- )
- }
|