-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathalert.tsx
88 lines (76 loc) · 2.11 KB
/
alert.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import type {ButtonProps} from "@heroui/button";
import {forwardRef} from "@heroui/system";
import {
CloseIcon,
DangerIcon,
InfoCircleIcon,
SuccessIcon,
WarningIcon,
} from "@heroui/shared-icons";
import {isEmpty} from "@heroui/shared-utils";
import {Button} from "@heroui/button";
import {cloneElement, isValidElement} from "react";
import {useAlert, UseAlertProps} from "./use-alert";
const iconMap = {
primary: InfoCircleIcon,
secondary: InfoCircleIcon,
success: SuccessIcon,
warning: WarningIcon,
danger: DangerIcon,
} as const;
export type AlertColor = keyof typeof iconMap;
export interface AlertProps extends Omit<UseAlertProps, "hasContent"> {}
const Alert = forwardRef<"div", AlertProps>((props, ref) => {
const {
title,
icon,
children,
description,
endContent,
startContent,
isClosable,
domRef,
handleClose,
getBaseProps,
getMainWrapperProps,
getDescriptionProps,
getTitleProps,
getCloseButtonProps,
color,
isVisible,
onClose,
getAlertIconProps,
getIconWrapperProps,
} = useAlert({...props, ref});
if (!isVisible) return null;
const customIcon = icon && isValidElement(icon) ? cloneElement(icon, getAlertIconProps()) : null;
const IconComponent = iconMap[color] || iconMap.primary;
return (
<div ref={domRef} role="alert" {...getBaseProps()}>
{startContent}
<div {...getIconWrapperProps()}>
{customIcon || <IconComponent {...getAlertIconProps()} />}
</div>
<div {...getMainWrapperProps()}>
{!isEmpty(title) && <div {...getTitleProps()}>{title}</div>}
{!isEmpty(description) && <div {...getDescriptionProps()}>{description}</div>}
{children}
</div>
{endContent}
{(isClosable || onClose) && (
<Button
isIconOnly
aria-label="Close"
radius="full"
variant="light"
onPress={handleClose}
{...(getCloseButtonProps() as ButtonProps)}
>
<CloseIcon height={20} width={20} />
</Button>
)}
</div>
);
});
Alert.displayName = "HeroUI.Alert";
export default Alert;