UNPKG

@fruits-chain/react-native-xiaoshu

Version:
125 lines (113 loc) 3.35 kB
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