import * as React from "react"; import { cx } from "@emotion/css"; import { toast, toastActions, toastDesc, toastTitle, toastDismiss } from "../style"; import { inverseColorMode, display, flex, flexItem, margin, padding } from "../../shared/styles/styleUtils"; import Clickable from "../../clickable/components/clickable"; import * as dt from "../../design-tokens/build/js/designTokens"; import { Icon } from "../../icon"; import { SystemIcons } from "../../icons/dist/system-icons-enum"; export type ToastId = React.ReactText | undefined; export interface ToastProps { title: React.ReactElement | string; description?: React.ReactElement | string; id: ToastId; appearance?: "default" | "success" | "warning" | "danger"; autodismiss?: boolean; onDismiss?: (event?: React.SyntheticEvent) => void; dismissToast?: (dismissedToastId: ToastId) => void; primaryAction?: React.ReactElement; secondaryAction?: React.ReactElement; /** * Human-readable selector used for writing tests */ "data-cy"?: string; /** * Allows custom styling */ className?: string; } const SuccessIcon = ( ); const WarningIcon = ( ); const DangerIcon = ( ); const getIconForAppearance = (appearance: ToastProps["appearance"]) => { switch (appearance) { case "danger": return DangerIcon; case "success": return SuccessIcon; case "warning": return WarningIcon; } }; const Toast = ({ title, description, appearance = "default", primaryAction, secondaryAction, dismissToast, onDismiss, id, className, "data-cy": dataCy = `toast toast.${appearance}` }: ToastProps) => { const isUrgentMessage = appearance === "danger" || appearance === "warning"; const handleDismiss = e => { if (dismissToast) { dismissToast(id); } else if (onDismiss) { onDismiss(e); } }; return (
{appearance !== "default" && (
{getIconForAppearance(appearance)}
)}
{title}
{description && (
{description}
)} {(primaryAction || secondaryAction) && (
{primaryAction && ( {primaryAction} )} {secondaryAction && {secondaryAction}}
)}
); }; export default React.memo(Toast);