Skip to content

Commit bf7e82e

Browse files
committed
refactor(tsx): convert Snackbar components
1 parent 34d4b19 commit bf7e82e

File tree

4 files changed

+183
-173
lines changed

4 files changed

+183
-173
lines changed

src/ui/assets/jss/material-dashboard-react/components/snackbarContentStyle.js

Lines changed: 0 additions & 131 deletions
This file was deleted.
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import { createStyles, Theme } from '@material-ui/core/styles';
2+
import {
3+
defaultFont,
4+
primaryBoxShadow,
5+
infoBoxShadow,
6+
successBoxShadow,
7+
warningBoxShadow,
8+
dangerBoxShadow,
9+
roseBoxShadow,
10+
whiteColor,
11+
blackColor,
12+
grayColor,
13+
infoColor,
14+
successColor,
15+
dangerColor,
16+
roseColor,
17+
primaryColor,
18+
warningColor,
19+
hexToRgb,
20+
} from '../../material-dashboard-react';
21+
22+
const snackbarContentStyle = (theme: Theme) =>
23+
createStyles({
24+
root: {
25+
...defaultFont,
26+
flexWrap: 'unset',
27+
position: 'relative' as const,
28+
padding: '20px 15px',
29+
lineHeight: '20px',
30+
marginBottom: '20px',
31+
fontSize: '14px',
32+
backgroundColor: whiteColor,
33+
color: grayColor[7],
34+
borderRadius: '3px',
35+
minWidth: 'unset',
36+
maxWidth: 'unset',
37+
boxShadow: `0 12px 20px -10px rgba(${hexToRgb(whiteColor)}, 0.28),
38+
0 4px 20px 0px rgba(${hexToRgb(blackColor)}, 0.12),
39+
0 7px 8px -5px rgba(${hexToRgb(whiteColor)}, 0.2)`,
40+
fontWeight: 400,
41+
},
42+
top20: {
43+
top: '20px',
44+
},
45+
top40: {
46+
top: '40px',
47+
},
48+
info: {
49+
backgroundColor: infoColor[3],
50+
color: whiteColor,
51+
...infoBoxShadow,
52+
},
53+
success: {
54+
backgroundColor: successColor[3],
55+
color: whiteColor,
56+
...successBoxShadow,
57+
},
58+
warning: {
59+
backgroundColor: warningColor[3],
60+
color: whiteColor,
61+
...warningBoxShadow,
62+
},
63+
danger: {
64+
backgroundColor: dangerColor[3],
65+
color: whiteColor,
66+
...dangerBoxShadow,
67+
},
68+
primary: {
69+
backgroundColor: primaryColor[3],
70+
color: whiteColor,
71+
...primaryBoxShadow,
72+
},
73+
rose: {
74+
backgroundColor: roseColor[3],
75+
color: whiteColor,
76+
...roseBoxShadow,
77+
},
78+
message: {
79+
padding: '0',
80+
display: 'block' as const,
81+
maxWidth: '89%',
82+
},
83+
close: {
84+
width: '11px',
85+
height: '11px',
86+
},
87+
iconButton: {
88+
width: '24px',
89+
height: '24px',
90+
padding: '0px',
91+
},
92+
icon: {
93+
display: 'block' as const,
94+
left: '15px',
95+
position: 'absolute' as const,
96+
top: '50%',
97+
marginTop: '-15px',
98+
width: '30px',
99+
height: '30px',
100+
},
101+
infoIcon: {
102+
color: infoColor[3],
103+
},
104+
successIcon: {
105+
color: successColor[3],
106+
},
107+
warningIcon: {
108+
color: warningColor[3],
109+
},
110+
dangerIcon: {
111+
color: dangerColor[3],
112+
},
113+
primaryIcon: {
114+
color: primaryColor[3],
115+
},
116+
roseIcon: {
117+
color: roseColor[3],
118+
},
119+
iconMessage: {
120+
paddingLeft: '50px',
121+
display: 'block' as const,
122+
},
123+
actionRTL: {
124+
marginLeft: '-8px',
125+
marginRight: 'auto',
126+
},
127+
});
128+
129+
export default snackbarContentStyle;
Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from 'react';
22
import classNames from 'classnames';
3-
import PropTypes from 'prop-types';
43
import { makeStyles } from '@material-ui/core/styles';
54
import Snack from '@material-ui/core/Snackbar';
65
import IconButton from '@material-ui/core/IconButton';
@@ -9,31 +8,47 @@ import styles from '../../assets/jss/material-dashboard-react/components/snackba
98

109
const useStyles = makeStyles(styles);
1110

12-
export default function Snackbar(props) {
11+
type Color = 'info' | 'success' | 'warning' | 'danger' | 'primary';
12+
type Placement = 'tl' | 'tr' | 'tc' | 'br' | 'bl' | 'bc';
13+
14+
interface SnackbarProps {
15+
message: React.ReactNode;
16+
color?: Color;
17+
close?: boolean;
18+
icon?: React.ComponentType<{ className: string }>;
19+
place?: Placement;
20+
open: boolean;
21+
rtlActive?: boolean;
22+
closeNotification: () => void;
23+
}
24+
25+
const Snackbar: React.FC<SnackbarProps> = (props) => {
1326
const classes = useStyles();
14-
const { message, color, close, icon, place, open, rtlActive } = props;
15-
let action = [];
27+
const { message, color = 'info', close, icon: Icon, place = 'tr', open, rtlActive } = props;
28+
29+
let action: React.ReactNode[] = [];
1630
const messageClasses = classNames({
17-
[classes.iconMessage]: icon !== undefined,
31+
[classes.iconMessage]: Icon !== undefined,
1832
});
19-
if (close !== undefined) {
33+
34+
if (close) {
2035
action = [
2136
<IconButton
2237
className={classes.iconButton}
2338
key='close'
2439
aria-label='Close'
2540
color='inherit'
26-
onClick={() => props.closeNotification()}
41+
onClick={props.closeNotification}
2742
>
2843
<Close className={classes.close} />
2944
</IconButton>,
3045
];
3146
}
3247

33-
const calculateHorizontal = () => {
34-
if (place.indexOf('l') !== -1) {
48+
const calculateHorizontal = (): 'left' | 'center' | 'right' => {
49+
if (place.includes('l')) {
3550
return 'left';
36-
} else if (place.indexOf('c') !== -1) {
51+
} else if (place.includes('c')) {
3752
return 'center';
3853
}
3954
return 'right';
@@ -42,35 +57,26 @@ export default function Snackbar(props) {
4257
return (
4358
<Snack
4459
anchorOrigin={{
45-
vertical: place.indexOf('t') === -1 ? 'bottom' : 'top',
60+
vertical: place.includes('t') ? 'top' : 'bottom',
4661
horizontal: calculateHorizontal(),
4762
}}
4863
open={open}
4964
message={
5065
<div>
51-
{icon !== undefined ? <props.icon className={classes.icon} /> : null}
66+
{Icon && <Icon className={classes.icon} />}
5267
<span className={messageClasses}>{message}</span>
5368
</div>
5469
}
5570
action={action}
5671
ContentProps={{
5772
classes: {
58-
root: classes.root + ' ' + classes[color],
73+
root: `${classes.root} ${classes[color]}`,
5974
message: classes.message,
6075
action: classNames({ [classes.actionRTL]: rtlActive }),
6176
},
6277
}}
6378
/>
6479
);
65-
}
66-
67-
Snackbar.propTypes = {
68-
message: PropTypes.node.isRequired,
69-
color: PropTypes.oneOf(['info', 'success', 'warning', 'danger', 'primary']),
70-
close: PropTypes.bool,
71-
icon: PropTypes.object,
72-
place: PropTypes.oneOf(['tl', 'tr', 'tc', 'br', 'bl', 'bc']),
73-
open: PropTypes.bool,
74-
rtlActive: PropTypes.bool,
75-
closeNotification: PropTypes.func,
7680
};
81+
82+
export default Snackbar;

0 commit comments

Comments
 (0)