taro-material
Version:
Mini Program components that implement Google's Material Design.
211 lines (188 loc) • 6.88 kB
JavaScript
import Nerv from "nervjs";
import Taro, { Component } from "@tarojs/taro-h5";
import { View, Image, Switch } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { isFunction } from "../utils/typeof";
import RMBadge from "../Badge/index";
import RMIcon from "../Icon/index";
import RMTypography from "../Typography/index";
import RMButton from "../Button/index";
import theme from "../styles/theme";
import './ListItem.scss';
class RMListItem extends Component {
handleClick = (...args) => {
const { disabled } = this.props;
if (disabled) {
return;
}
if (isFunction(this.props.onClick)) {
this.props.onClick(...args);
}
};
handleSwitchClick(e) {
e.stopPropagation();
}
handleSwitchChange = (...args) => {
const { disabled } = this.props;
if (disabled) {
return;
}
if (isFunction(this.props.onSwitchChange)) {
this.props.onSwitchChange(...args);
}
};
render() {
const {
note,
arrow,
title,
wrap,
thumb,
iconThumb,
iconThumbFill,
iconThumbColor,
isSwitch,
extraText,
extraTextColor,
hasBorder,
extraThumb,
extraIconThumb,
extraIconThumbFill,
extraIconThumbColor,
switchIsCheck,
disabled,
customStyle,
customExtraStyle,
badge = { dot: false, value: '', maxValue: 0 },
image
} = this.props;
let arrowIcon = null;
switch (arrow) {
case 'top':
arrowIcon = 'expand_less';
break;
case 'bottom':
arrowIcon = 'expand_more';
break;
case 'right':
arrowIcon = 'chevron_right';
break;
default:
break;
}
const rootClass = classNames('at-list__item', {
'at-list__item--thumb': thumb || iconThumb || image,
'at-list__item--multiple': note,
'at-list__item--no-border': !hasBorder
}, this.props.className);
return <View className={rootClass} onClick={this.handleClick} style={customStyle}>
{thumb && <View className="at-list__item-thumb item-thumb">
<Image className="item-thumb-info" mode="scaleToFill" src={thumb} />
</View>}
{image && <View className="at-list__item-thumb item-thumb">
<Image className="item-thumb-info" mode="scaleToFill" src={image} />
</View>}
{iconThumb && <View className="at-list__item-thumb item-thumb">
<RMIcon className="item-thumb-info" color={iconThumbColor} fill={iconThumbFill} fontSize="inherit" block>
{iconThumb}
</RMIcon>
</View>}
<View className="at-list__item-content item-content">
<View className="item-content__info">
<View className={classNames({
'item-content__info-title': true,
wrap
})}>
<RMTypography className="subheading">{title}</RMTypography>
{this.props.renderTitle}
</View>
{note && <View className="item-content__info-note">
<RMTypography className="caption">{note}</RMTypography>
</View>}
{<View className="item-content__info-note">{this.props.renderNote}</View>}
</View>
</View>
<View className="at-list__item-extra item-extra" style={customExtraStyle}>
<RMBadge variant={badge.variant || 'text'} value={badge.value} maxValue={badge.maxValue}>
<View className={classNames({
'item-extra__badge': true
})}>
{extraText && <View className="item-extra__info">
<RMTypography className="body1" color={extraTextColor}>
{extraText}
</RMTypography>
</View>}
{extraThumb && <View className="item-extra__image">
<Image className="item-extra__image-info" mode="aspectFit" src={extraThumb} />
</View>}
{extraIconThumb && <View className="item-extra__image">
<RMIcon className="item-extra__image-info" color={extraIconThumbColor} fill={extraIconThumbFill} fontSize="inherit" block>
{extraIconThumb}
</RMIcon>
</View>}
{this.props.renderExtra}
{isSwitch && <View className="item-extra__switch" onClick={this.handleSwitchClick}>
<Switch color={theme.palette.primary.main} checked={switchIsCheck} onChange={this.handleSwitchChange} disabled={disabled} />
</View>}
</View>
</RMBadge>
{!extraText && !extraThumb && !extraIconThumb && !isSwitch && (badge.dot || badge.value) && <View className={classNames({
'item-extra__badge-num': badge.value
})} />}
{arrowIcon && <View className="item-extra__icon" style={{
margin: '0px -16px'
}}>
<RMButton variant="text" color="default" size="normal" disabled={disabled}>
<RMIcon color="inherit" fontSize="inherit" block>
{arrowIcon}
</RMIcon>
</RMButton>
</View>}
</View>
</View>;
}
}
RMListItem.defaultProps = {
wrap: false,
hasBorder: true,
isSwitch: false,
disabled: false,
customStyle: {},
customExtraStyle: {},
badge: { dot: false, value: '', maxValue: 0 }
};
RMListItem.propTypes = {
note: PropTypes.string,
title: PropTypes.string,
thumb: PropTypes.string,
iconThumb: PropTypes.string,
iconThumbFill: PropTypes.string,
iconThumbColor: PropTypes.oneOf(['inherit', 'primary', 'secondary', 'action', 'error', 'disabled', 'success', 'warning', 'progress', 'default']),
onClick: PropTypes.func,
isSwitch: PropTypes.bool,
hasBorder: PropTypes.bool,
switchIsCheck: PropTypes.bool,
extraText: PropTypes.string,
extraTextColor: PropTypes.string,
extraThumb: PropTypes.string,
extraIconThumb: PropTypes.string,
extraIconThumbFill: PropTypes.string,
extraIconThumbColor: PropTypes.oneOf(['inherit', 'primary', 'secondary', 'action', 'error', 'disabled', 'success', 'warning', 'progress', 'default']),
onSwitchChange: PropTypes.func,
arrow: PropTypes.oneOf(['up', 'down', 'right', '']),
disabled: PropTypes.bool,
renderNote: PropTypes.element,
renderTitle: PropTypes.element,
renderExtra: PropTypes.element,
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
customExtraStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
badge: PropTypes.shape({
variant: PropTypes.oneOf(['text', 'ribbon', 'mark', 'dot']),
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
maxValue: PropTypes.number
}),
wrap: PropTypes.bool,
image: PropTypes.string
};
export default RMListItem;