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