-
-
Notifications
You must be signed in to change notification settings - Fork 340
/
Copy pathindex.tsx
72 lines (61 loc) · 2.21 KB
/
index.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
import React from "react";
import PropTypes from "prop-types";
// utils
import classnames from "classnames";
import { twMerge } from "tailwind-merge";
import findMatch from "../../utils/findMatch";
import objectsToString from "../../utils/objectsToString";
// context
import { useTheme } from "../../context/theme";
// types
import type { variant, size, className, withBorder, color } from "../../types/components/avatar";
import {
propTypesVariant,
propTypesSize,
propTypesClassName,
propTypesColor,
propTypesWithBorder,
} from "../../types/components/avatar";
export interface AvatarProps extends Omit<React.ComponentProps<"img">, "ref"> {
variant?: variant;
size?: size;
className?: className;
withBorder?: withBorder;
color?: color;
}
export const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(
({ variant, size, className, color, withBorder, ...rest }, ref) => {
// 1. init
const { avatar } = useTheme();
const { valid, defaultProps, styles } = avatar;
const { base, variants, sizes, borderColor } = styles;
// 2. set default props
variant = variant ?? defaultProps.variant;
size = size ?? defaultProps.size;
withBorder = withBorder ?? defaultProps.withBorder;
color = color ?? defaultProps.color;
className = twMerge(defaultProps.className || "", className);
// 3. set styles
const avatarVariant = objectsToString(variants[findMatch(valid.variants, variant, "rounded")]);
const avatarSize = objectsToString(sizes[findMatch(valid.sizes, size, "md")]);
const avatarBorderColor = objectsToString(borderColor[findMatch(valid.colors, color, "gray")]);
const classes = twMerge(
classnames(objectsToString(base.initial), avatarVariant, avatarSize, {
[objectsToString(base.withBorder)]: withBorder,
[avatarBorderColor]: withBorder,
}),
className,
);
// 4. return
return <img {...rest} ref={ref} className={classes} />;
},
);
Avatar.propTypes = {
variant: PropTypes.oneOf(propTypesVariant),
size: PropTypes.oneOf(propTypesSize),
className: propTypesClassName,
withBorder: propTypesWithBorder,
color: PropTypes.oneOf(propTypesColor),
};
Avatar.displayName = "MaterialTailwind.Avatar";
export default Avatar;