mirror of
https://github.com/Unleash/unleash.git
synced 2025-06-18 01:18:23 +02:00
* refactor: update test deps * refactor: remove unused ts-expect-error annotations * refactor: add missing arg and return types * refactor: the loading prop is optional * refactor: add missing arg and return types * reafactor: fix value arg type * refactor: fix missing array type * refactor: the parameters field is an array * refactor: use undefined instead of null in state * refactor: add missing params type * refactor: add missing children prop * refactor: add missing array type * refactor: add missing React imports * refactor: use correct IProjectEnvironment type * refactor: type errors as unknown * refactor: the index prop is required * refactor: fix date prop type * refactor: fix tooltip placement prop type * refactor: fix environments state type * refactor: add missing arg types * refactor: add guard for undefined field * refactor: fix ChangePassword prop types * refactor: fix MUI import paths * refactor: add missing arg type * refactor: fix showDialog prop type * refactor: remove unused openUpdateDialog prop * refactor: add missing non-null assertion * refactor: remove unused types prop * refactor: stricten API error handler types * refactor: add missing undefined check * refactor: add missing IProject id field * refactor: fix ConditionallyRender condition prop types * refactor: remove unused args * refactor: add AddVariant prop types * refactor: add types to UIContext * refactor: fix event arg type * refactor: add missing default impressionData field * refactor: fix handleDeleteEnvironment prop args * refactor: fix IFeatureMetrics field requirements * refactor: add missing element types to ConditionallyRender * refactor: remove unused ProjectAccess projectId prop * refactor: add missing undefined check * refactor: fix getCreateTogglePath arg type * refactor: add missing IStrategyPayload import * refactor: remove unused user arg * refactor: add missing event arg type * refactor: add missing style object types * refactor: improve userApiErrors prop type * refactor: the Dialogue onClose prop is optional * refactor: fix the AddonEvents setEventValue prop type
95 lines
3.3 KiB
TypeScript
95 lines
3.3 KiB
TypeScript
import { useStyles } from './Toast.styles';
|
|
import classnames from 'classnames';
|
|
import { useContext } from 'react';
|
|
import { IconButton } from '@material-ui/core';
|
|
import CheckMarkBadge from '../../CheckmarkBadge/CheckMarkBadge';
|
|
import UIContext from '../../../../contexts/UIContext';
|
|
import ConditionallyRender from '../../ConditionallyRender';
|
|
import Close from '@material-ui/icons/Close';
|
|
import { IToast } from '../../../../interfaces/toast';
|
|
|
|
const Toast = ({ title, text, type, confetti }: IToast) => {
|
|
const { setToast } = useContext(UIContext);
|
|
|
|
const styles = useStyles();
|
|
const confettiColors = ['#d13447', '#ffbf00', '#263672'];
|
|
const confettiAmount = 200;
|
|
|
|
const getRandomNumber = (input: number) => {
|
|
return Math.floor(Math.random() * input) + 1;
|
|
};
|
|
|
|
const renderConfetti = () => {
|
|
const elements = new Array(confettiAmount).fill(1);
|
|
|
|
const styledElements = elements.map((el, index) => {
|
|
const width = getRandomNumber(8);
|
|
const length = getRandomNumber(100);
|
|
|
|
const style = {
|
|
position: 'absolute' as 'absolute',
|
|
width: `${width}px`,
|
|
height: `${width * 0.4}px`,
|
|
backgroundColor: confettiColors[getRandomNumber(2)],
|
|
left: `${length}%`,
|
|
transform: `rotate(${getRandomNumber(101)}deg)`,
|
|
animationDelay: `${getRandomNumber(5)}s`,
|
|
animationDuration: `${getRandomNumber(3)}s`,
|
|
animationEase: `${getRandomNumber(2)}s`,
|
|
};
|
|
|
|
return (
|
|
<div
|
|
key={index}
|
|
style={style}
|
|
className={classnames(styles.starting, styles.anim)}
|
|
/>
|
|
);
|
|
});
|
|
|
|
return styledElements;
|
|
};
|
|
|
|
const hide = () => {
|
|
setToast((prev: IToast) => ({ ...prev, show: false }));
|
|
};
|
|
|
|
return (
|
|
<div className={styles.container}>
|
|
<div className={styles.innerContainer}>
|
|
<div className={styles.confettiContainer}>
|
|
{confetti && renderConfetti()}
|
|
<div className={styles.createdContainer}>
|
|
<div className={styles.headerContainer}>
|
|
<div>
|
|
<CheckMarkBadge
|
|
type={type}
|
|
className={styles.checkMark}
|
|
/>
|
|
</div>
|
|
<div className={styles.textContainer}>
|
|
<h3 className={styles.headerStyles}>{title}</h3>
|
|
|
|
<ConditionallyRender
|
|
condition={Boolean(text)}
|
|
show={<p>{text}</p>}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<IconButton
|
|
color="primary"
|
|
onClick={hide}
|
|
className={styles.buttonStyle}
|
|
>
|
|
<Close />
|
|
</IconButton>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Toast;
|