fleet/frontend/components/InfoBanner/InfoBanner.tsx
Marko Lisica 8162d052bf
Icons improvements (making frontend consistent with Figma component library) (#14185)
# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [ ] Manual QA for all new/changed functionality

---------

Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2023-10-31 16:06:38 +00:00

93 lines
2 KiB
TypeScript

import React, { useState } from "react";
import classNames from "classnames";
import Icon from "components/Icon";
import Button from "components/buttons/Button";
import { IconNames } from "components/icons";
const baseClass = "info-banner";
export interface IInfoBannerProps {
children?: React.ReactNode;
className?: string;
/** default light purple */
color?: "purple" | "purple-bold-border" | "yellow" | "grey";
/** default 4px */
borderRadius?: "large" | "xlarge";
pageLevel?: boolean;
/** cta and link are mutually exclusive */
cta?: JSX.Element;
/** closable and link are mutually exclusive */
closable?: boolean;
link?: string;
icon?: IconNames;
}
const InfoBanner = ({
children,
className,
color = "purple",
borderRadius,
pageLevel,
cta,
closable,
link,
icon,
}: IInfoBannerProps): JSX.Element => {
const wrapperClasses = classNames(
baseClass,
`${baseClass}__${color}`,
{
[`${baseClass}__${color}`]: !!color,
[`${baseClass}__border-radius-${borderRadius}`]: !!borderRadius,
[`${baseClass}__page-banner`]: !!pageLevel,
[`${baseClass}__icon`]: !!icon,
},
className
);
const [hideBanner, setHideBanner] = useState(false);
const content = (
<>
<div className={`${baseClass}__info`}>{children}</div>
{(cta || closable) && (
<div className={`${baseClass}__cta`}>
{cta}
{closable && (
<Button variant="unstyled" onClick={() => setHideBanner(true)}>
<Icon
name="close"
color="core-fleet-black"
size="small"
className={`${baseClass}__close`}
/>
</Button>
)}
</div>
)}
</>
);
if (hideBanner) {
return <></>;
}
if (link) {
return (
<a
href={link}
target="_blank"
rel="noreferrer"
className={wrapperClasses}
>
{content}
</a>
);
}
return <div className={wrapperClasses}>{content}</div>;
};
export default InfoBanner;