import { styled, Button, Typography } from '@mui/material'; import { IInstanceStatus } from 'interfaces/instance'; import { INSTANCE_STATUS_BAR_ID } from 'utils/testIds'; import { InfoOutlined, WarningAmber } from '@mui/icons-material'; import { useNavigate } from 'react-router-dom'; import { useContext } from 'react'; import AccessContext from 'contexts/AccessContext'; import { ADMIN } from 'component/providers/AccessProvider/permissions'; import { trialHasExpired, trialExpiresSoon, isTrialInstance, } from 'utils/instanceTrial'; import { formatDistanceToNowStrict, parseISO } from 'date-fns'; const StyledWarningBar = styled('aside')(({ theme }) => ({ position: 'relative', zIndex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: theme.spacing(1), gap: theme.spacing(1), borderBottom: '1px solid', borderColor: theme.palette.warning.border, background: theme.palette.warning.light, color: theme.palette.warning.dark, })); const StyledInfoBar = styled('aside')(({ theme }) => ({ position: 'relative', zIndex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: theme.spacing(1), gap: theme.spacing(1), borderBottom: '1px solid', borderColor: theme.palette.info.border, background: theme.palette.info.light, color: theme.palette.info.dark, })); const StyledButton = styled(Button)(({ theme }) => ({ whiteSpace: 'nowrap', minWidth: '8rem', marginLeft: theme.spacing(2), })); const StyledWarningIcon = styled(WarningAmber)(({ theme }) => ({ color: theme.palette.warning.main, })); const StyledInfoIcon = styled(InfoOutlined)(({ theme }) => ({ color: theme.palette.info.main, })); interface IInstanceStatusBarProps { instanceStatus: IInstanceStatus; } export const InstanceStatusBar = ({ instanceStatus, }: IInstanceStatusBarProps) => { if (trialHasExpired(instanceStatus)) { return ; } if (trialExpiresSoon(instanceStatus)) { return ; } if (isTrialInstance(instanceStatus)) { return ; } return null; }; const StatusBarExpired = ({ instanceStatus }: IInstanceStatusBarProps) => { return ( ({ fontSize: theme.fontSizes.smallBody })}> Warning! Your free {instanceStatus.plan} trial has expired. Upgrade trial otherwise your{' '} account will be deleted. ); }; const StatusBarExpiresSoon = ({ instanceStatus }: IInstanceStatusBarProps) => { const timeRemaining = formatDistanceToNowStrict( parseISO(instanceStatus.trialExpiry!), { roundingMethod: 'floor' } ); return ( ({ fontSize: theme.fontSizes.smallBody })}> Heads up! You have{' '} {timeRemaining} left of your free{' '} {instanceStatus.plan} trial. ); }; const StatusBarExpiresLater = ({ instanceStatus }: IInstanceStatusBarProps) => { return ( ({ fontSize: theme.fontSizes.smallBody })}> Heads up! You're currently on a free{' '} {instanceStatus.plan} trial account. ); }; const BillingLink = () => { const { hasAccess } = useContext(AccessContext); const navigate = useNavigate(); if (!hasAccess(ADMIN)) { return null; } return ( navigate('/admin/billing')} variant="outlined" > Upgrade trial ); };