-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
alert.tsx
130 lines (121 loc) · 3.6 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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 = <Icon {...atoms.icon} />;
return (
<Stack
{...rest}
ref={ref}
{...otherContainerProps}
accessible
accessibilityRole="alert"
>
{icon &&
React.cloneElement(icon, {
...atoms.icon,
...icon.props,
})}
<Stack {...atoms.stack}>
<Box flexDirection="row" justifyContent="space-between">
{title && <Text {...atoms.title}>{title}</Text>}
</Box>
{description && (
<Box style={computedDescriptionStyles.style}>
<Text {..._.omit(computedDescriptionStyles, ["style"])}>
{description}
</Text>
</Box>
)}
</Stack>
{withCloseButton && (
<IconButton
position="absolute"
top={5}
right={7}
icon={<Icon iconFamily="Ionicons" iconName="close" />}
{...atoms.closeButton}
onPress={onClose}
accessible
accessibilityRole="button"
accessibilityLabel="Close Alert"
/>
)}
</Stack>
);
}
)
);
/** 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<BaseAlertProps, "molecule", AlertAtoms>(
BaseAlert,
{
componentName: "Alert",
type: "molecule",
animatable: true,
},
undefined,
{
partForOverridenAnimationProps: "container",
partForOverridenNativeProps: "container",
partForOverridenStyleProps: "container",
}
);
export type AlertProps = React.ComponentProps<typeof Alert>;
Alert.displayName = "Alert";
export default Alert;