import React from "react";
import { MoleculeComponentProps } from "../../../theme/src/types";
import { pearl } from "../../../pearl";
import Text from "../../atoms/text/text";
import Icon from "../../atoms/icon/icon";
import Stack, { StackProps } from "../../atoms/stack/stack";
import { AlertAtoms } from "./alert.config";
import { useStyleProps } from "../../../hooks";
import { boxStyleFunctions } from "../../../theme";
import Box from "../../atoms/box/box";
import IconButton from "../icon-button/icon-button";
import _ from "lodash";
/**
* BaseAlertProps are the properties for the BaseAlert component.
* It extends StackProps and adds additional properties.
*/
export type BaseAlertProps = StackProps & {
/** Custom icon that overrides the default icon in the alert. */
icon?: React.ReactElement;
/**
* Boolean flag to indicate if the alert should be displayed with an icon.
* @default true
*/
withIcon?: boolean;
/** Title text for the alert. */
title?: string;
/** Description text for the alert. */
description?: string;
/**
* Boolean flag to indicate if the alert should be displayed with a close button.
* @default false
*/
withCloseButton?: boolean;
/** Function to be called when the close button is clicked. */
onClose?: () => void;
};
const BaseAlert = React.memo(
React.forwardRef(
(
{
atoms,
children,
...rest
}: MoleculeComponentProps<"Alert", BaseAlertProps, AlertAtoms>,
ref: any
) => {
let {
icon,
withIcon = true,
title,
description,
withCloseButton = false,
onClose = () => {},
...otherContainerProps
} = atoms.container;
const computedDescriptionStyles = useStyleProps(
atoms.description,
boxStyleFunctions
);
if (!icon && withIcon) icon = ;
return (
{icon &&
React.cloneElement(icon, {
...atoms.icon,
...icon.props,
})}
{title && {title}}
{description && (
{description}
)}
{withCloseButton && (
}
{...atoms.closeButton}
onPress={onClose}
accessible
accessibilityRole="button"
accessibilityLabel="Close Alert"
/>
)}
);
}
)
);
/** Alert is used to display a short, important message in a way that attracts the user's attention without interrupting the user's task. */
const Alert = pearl(
BaseAlert,
{
componentName: "Alert",
type: "molecule",
animatable: true,
},
undefined,
{
partForOverridenAnimationProps: "container",
partForOverridenNativeProps: "container",
partForOverridenStyleProps: "container",
}
);
export type AlertProps = React.ComponentProps;
Alert.displayName = "Alert";
export default Alert;