/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ import { Text, FlexColumn, styled, FlexRow, Button, Spacer, Checkbox, colors, View, Tooltip, } from '../ui'; import React, {Component} from 'react'; export type SelectionType = 'multiple' | 'single'; type SubType = | { selectedElements: Set; type: 'multiple'; } | { selectedElement: string; type: 'single'; }; type Props = { onSubmit?: () => void; onChange: (elements: Array) => void; onHide: () => any; elements: Array<{label: string; id: string}>; title?: string; } & SubType; const Title = styled(Text)({ margin: 6, }); type State = { selectedElements: Set; }; const Container = styled(FlexColumn)({ padding: 8, }); const Line = styled(View)({ backgroundColor: colors.greyTint2, height: 1, width: 'auto', flexShrink: 0, }); const RowComponentContainer = styled(FlexColumn)({ overflow: 'scroll', height: 'auto', backgroundColor: colors.white, maxHeight: 500, }); const Padder = styled.div<{ paddingLeft?: number; paddingRight?: number; paddingBottom?: number; paddingTop?: number; }>(({paddingLeft, paddingRight, paddingBottom, paddingTop}) => ({ paddingLeft: paddingLeft || 0, paddingRight: paddingRight || 0, paddingBottom: paddingBottom || 0, paddingTop: paddingTop || 0, })); type RowComponentProps = { id: string; label: string; selected: boolean; onChange: (name: string, selected: boolean) => void; }; class RowComponent extends Component { render() { const {id, label, selected, onChange} = this.props; return ( {label} { onChange(id, selected); }} /> ); } } export default class ListView extends Component { state: State = {selectedElements: new Set([])}; static getDerivedStateFromProps(props: Props, _state: State) { if (props.type === 'multiple') { return {selectedElements: props.selectedElements}; } else if (props.type === 'single') { return {selectedElements: new Set([props.selectedElement])}; } return null; } handleChange = (id: string, selected: boolean) => { let selectedElements: Set = new Set([]); if (this.props.type === 'single') { if (!selected) { this.setState({selectedElements: selectedElements}); } else { selectedElements.add(id); this.setState({selectedElements: selectedElements}); } } else { if (selected) { selectedElements = new Set([...this.state.selectedElements, id]); this.props.onChange([...selectedElements]); } else { selectedElements = new Set([...this.state.selectedElements]); selectedElements.delete(id); this.props.onChange([...selectedElements]); } } }; render() { const {onSubmit} = this.props; return ( {this.props.title && {this.props.title}} {this.props.elements.map(({id, label}) => { return ( ); })} {onSubmit && ( )} ); } }