123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 'use client'
- import type { FC } from 'react'
- import React, { useRef } from 'react'
- import { RiCloseLine } from '@remixicon/react'
- import cn from '@/utils/classnames'
- import Drawer from '@/app/components/base/drawer'
- import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
- type Props = {
- isShow: boolean
- onHide: () => void
- panelClassName?: string
- maxWidthClassName?: string
- contentClassName?: string
- headerClassName?: string
- height?: number | string
- title: string | JSX.Element
- titleDescription?: string | JSX.Element
- body: JSX.Element
- foot?: JSX.Element
- isShowMask?: boolean
- clickOutsideNotOpen?: boolean
- positionCenter?: boolean
- }
- const DrawerPlus: FC<Props> = ({
- isShow,
- onHide,
- panelClassName = '',
- maxWidthClassName = '!max-w-[640px]',
- height = 'calc(100vh - 72px)',
- contentClassName,
- headerClassName,
- title,
- titleDescription,
- body,
- foot,
- isShowMask,
- clickOutsideNotOpen = true,
- positionCenter,
- }) => {
- const ref = useRef(null)
- const media = useBreakpoints()
- const isMobile = media === MediaType.mobile
- if (!isShow)
- return null
- return (
- // clickOutsideNotOpen to fix confirm modal click cause drawer close
- <Drawer
- isOpen={isShow}
- clickOutsideNotOpen={clickOutsideNotOpen}
- onClose={onHide}
- footer={null}
- mask={isMobile || isShowMask}
- positionCenter={positionCenter}
- panelClassname={cn('mt-16 mx-2 sm:mr-2 mb-3 !p-0 rounded-xl', panelClassName, maxWidthClassName)}
- >
- <div
- className={cn(contentClassName, 'w-full flex flex-col bg-white border-[0.5px] border-gray-200 rounded-xl shadow-xl')}
- style={{
- height,
- }}
- ref={ref}
- >
- <div className={cn(headerClassName, 'shrink-0 border-b border-b-gray-100 py-4')}>
- <div className='flex justify-between items-center pl-6 pr-5 h-6'>
- <div className='text-base font-semibold text-gray-900'>
- {title}
- </div>
- <div className='flex items-center'>
- <div
- onClick={onHide}
- className='flex justify-center items-center w-6 h-6 cursor-pointer'
- >
- <RiCloseLine className='w-4 h-4 text-gray-500' />
- </div>
- </div>
- </div>
- {titleDescription && (
- <div className='pl-6 pr-10 leading-[18px] text-xs font-normal text-gray-500'>
- {titleDescription}
- </div>
- )}
- </div>
- <div className='grow overflow-y-auto'>
- {body}
- </div>
- {foot && (
- <div className='shrink-0'>
- {foot}
- </div>
- )}
- </div>
- </Drawer>
- )
- }
- export default React.memo(DrawerPlus)
|