UNPKG

tuya-panel-kit

Version:

a functional component library for developing tuya device panels!

149 lines (142 loc) 3.94 kB
import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { ViewPropTypes } from 'react-native'; import { RatioUtils, ThemeUtils } from '../../utils'; import TYFlatList from '../TYLists/list'; import TYText from '../TYText'; import { StyledContainer, StyledContent, StyledTitle, StyledSubTitle, StyledList } from './styled'; const { getTheme, ThemeConsumer } = ThemeUtils; const { convertX: cx } = RatioUtils; const ITEM_HEIGHT = 56; export default class List extends Component { static propTypes = { /** * 数据源超出多少可滚动 */ maxItemNum: PropTypes.number, /** * 数据源 */ dataSource: PropTypes.array.isRequired, /** * 容器样式 */ style: ViewPropTypes.style, /** * 内容样式 */ contentStyle: ViewPropTypes.style, /** * 列表样式 */ listStyle: ViewPropTypes.style, /** * 标题超过多少行显示省略号 */ titleNumberOfLines: PropTypes.number, /** * 标题 */ title: PropTypes.string.isRequired, /** * 标题样式 */ titleStyle: TYText.propTypes.style, /** * 副标题 */ subTitle: PropTypes.string, /** * 副标题样式 */ subTitleStyle: TYText.propTypes.style, }; static defaultProps = { maxItemNum: 5, style: null, contentStyle: null, listStyle: null, titleStyle: null, titleNumberOfLines: 2, subTitle: '', subTitleStyle: null, }; renderItem = ({ item }) => { const { styles = {}, ...props } = item; return ( <ThemeConsumer> {globalTheme => { const ListItemProps = { theme: { dialog: { ...globalTheme.dialog } } }; const itemBackGround = getTheme(ListItemProps, 'dialog.bg'); const itemFontColor = getTheme(ListItemProps, 'dialog.titleFontColor'); const itemFontSize = getTheme(ListItemProps, 'dialog.titleFontSize'); return ( <TYFlatList.Item styles={{ ...styles, container: [ { height: ITEM_HEIGHT, backgroundColor: itemBackGround, justifyContent: 'center', }, styles.container, ], contentCenter: [{ alignItems: 'center' }, styles.contentCenter], title: [ { fontWeight: '500', fontSize: itemFontSize, color: itemFontColor, }, styles.title, ], }} {...props} /> ); }} </ThemeConsumer> ); }; render() { const { maxItemNum, dataSource, style, contentStyle, listStyle, titleNumberOfLines, title, titleStyle, subTitle, subTitleStyle, ...TYFlatListProps } = this.props; return ( <StyledContainer style={style}> <StyledContent style={[{ paddingLeft: 0, paddingRight: 0, paddingBottom: 0 }, contentStyle]} > <StyledTitle style={[{ paddingVertical: subTitle ? 0 : 12 }, titleStyle]} numberOfLines={titleNumberOfLines} > {title} </StyledTitle> {!!subTitle && ( <StyledSubTitle style={[{ marginTop: 7 }, subTitleStyle]}>{subTitle}</StyledSubTitle> )} <StyledList style={[listStyle, { maxHeight: maxItemNum * ITEM_HEIGHT + cx(16) }]} scrollEnabled={dataSource.length > maxItemNum} keyExtractor={(item, idx) => item.key || idx} data={dataSource} renderItem={this.renderItem} {...TYFlatListProps} /> </StyledContent> </StyledContainer> ); } }