/* * Copyright (c) 2019 - 2020 Arnaud Vergnet. * * This file is part of Campus INSAT. * * Campus INSAT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Campus INSAT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Campus INSAT. If not, see . */ import * as React from 'react'; import {List, TouchableRipple, withTheme} from 'react-native-paper'; import * as Animatable from 'react-native-animatable'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import type {PlanexGroupType} from '../../../screens/Planex/GroupSelectionScreen'; type PropsType = { theme: ReactNativePaper.Theme; onPress: () => void; onStarPress: () => void; item: PlanexGroupType; favorites: Array; height: number; }; const REPLACE_REGEX = /_/g; class GroupListItem extends React.Component { isFav: boolean; starRef: {current: null | Animatable.View}; constructor(props: PropsType) { super(props); this.starRef = React.createRef(); this.isFav = this.isGroupInFavorites(props.favorites); } shouldComponentUpdate(nextProps: PropsType): boolean { const {favorites} = this.props; const favChanged = favorites.length !== nextProps.favorites.length; let newFavState = this.isFav; if (favChanged) { newFavState = this.isGroupInFavorites(nextProps.favorites); } const shouldUpdate = this.isFav !== newFavState; this.isFav = newFavState; return shouldUpdate; } onStarPress = () => { const {props} = this; const ref = this.starRef; if (ref.current) { if (this.isFav) { ref.current.rubberBand(); } else { ref.current.swing(); } } props.onStarPress(); }; isGroupInFavorites(favorites: Array): boolean { const {item} = this.props; for (let i = 0; i < favorites.length; i += 1) { if (favorites[i].id === item.id) { return true; } } return false; } render() { const {props} = this; const {colors} = props.theme; return ( ( )} right={(iconProps) => ( )} style={{ height: props.height, justifyContent: 'center', }} /> ); } } export default withTheme(GroupListItem);