| import { forwardRef, ReactNode, Ref } from 'react'; |
| import { |
| DialogClose, |
| DialogContent, |
| DialogDescription, |
| DialogFooter, |
| DialogHeader, |
| DialogTitle, |
| } from './Dialog'; |
| import { cn } from '~/utils/'; |
|
|
| type SelectionProps = { |
| selectHandler?: () => void; |
| selectClasses?: string; |
| selectText?: string; |
| }; |
|
|
| type DialogTemplateProps = { |
| title: string; |
| description?: string; |
| main?: ReactNode; |
| buttons?: ReactNode; |
| leftButtons?: ReactNode; |
| selection?: SelectionProps; |
| className?: string; |
| headerClassName?: string; |
| footerClassName?: string; |
| showCloseButton?: boolean; |
| showCancelButton?: boolean; |
| }; |
|
|
| const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref<HTMLDivElement>) => { |
| const { |
| title, |
| description, |
| main, |
| buttons, |
| leftButtons, |
| selection, |
| className, |
| headerClassName, |
| footerClassName, |
| showCloseButton, |
| showCancelButton = true, |
| } = props; |
| const { selectHandler, selectClasses, selectText } = selection || {}; |
| const Cancel = 'cancel'; |
|
|
| const defaultSelect = |
| 'bg-gray-800 text-white transition-colors hover:bg-gray-700 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-200 dark:text-gray-800 dark:hover:bg-gray-200'; |
| return ( |
| <DialogContent |
| showCloseButton={showCloseButton} |
| ref={ref} |
| className={cn('shadow-2xl dark:bg-gray-700', className || '')} |
| onClick={(e) => e.stopPropagation()} |
| > |
| <DialogHeader className={cn(headerClassName ?? '')}> |
| <DialogTitle className="text-lg font-medium leading-6 text-gray-800 dark:text-gray-200"> |
| {title} |
| </DialogTitle> |
| {description && ( |
| <DialogDescription className="text-gray-600 dark:text-gray-300"> |
| {description} |
| </DialogDescription> |
| )} |
| </DialogHeader> |
| <div className="px-6">{main ? main : null}</div> |
| <DialogFooter className={footerClassName}> |
| <div>{leftButtons ? leftButtons : null}</div> |
| <div className="flex h-auto gap-3"> |
| {showCancelButton && ( |
| <DialogClose className="border-gray-100 hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-600"> |
| {Cancel} |
| </DialogClose> |
| )} |
| {buttons ? buttons : null} |
| {selection ? ( |
| <DialogClose |
| onClick={selectHandler} |
| className={`${ |
| selectClasses || defaultSelect |
| } inline-flex h-10 items-center justify-center rounded-lg border-none px-4 py-2 text-sm`} |
| > |
| {selectText} |
| </DialogClose> |
| ) : null} |
| </div> |
| </DialogFooter> |
| </DialogContent> |
| ); |
| }); |
|
|
| export default DialogTemplate; |
|
|