Spaces:
Paused
Paused
| '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> | |
| ) | |
| } | |