| import { forwardRef, ReactNode, Ref } from 'react'; | |
| import { | |
| OGDialogTitle, | |
| OGDialogClose, | |
| OGDialogFooter, | |
| OGDialogHeader, | |
| OGDialogContent, | |
| OGDialogDescription, | |
| } from './OriginalDialog'; | |
| import { useLocalize } from '~/hooks'; | |
| import { Button } from './Button'; | |
| import { Spinner } from '~/svgs'; | |
| import { cn } from '~/utils/'; | |
| type SelectionProps = { | |
| selectHandler?: () => void; | |
| selectClasses?: string; | |
| selectText?: string | ReactNode; | |
| isLoading?: boolean; | |
| }; | |
| type DialogTemplateProps = { | |
| title: string; | |
| description?: string; | |
| main?: ReactNode; | |
| buttons?: ReactNode; | |
| leftButtons?: ReactNode; | |
| selection?: SelectionProps; | |
| className?: string; | |
| overlayClassName?: string; | |
| headerClassName?: string; | |
| mainClassName?: string; | |
| footerClassName?: string; | |
| showCloseButton?: boolean; | |
| showCancelButton?: boolean; | |
| onClose?: () => void; | |
| }; | |
| const OGDialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref<HTMLDivElement>) => { | |
| const localize = useLocalize(); | |
| const { | |
| title, | |
| main, | |
| buttons, | |
| selection, | |
| className, | |
| leftButtons, | |
| description = '', | |
| mainClassName, | |
| headerClassName, | |
| footerClassName, | |
| showCloseButton, | |
| overlayClassName, | |
| showCancelButton = true, | |
| } = props; | |
| const { selectHandler, selectClasses, selectText, isLoading } = selection || {}; | |
| 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 ( | |
| <OGDialogContent | |
| overlayClassName={overlayClassName} | |
| showCloseButton={showCloseButton} | |
| ref={ref} | |
| className={cn('w-11/12 border-none bg-background text-foreground', className ?? '')} | |
| onClick={(e) => e.stopPropagation()} | |
| > | |
| <OGDialogHeader className={cn(headerClassName ?? '')}> | |
| <OGDialogTitle>{title}</OGDialogTitle> | |
| {description && ( | |
| <OGDialogDescription className="items-center justify-center"> | |
| {description} | |
| </OGDialogDescription> | |
| )} | |
| </OGDialogHeader> | |
| <div className={cn('px-0 py-2', mainClassName)}>{main != null ? main : null}</div> | |
| <OGDialogFooter className={footerClassName}> | |
| <div> | |
| {leftButtons != null ? ( | |
| <div className="mt-3 flex h-auto gap-3 max-sm:w-full max-sm:flex-col sm:mt-0 sm:flex-row"> | |
| {leftButtons} | |
| </div> | |
| ) : null} | |
| </div> | |
| <div className="flex h-auto gap-3 max-sm:w-full max-sm:flex-col sm:flex-row"> | |
| {showCancelButton && ( | |
| <OGDialogClose asChild> | |
| <Button variant="outline" aria-label={localize('com_ui_cancel')}> | |
| {localize('com_ui_cancel')} | |
| </Button> | |
| </OGDialogClose> | |
| )} | |
| {buttons != null ? buttons : null} | |
| {selection ? ( | |
| <OGDialogClose | |
| onClick={selectHandler} | |
| disabled={isLoading} | |
| className={`${ | |
| selectClasses ?? defaultSelect | |
| } flex h-10 items-center justify-center rounded-lg border-none px-4 py-2 text-sm disabled:opacity-80 max-sm:order-first max-sm:w-full sm:order-none`} | |
| > | |
| {isLoading === true ? ( | |
| <Spinner className="size-4 text-white" /> | |
| ) : ( | |
| (selectText as React.JSX.Element) | |
| )} | |
| </OGDialogClose> | |
| ) : null} | |
| </div> | |
| </OGDialogFooter> | |
| </OGDialogContent> | |
| ); | |
| }); | |
| export default OGDialogTemplate; | |