@fruits-chain/react-native-xiaoshu
Version:
🌈 React Native UI library
125 lines (113 loc) • 3.35 kB
JavaScript
import Color from 'color';
import isNil from 'lodash/isNil';
import React, { memo, useMemo } from 'react';
import { TouchableOpacity, View, Text, StyleSheet } from 'react-native';
import CrossOutline from '../icon/cross';
import Theme from '../theme';
import { varCreator, styleCreator } from './style';
/**
* Tag 标签
*/
const Tag = _ref => {
let {
children,
style,
innerStyle,
closable = false,
onClose,
size = 'm',
type = 'primary',
visible = true,
closeIcon,
icon,
color,
textColor
} = _ref;
const TOKENS = Theme.useThemeTokens();
const CV = Theme.createVar(TOKENS, varCreator);
const STYLES = Theme.createStyle(CV, styleCreator);
const mainColor = !isNil(color) ? color : CV.tag_primary_color;
const {
innerTypeStyle,
textTypeStyle
} = useMemo(() => {
const tempInnerStyle = {};
const tempTextStyle = {};
switch (type) {
case 'primary':
{
tempInnerStyle.backgroundColor = mainColor;
tempInnerStyle.borderColor = mainColor;
tempTextStyle.color = CV.tag_text_color;
break;
}
case 'ghost':
{
tempInnerStyle.backgroundColor = CV.tag_ghost_background_color;
tempInnerStyle.borderColor = mainColor;
tempInnerStyle.borderWidth = StyleSheet.hairlineWidth;
tempTextStyle.color = mainColor;
break;
}
case 'hazy':
{
const hazyColor = Color(mainColor).lightness(CV.tag_hazy_lightness).hex();
tempInnerStyle.backgroundColor = hazyColor;
tempInnerStyle.borderColor = hazyColor;
tempTextStyle.color = mainColor;
break;
}
default:
break;
}
return {
innerTypeStyle: tempInnerStyle,
textTypeStyle: tempTextStyle
};
}, [type, mainColor, CV.tag_text_color, CV.tag_ghost_background_color, CV.tag_hazy_lightness]);
const {
innerSizeStyle,
textSizeStyle
} = useMemo(() => {
const tempInnerStyle = STYLES[`tag_inner_${size}`];
const tempTextStyle = STYLES[`tag_text_${size}`];
return {
innerSizeStyle: tempInnerStyle,
textSizeStyle: tempTextStyle
};
}, [STYLES, size]);
const textStyle = StyleSheet.flatten([
/** 类型样式 */
textTypeStyle, textSizeStyle,
/** 外部样式 */
!isNil(textColor) && {
color: textColor
}]); // 关闭的图标
const renderChildren = () => {
const childJSX = /*#__PURE__*/React.createElement(Text, {
style: textStyle
}, children);
return childJSX;
}; // 关闭的图标
const renderCloseIcon = () => {
if (closable) {
return closeIcon ? /*#__PURE__*/React.createElement(TouchableOpacity, {
onPress: onClose
}, closeIcon) : /*#__PURE__*/React.createElement(CrossOutline, {
onPress: onClose,
size: CV[`tag_${size}_close_icon`],
color: textStyle.color
});
}
return null;
};
return visible ? /*#__PURE__*/React.createElement(View, {
style: [STYLES.tag, style]
}, /*#__PURE__*/React.createElement(View, {
style: [
/** 类型样式 */
STYLES.tag_inner, innerTypeStyle, innerSizeStyle, innerStyle]
}, icon, renderChildren(), renderCloseIcon())) : null;
};
export default /*#__PURE__*/memo(Tag);
//# sourceMappingURL=index.js.map