| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  | 'use client' | 
					
						
							|  |  |  | import type { FC } from 'react' | 
					
						
							|  |  |  | import React, { useRef } from 'react' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import cn from 'classnames' | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  | import Drawer from '@/app/components/base/drawer' | 
					
						
							|  |  |  | import { XClose } from '@/app/components/base/icons/src/vender/line/general' | 
					
						
							|  |  |  | import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Props = { | 
					
						
							|  |  |  |   isShow: boolean | 
					
						
							|  |  |  |   onHide: () => void | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   panelClassName?: string | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   maxWidthClassName?: string | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   contentClassName?: string | 
					
						
							|  |  |  |   headerClassName?: string | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   height?: number | string | 
					
						
							|  |  |  |   title: string | JSX.Element | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   titleDescription?: string | JSX.Element | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   body: JSX.Element | 
					
						
							|  |  |  |   foot?: JSX.Element | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   isShowMask?: boolean | 
					
						
							|  |  |  |   clickOutsideNotOpen?: boolean | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const DrawerPlus: FC<Props> = ({ | 
					
						
							|  |  |  |   isShow, | 
					
						
							|  |  |  |   onHide, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   panelClassName = '', | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   maxWidthClassName = '!max-w-[640px]', | 
					
						
							|  |  |  |   height = 'calc(100vh - 72px)', | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   contentClassName, | 
					
						
							|  |  |  |   headerClassName, | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   title, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   titleDescription, | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |   body, | 
					
						
							|  |  |  |   foot, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   isShowMask, | 
					
						
							|  |  |  |   clickOutsideNotOpen = true, | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  | }) => { | 
					
						
							|  |  |  |   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
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |     <Drawer isOpen={isShow} clickOutsideNotOpen={clickOutsideNotOpen} onClose={onHide} footer={null} mask={isMobile || isShowMask} panelClassname={`mt-16 mx-2 sm:mr-2 mb-3 !p-0 ${panelClassName} ${maxWidthClassName} rounded-xl`}> | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |       <div | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |         className={cn(contentClassName, 'w-full flex flex-col bg-white border-[0.5px] border-gray-200 rounded-xl shadow-xl')} | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |         style={{ | 
					
						
							|  |  |  |           height, | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |         ref={ref} | 
					
						
							|  |  |  |       > | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |         <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' | 
					
						
							|  |  |  |               > | 
					
						
							|  |  |  |                 <XClose className='w-4 h-4 text-gray-500' /> | 
					
						
							|  |  |  |               </div> | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |             </div> | 
					
						
							|  |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |           {titleDescription && ( | 
					
						
							|  |  |  |             <div className='pl-6 pr-10 leading-[18px] text-xs font-normal text-gray-500'> | 
					
						
							|  |  |  |               {titleDescription} | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           )} | 
					
						
							| 
									
										
										
										
											2023-12-18 15:41:24 +08:00
										 |  |  |         </div> | 
					
						
							|  |  |  |         <div className='grow overflow-y-auto'> | 
					
						
							|  |  |  |           {body} | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |         {foot && ( | 
					
						
							|  |  |  |           <div className='shrink-0'> | 
					
						
							|  |  |  |             {foot} | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         )} | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </Drawer> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | export default React.memo(DrawerPlus) |