|
'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> |
|
) |
|
} |
|
|