import Check from '@mui/icons-material/Check';
import ErrorOutlineRounded from '@mui/icons-material/ErrorOutlineRounded';
import InfoOutlined from '@mui/icons-material/InfoOutlined';
import WarningAmber from '@mui/icons-material/WarningAmber';
import { styled, Icon, Link } from '@mui/material';
import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
import { useNavigate } from 'react-router-dom';
import { BannerDialog } from './BannerDialog/BannerDialog';
import { useState } from 'react';
import { Markdown } from 'component/common/Markdown/Markdown';
import type { BannerVariant, IBanner } from 'interfaces/banner';
import { Sticky } from 'component/common/Sticky/Sticky';
const DEFAULT_VARIANT = 'info';
const StyledBar = styled('aside', {
shouldForwardProp: (prop) =>
prop !== 'variant' && prop !== 'inline' && prop !== 'maxHeight',
})<{ variant: BannerVariant; inline?: boolean; maxHeight?: number }>(
({ theme, variant, inline, maxHeight }) => ({
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: theme.spacing(1),
gap: theme.spacing(1),
width: '100%',
...(inline
? {
border: '1px solid',
borderRadius: theme.shape.borderRadiusMedium,
}
: {
borderBottom: '1px solid',
}),
...(maxHeight && {
maxHeight: maxHeight,
overflow: 'auto',
}),
borderColor:
theme.palette[variant]?.border ??
theme.palette[DEFAULT_VARIANT].border,
background:
theme.palette[variant]?.light ??
theme.palette[DEFAULT_VARIANT].light,
color:
theme.palette[variant]?.dark ?? theme.palette[DEFAULT_VARIANT].dark,
fontSize: theme.fontSizes.smallBody,
}),
);
const StyledIcon = styled('div', {
shouldForwardProp: (prop) => prop !== 'variant',
})<{ variant: BannerVariant }>(({ theme, variant }) => ({
display: 'flex',
alignItems: 'center',
color: theme.palette[variant]?.main ?? theme.palette[DEFAULT_VARIANT].main,
}));
interface IBannerProps {
banner: IBanner;
inline?: boolean;
maxHeight?: number;
}
export const Banner = ({ banner, inline, maxHeight }: IBannerProps) => {
const [open, setOpen] = useState(false);
const {
message,
variant = DEFAULT_VARIANT,
sticky,
icon,
link,
linkText = 'More info',
linkClicked,
plausibleEvent,
dialogTitle,
dialog,
} = banner;
const openDialog = () => {
setOpen(true);
linkClicked?.();
};
const bannerBar = (
{message}
{linkText}
{dialog!}
);
if (sticky) {
return {bannerBar};
}
return bannerBar;
};
const VariantIcons = {
warning: ,
info: ,
error: ,
success: ,
};
interface IBannerIconProps {
variant: BannerVariant;
icon?: string;
}
const BannerIcon = ({ icon, variant }: IBannerIconProps) => {
if (icon === 'none') return null;
if (icon) return {icon};
return VariantIcons[variant] ?? ;
};
interface IBannerButtonProps {
link?: string;
plausibleEvent?: string;
openDialog: () => void;
children: React.ReactNode;
}
const BannerButton = ({
link,
plausibleEvent,
openDialog,
children,
}: IBannerButtonProps) => {
const navigate = useNavigate();
const tracker = usePlausibleTracker();
if (!link) return null;
const dialog = link === 'dialog';
const internal = link.startsWith('/');
const trackEvent = () => {
if (!plausibleEvent) return;
tracker.trackEvent('banner', {
props: { event: plausibleEvent },
});
};
if (dialog)
return (
{
trackEvent();
openDialog();
}}
>
{children}
);
if (internal)
return (
{
trackEvent();
navigate(link);
}}
>
{children}
);
return (
{children}
);
};