import * as React from 'react'; import {ActivityIndicator, Avatar, List, ProgressBar, Surface, Text, withTheme} from 'react-native-paper'; import {StyleSheet, View} from "react-native"; import ProxiwashConstants from "../../../constants/ProxiwashConstants"; import i18n from "i18n-js"; import AprilFoolsManager from "../../../managers/AprilFoolsManager"; import * as Animatable from "react-native-animatable"; type Props = { item: Object, onPress: Function, isWatched: boolean, isDryer: boolean, height: number, } const AnimatedIcon = Animatable.createAnimatableComponent(Avatar.Icon); /** * Component used to display a proxiwash item, showing machine progression and state */ class ProxiwashListItem extends React.Component { stateColors: Object; stateStrings: Object; title: string; constructor(props) { super(props); this.stateColors = {}; this.stateStrings = {}; this.updateStateStrings(); let displayNumber = props.item.number; if (AprilFoolsManager.getInstance().isAprilFoolsEnabled()) displayNumber = AprilFoolsManager.getProxiwashMachineDisplayNumber(parseInt(props.item.number)); this.title = props.isDryer ? i18n.t('proxiwashScreen.dryer') : i18n.t('proxiwashScreen.washer'); this.title += ' n°' + displayNumber; } shouldComponentUpdate(nextProps: Props): boolean { const props = this.props; return (nextProps.theme.dark !== props.theme.dark) || (nextProps.item.state !== props.item.state) || (nextProps.item.donePercent !== props.item.donePercent) || (nextProps.isWatched !== props.isWatched); } updateStateStrings() { this.stateStrings[ProxiwashConstants.machineStates.TERMINE] = i18n.t('proxiwashScreen.states.finished'); this.stateStrings[ProxiwashConstants.machineStates.DISPONIBLE] = i18n.t('proxiwashScreen.states.ready'); this.stateStrings[ProxiwashConstants.machineStates["EN COURS"]] = i18n.t('proxiwashScreen.states.running'); this.stateStrings[ProxiwashConstants.machineStates.HS] = i18n.t('proxiwashScreen.states.broken'); this.stateStrings[ProxiwashConstants.machineStates.ERREUR] = i18n.t('proxiwashScreen.states.error'); } updateStateColors() { const colors = this.props.theme.colors; this.stateColors[ProxiwashConstants.machineStates.TERMINE] = colors.proxiwashFinishedColor; this.stateColors[ProxiwashConstants.machineStates.DISPONIBLE] = colors.proxiwashReadyColor; this.stateColors[ProxiwashConstants.machineStates["EN COURS"]] = colors.proxiwashRunningColor; this.stateColors[ProxiwashConstants.machineStates.HS] = colors.proxiwashBrokenColor; this.stateColors[ProxiwashConstants.machineStates.ERREUR] = colors.proxiwashErrorColor; } onListItemPress = () => this.props.onPress(this.title, this.props.item, this.props.isDryer); render() { const props = this.props; const colors = props.theme.colors; const machineState = props.item.state; const isRunning = ProxiwashConstants.machineStates[machineState] === ProxiwashConstants.machineStates["EN COURS"]; const isReady = ProxiwashConstants.machineStates[machineState] === ProxiwashConstants.machineStates.DISPONIBLE; const description = isRunning ? props.item.startTime + '/' + props.item.endTime : ''; const stateIcon = ProxiwashConstants.stateIcons[machineState]; const stateString = this.stateStrings[ProxiwashConstants.machineStates[machineState]]; const progress = isRunning ? props.item.donePercent !== '' ? parseInt(props.item.donePercent) / 100 : 0 : 1; const icon = props.isWatched ? : ; this.updateStateColors(); return ( { !isReady ? : null } icon} right={() => ( {stateString} { isRunning ? : } )} /> ); } } const styles = StyleSheet.create({ container: { margin: 5, justifyContent: 'center', elevation: 1 }, icon: { backgroundColor: 'transparent' }, progressBar: { position: 'absolute', left: 0, borderRadius: 4, }, }); export default withTheme(ProxiwashListItem);