import React from "react"; // Components // Stores // Styles import classes from "./classes.module.scss"; import Toasts, { IToast } from "@Front/Stores/Toasts"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; type IProps = { toast: IToast; }; type IState = { willClose: boolean; }; export default class ToastElement extends React.Component { private closeTimeout = 0; constructor(props: IProps) { super(props); this.state = { willClose: false, }; this.onClose = this.onClose.bind(this); } public override render(): JSX.Element { const toast = this.props.toast; const style = { "--data-duration": `${toast.time}ms`, } as React.CSSProperties; return (
{toast.time !== 0 &&
}
{toast.icon && toast.icon}
{this.getToastTitle(toast.title)} {this.getToastText(toast.text)}
{/* {toast.closable && } */}
{toast.button}
); } public override componentDidMount() { if (this.props.toast.time === 0) return; this.closeTimeout = window.setTimeout(() => { this.close(); }, this.props.toast.time); } private getToastTitle(title: string | React.ReactNode) { if (typeof title === "string") { return ( {title} ); } return title; } private getToastText(text: React.ReactNode) { if (typeof text === "string") { return (
{text}
); } return text; } private onClose(e: React.MouseEvent) { e.preventDefault(); e.stopPropagation(); this.close(); } private close() { window.clearTimeout(this.closeTimeout); this.setState({ willClose: true, }); setTimeout(() => { Toasts.getInstance().close(this.props.toast); }, 200); } }