import React from 'react'; import { StackNavigationOptions, StackNavigationProp } from '@react-navigation/stack'; import { FlatList, StyleSheet, Text, View } from 'react-native'; import { connect } from 'react-redux'; import { RadioButton } from 'react-native-ui-lib'; import { RouteProp } from '@react-navigation/native'; import log from '../utils/log'; import * as List from '../containers/List'; import I18n from '../i18n'; import * as HeaderButton from '../containers/HeaderButton'; import StatusBar from '../containers/StatusBar'; import { themes } from '../constants/colors'; import { withTheme } from '../theme'; import SafeAreaView from '../containers/SafeAreaView'; import { animateNextTransition } from '../utils/layoutAnimation'; import { ICON_SIZE } from '../containers/List/constants'; import SearchBox from '../containers/SearchBox'; import sharedStyles from './Styles'; const styles = StyleSheet.create({ buttonText: { fontSize: 16, margin: 16, ...sharedStyles.textRegular } }); interface IData { rid: string; name: string; t?: string; teamMain?: boolean; alert?: boolean; } interface ISelectListViewState { data: IData[]; dataFiltered: IData[]; isSearching: boolean; selected: string[]; } interface ISelectListViewProps { navigation: StackNavigationProp; route: RouteProp< { SelectView: { data: IData[]; title: string; infoText: string; nextAction(selected: string[]): void; showAlert(): void; isSearch: boolean; onSearch(text: string): IData[]; isRadio: boolean; }; }, 'SelectView' >; theme: string; isMasterDetail: boolean; } class SelectListView extends React.Component { private title: string; private infoText: string; private nextAction: (selected: string[]) => void; private showAlert: () => void; private isSearch: boolean; private onSearch: (text: string) => IData[]; private isRadio: boolean; constructor(props: ISelectListViewProps) { super(props); const data = props.route?.params?.data; this.title = props.route?.params?.title; this.infoText = props.route?.params?.infoText; this.nextAction = props.route?.params?.nextAction; this.showAlert = props.route?.params?.showAlert; this.isSearch = props.route?.params?.isSearch; this.onSearch = props.route?.params?.onSearch; this.isRadio = props.route?.params?.isRadio; this.state = { data, dataFiltered: [], isSearching: false, selected: [] }; this.setHeader(); } setHeader = () => { const { navigation, isMasterDetail } = this.props; const { selected } = this.state; const options: StackNavigationOptions = { headerTitle: I18n.t(this.title) }; if (isMasterDetail) { options.headerLeft = () => ; } options.headerRight = () => ( this.nextAction(selected)} testID='select-list-view-submit' /> ); navigation.setOptions(options); }; renderInfoText = () => { const { theme } = this.props; return ( {I18n.t(this.infoText)} ); }; renderSearch = () => { const { theme } = this.props; return ( this.search(text)} testID='select-list-view-search' onCancelPress={() => this.setState({ isSearching: false })} /> ); }; search = async (text: string) => { try { this.setState({ isSearching: true }); const result = await this.onSearch(text); this.setState({ dataFiltered: result }); } catch (e) { log(e); } }; isChecked = (rid: string) => { const { selected } = this.state; return selected.includes(rid); }; toggleItem = (rid: string) => { const { selected } = this.state; animateNextTransition(); if (this.isRadio) { if (!this.isChecked(rid)) { this.setState({ selected: [rid] }, () => this.setHeader()); } } else if (!this.isChecked(rid)) { this.setState({ selected: [...selected, rid] }, () => this.setHeader()); } else { const filterSelected = selected.filter(el => el !== rid); this.setState({ selected: filterSelected }, () => this.setHeader()); } }; renderItem = ({ item }: { item: IData }) => { const { theme } = this.props; const { selected } = this.state; const channelIcon = item.t === 'p' ? 'channel-private' : 'channel-public'; const teamIcon = item.t === 'p' ? 'teams-private' : 'teams'; const icon = item.teamMain ? teamIcon : channelIcon; const checked = this.isChecked(item.rid) ? 'check' : null; const showRadio = () => ( ); const showCheck = () => ( ); return ( <> (item.alert ? this.showAlert() : this.toggleItem(item.rid))} alert={item.alert} left={() => } right={() => (this.isRadio ? showRadio() : showCheck())} /> ); }; render() { const { data, isSearching, dataFiltered } = this.state; const { theme } = this.props; return ( item.rid} renderItem={this.renderItem} ListHeaderComponent={this.isSearch ? this.renderSearch : this.renderInfoText} contentContainerStyle={{ backgroundColor: themes[theme].backgroundColor }} keyboardShouldPersistTaps='always' /> ); } } const mapStateToProps = (state: any) => ({ isMasterDetail: state.app.isMasterDetail }); export default connect(mapStateToProps)(withTheme(SelectListView));