import styled from '@emotion/styled';
import classNames from 'classnames';
import {motion} from 'framer-motion';
import {Indicator} from 'sentry/actionCreators/indicator';
import LoadingIndicator from 'sentry/components/loadingIndicator';
import {IconCheckmark, IconClose} from 'sentry/icons';
import {t} from 'sentry/locale';
import space from 'sentry/styles/space';
import testableTransition from 'sentry/utils/testableTransition';
type Props = {
indicator: Indicator;
onDismiss: (indicator: Indicator, event: React.MouseEvent) => void;
className?: string;
};
function ToastIndicator({indicator, onDismiss, className, ...props}: Props) {
let icon: React.ReactNode;
const {options, message, type} = indicator;
const {undo, disableDismiss} = options || {};
const showUndo = typeof undo === 'function';
const handleClick = (e: React.MouseEvent) => {
if (disableDismiss) {
return;
}
if (typeof onDismiss === 'function') {
onDismiss(indicator, e);
}
};
if (type === 'success') {
icon = ;
} else if (type === 'error') {
icon = ;
}
// TODO(billy): Remove ref- className after removing usage from getsentry
return (
{type === 'loading' ? (
) : (
{icon}
)}
{message}
{showUndo && {t('Undo')}}
);
}
const Toast = styled(motion.div)`
display: flex;
align-items: center;
height: 40px;
padding: 0 15px 0 10px;
margin-top: 15px;
background: ${p => p.theme.inverted.background};
color: ${p => p.theme.inverted.textColor};
border-radius: 44px 7px 7px 44px;
box-shadow: ${p => p.theme.dropShadowHeavy};
position: relative;
`;
Toast.defaultProps = {
initial: {
opacity: 0,
y: 70,
},
animate: {
opacity: 1,
y: 0,
},
exit: {
opacity: 0,
y: 70,
},
transition: testableTransition({
type: 'spring',
stiffness: 450,
damping: 25,
}),
};
const Icon = styled('div', {shouldForwardProp: p => p !== 'type'})<{type: string}>`
margin-right: ${space(0.75)};
svg {
display: block;
}
color: ${p => (p.type === 'success' ? p.theme.green300 : p.theme.red300)};
`;
const Message = styled('div')`
flex: 1;
`;
const Undo = styled('div')`
display: inline-block;
color: ${p => p.theme.linkColor};
padding-left: ${space(1)};
margin-left: ${space(1)};
cursor: pointer;
&:hover {
color: ${p => p.theme.linkHoverColor};
}
`;
const StyledLoadingIndicator = styled(LoadingIndicator)`
.loading-indicator {
border-color: ${p => p.theme.inverted.border};
border-left-color: ${p => p.theme.inverted.purple300};
}
`;
export default ToastIndicator;