/* * 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 {FlatList, StyleSheet, View} from 'react-native'; import { Avatar, Button, Card, Divider, List, Paragraph, withTheme, } from 'react-native-paper'; import i18n from 'i18n-js'; import {StackNavigationProp} from '@react-navigation/stack'; import AuthenticatedScreen from '../../components/Amicale/AuthenticatedScreen'; import LogoutDialog from '../../components/Amicale/LogoutDialog'; import MaterialHeaderButtons, { Item, } from '../../components/Overrides/CustomHeaderButton'; import CardList from '../../components/Lists/CardList/CardList'; import AvailableWebsites from '../../constants/AvailableWebsites'; import Mascot, {MASCOT_STYLE} from '../../components/Mascot/Mascot'; import ServicesManager, {SERVICES_KEY} from '../../managers/ServicesManager'; import CollapsibleFlatList from '../../components/Collapsible/CollapsibleFlatList'; import type {ServiceItemType} from '../../managers/ServicesManager'; type PropsType = { navigation: StackNavigationProp; theme: ReactNativePaper.Theme; }; type StateType = { dialogVisible: boolean; }; type ClubType = { id: number; name: string; is_manager: boolean; }; type ProfileDataType = { first_name: string; last_name: string; email: string; birthday: string; phone: string; branch: string; link: string; validity: boolean; clubs: Array; }; const styles = StyleSheet.create({ card: { margin: 10, }, icon: { backgroundColor: 'transparent', }, editButton: { marginLeft: 'auto', }, }); class ProfileScreen extends React.Component { data: ProfileDataType | null; flatListData: Array<{id: string}>; amicaleDataset: Array; constructor(props: PropsType) { super(props); this.data = null; this.flatListData = [{id: '0'}, {id: '1'}, {id: '2'}, {id: '3'}]; const services = new ServicesManager(props.navigation); this.amicaleDataset = services.getAmicaleServices([SERVICES_KEY.PROFILE]); this.state = { dialogVisible: false, }; } componentDidMount() { const {navigation} = this.props; navigation.setOptions({ headerRight: this.getHeaderButton, }); } /** * Gets the logout header button * * @returns {*} */ getHeaderButton = () => ( ); /** * Gets the main screen component with the fetched data * * @param data The data fetched from the server * @returns {*} */ getScreen = (data: Array) => { const {dialogVisible} = this.state; this.data = data[0]; return ( ); }; getRenderItem = ({item}: {item: {id: string}}) => { switch (item.id) { case '0': return this.getWelcomeCard(); case '1': return this.getPersonalCard(); case '2': return this.getClubCard(); default: return this.getMembershipCar(); } }; /** * Gets the list of services available with the Amicale account * * @returns {*} */ getServicesList() { return ; } /** * Gets a card welcoming the user to his account * * @returns {*} */ getWelcomeCard() { const {navigation} = this.props; return ( ( )} titleStyle={{marginLeft: 10}} /> {i18n.t('screens.profile.welcomeDescription')} {this.getServicesList()} {i18n.t('screens.profile.welcomeFeedback')} ); } /** * Gets the given field value. * If the field does not have a value, returns a placeholder text * * @param field The field to get the value from * @return {*} */ static getFieldValue(field?: string): string { return field ? field : i18n.t('screens.profile.noData'); } /** * Gets a list item showing personal information * * @param field The field to display * @param icon The icon to use * @return {*} */ getPersonalListItem(field: string | undefined, icon: string) { const {theme} = this.props; const title = field != null ? ProfileScreen.getFieldValue(field) : ':('; const subtitle = field != null ? '' : ProfileScreen.getFieldValue(field); return ( ( )} /> ); } /** * Gets a card containing user personal information * * @return {*} */ getPersonalCard() { const {theme, navigation} = this.props; return ( ( )} /> {i18n.t('screens.profile.personalInformation')} {this.getPersonalListItem(this.data?.birthday, 'cake-variant')} {this.getPersonalListItem(this.data?.phone, 'phone')} {this.getPersonalListItem(this.data?.email, 'email')} {this.getPersonalListItem(this.data?.branch, 'school')} ); } /** * Gets a cars containing clubs the user is part of * * @return {*} */ getClubCard() { const {theme} = this.props; return ( ( )} /> {this.getClubList(this.data?.clubs)} ); } /** * Gets a card showing if the user has payed his membership * * @return {*} */ getMembershipCar() { const {theme} = this.props; return ( ( )} /> {this.getMembershipItem(this.data?.validity === true)} ); } /** * Gets the item showing if the user has payed his membership * * @return {*} */ getMembershipItem(state: boolean) { const {theme} = this.props; return ( ( )} /> ); } /** * Gets a list item for the club list * * @param item The club to render * @return {*} */ getClubListItem = ({item}: {item: ClubType}) => { const {theme} = this.props; const onPress = () => { this.openClubDetailsScreen(item.id); }; let description = i18n.t('screens.profile.isMember'); let icon = (props: { color: string; style: { marginLeft: number; marginRight: number; marginVertical?: number; }; }) => ( ); if (item.is_manager) { description = i18n.t('screens.profile.isManager'); icon = (props) => ( ); } return ( ); }; /** * Renders the list of clubs the user is part of * * @param list The club list * @return {*} */ getClubList(list: Array | undefined) { if (!list) { return null; } list.sort(this.sortClubList); return ( ); } clubKeyExtractor = (item: ClubType): string => item.name; sortClubList = (a: ClubType): number => (a.is_manager ? -1 : 1); showDisconnectDialog = () => { this.setState({dialogVisible: true}); }; hideDisconnectDialog = () => { this.setState({dialogVisible: false}); }; /** * Opens the club details screen for the club of given ID * @param id The club's id to open */ openClubDetailsScreen(id: number) { const {navigation} = this.props; navigation.navigate('club-information', {clubId: id}); } render() { const {navigation} = this.props; return ( ); } } export default withTheme(ProfileScreen);