weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
123 lines (111 loc) • 3.17 kB
JSX
/** @jsx createElement */
/**
* Copyright (c) 2015-present, Alibaba Group Holding Limited.
* All rights reserved.
*
* @providesModule
*/
;
import { createElement, Component, PropTypes } from 'rax';
import { connectStyle } from 'nuke-theme-provider';
import View from 'nuke-view';
import Text from 'nuke-text';
import Touchable from 'nuke-touchable';
import stylesProvider from '../styles';
class Badge extends Component {
constructor(props) {
super(props);
this.onPress = this.onPress.bind(this);
this.renderInnerText = this.renderInnerText.bind(this);
}
onPress() {
const { onPress } = this.props;
onPress && onPress();
}
renderInnerText(hidden, textStyle, sup) {
const { renderBadge } = this.props;
if (!renderBadge) {
if (!hidden) {
return <Text style={textStyle}>{sup}</Text>;
}
return null;
}
return renderBadge();
}
render() {
const { max, count, type, children, always, style = {}, renderBadge } = this.props;
const styles = this.props.themeStyle;
let sup = count;
let hidden = false;
sup = Number(count);
if (!isNaN(sup)) {
sup = sup > max ? `${max}+` : count;
(sup === 0 || sup === '0') && !always && (hidden = true);
} else {
sup = count; // for string
}
const wrapStyle = Object.assign(
{},
styles.wrap,
styles[`${type}-span`],
sup || always ? styles['number-span'] : styles['dot-span'],
styles['standalone-span'],
style
);
const TextAttrArr = ['color', 'fontSize', 'fontStyle', 'fontWeight', 'lineHeight'];
const inheritStyle = {};
TextAttrArr.forEach((item) => {
if (wrapStyle[item]) {
inheritStyle[item] = wrapStyle[item];
}
});
const textStyle = Object.assign({}, styles.span, sup || always ? null : styles['dot-span'], inheritStyle);
if (!type || type !== 'auto') {
return (
<View x="badge" style={wrapStyle}>
{!hidden ? <Text style={textStyle}>{sup}</Text> : null}
</View>
);
}
const touchStyle = [styles['auto-dot']];
if (!renderBadge) {
touchStyle.unshift(wrapStyle);
}
return (
<View style={styles['auto-container']}>
<View style={styles['auto-chindren']}>{children}</View>
<Touchable x="badge" style={touchStyle} onPress={this.onPress}>
{this.renderInnerText(hidden, textStyle, sup)}
</Touchable>
</View>
);
}
}
Badge.displayName = 'Badge';
Badge.propTypes = {
max: PropTypes.number,
count: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
type: PropTypes.oneOf(['normal', 'unread']),
children: PropTypes.any,
always: PropTypes.bool,
onPress: PropTypes.func,
themeStyle: PropTypes.object,
style: PropTypes.object,
renderBadge: PropTypes.func,
};
Badge.defaultProps = {
max: 99,
count: '',
type: 'normal',
children: null,
always: false,
onPress: () => {},
themeStyle: {},
style: {},
renderBadge: undefined,
};
Badge.contextTypes = {
getConfig: PropTypes.func,
};
const StyledBadge = connectStyle(stylesProvider)(Badge);
export default StyledBadge;