import * as Dropdown from "@radix-ui/react-dropdown-menu" import clsx from "clsx" import React, { Children, HTMLAttributes, useMemo } from "react" import { Toast } from "react-hot-toast" import Spinner from "../../atoms/spinner" import ChevronDownIcon from "../../fundamentals/icons/chevron-down" import RefreshIcon from "../../fundamentals/icons/refresh-icon" type FormToasterContainerProps = { toast?: Toast isLoading?: boolean loadingMessage?: string unsavedChangesMessage?: string icon?: React.ReactNode } type MultiActionButtonProps = { actions: { onClick: () => void | Promise label: string icon?: any }[] className?: string } const FormToasterContainer: React.FC & { Actions: React.FC DiscardButton: React.FC> ActionButton: React.FC> MultiActionButton: React.FC } = ({ children, toast, isLoading = false, loadingMessage = "Hang on, this may take a few moments...", unsavedChangesMessage = "You have unsaved changes", icon = , }) => { const content = useMemo(() => { if (isLoading) { return (
{loadingMessage}
) } else { return ( <>
{icon} {unsavedChangesMessage}
{children} ) } }, [isLoading, children]) return (
{content}
) } const Actions: React.FC = ({ children }) => { return (
{Children.map(children, (child) => { return (
{child}
) })}
) } const DiscardButton: React.FC> = ({ children, className, ...props }) => { return ( ) } const ActionButton: React.FC> = ({ children, className, ...props }) => { return ( ) } const MultiActionButton: React.FC = ({ children, className, actions, }) => { return ( {children} {actions.map((action, i) => { return ( ) })} ) } FormToasterContainer.Actions = Actions FormToasterContainer.DiscardButton = DiscardButton FormToasterContainer.ActionButton = ActionButton FormToasterContainer.MultiActionButton = MultiActionButton export default FormToasterContainer