import React, { useRef } from 'react'; import { BoxDivProps, SilkeBox } from '../silke-box'; import { SilkeButton } from '../silke-button'; import { SilkeIcon, SilkeIcons } from '../silke-icon'; import { SilkeText } from '../silke-text'; import styles from './silke-toast-notification.scss'; import userConfetti from './confetti'; export type ToastNotificationKind = 'warning' | 'error' | 'success' | 'information' | 'confetti'; export type SilkeToastNotificationProps = { kind: ToastNotificationKind; title?: string | React.ReactNode; subtitle?: string | React.ReactNode; icon?: SilkeIcons; /** * Will add a remove button to notification */ onRemove?: (e: React.MouseEvent) => void; /** * On click of action button * */ onAction?: () => void; actionLabel?: string; fluid?: boolean; } & Omit; const ICON_KIND: Record = { warning: 'error.triangle', error: 'ban.light', success: 'check.circle.outline', information: 'tooltip', confetti: '🎉' as SilkeIcons, }; export function SilkeToastNotification({ title, subtitle, className, kind = 'information', onAction, actionLabel, onRemove, fluid = false, icon, ...rest }: SilkeToastNotificationProps) { const cl: string[] = [styles.notificationBox]; const iconRef = useRef(); const doublePadding = title && subtitle; if (kind === 'confetti') userConfetti(iconRef as any); if (className) cl.push(className); if (kind) cl.push(styles[kind]); if (fluid) cl.push(styles.fluid); return ( {title && {title}} {subtitle && ( {subtitle} )} {onAction && ( )} {onRemove && ( )} ); }