/* * 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 { SectionListData, StyleSheet, View } from 'react-native'; import { Card, Text, withTheme } from 'react-native-paper'; import { StackNavigationProp } from '@react-navigation/stack'; import i18n from 'i18n-js'; import DateManager from '../../managers/DateManager'; import WebSectionList from '../../components/Screens/WebSectionList'; import type { SectionListDataType } from '../../components/Screens/WebSectionList'; import Urls from '../../constants/Urls'; import { readData } from '../../utils/WebData'; type PropsType = { navigation: StackNavigationProp; theme: ReactNativePaper.Theme; }; export type RuFoodCategoryType = { name: string; dishes: Array<{ name: string }>; }; type RuMealType = { name: string; foodcategory: Array; }; type RawRuMenuType = { restaurant_id: number; id: number; date: string; meal: Array; }; const styles = StyleSheet.create({ itemCard: { flex: 0, marginHorizontal: 10, marginVertical: 5, }, headerCard: { width: '95%', marginLeft: 'auto', marginRight: 'auto', marginTop: 5, marginBottom: 5, elevation: 4, }, text: { textAlign: 'center', }, title: { paddingLeft: 0, }, itemTitle: { marginTop: 5, }, item: { width: '80%', marginLeft: 'auto', marginRight: 'auto', borderBottomWidth: 1, marginTop: 5, marginBottom: 5, }, itemText: { marginTop: 5, marginBottom: 5, textAlign: 'center', }, }); /** * Class defining the app's menu screen. */ class SelfMenuScreen extends React.Component { /** * Formats the given string to make sure it starts with a capital letter * * @param name The string to format * @return {string} The formatted string */ static formatName(name: string): string { return name.charAt(0) + name.substr(1).toLowerCase(); } /** * Creates the dataset to be used in the FlatList * * @param fetchedData * @return {[]} */ createDataset = ( fetchedData: Array | undefined ): SectionListDataType => { let result: SectionListDataType = []; if (fetchedData == null || fetchedData.length === 0) { result = [ { title: i18n.t('general.notAvailable'), data: [], keyExtractor: this.getKeyExtractor, }, ]; } else { fetchedData.forEach((item: RawRuMenuType) => { result.push({ title: DateManager.getInstance().getTranslatedDate(item.date), data: item.meal[0].foodcategory, keyExtractor: this.getKeyExtractor, }); }); } return result; }; /** * Gets the render section header * * @param section The section to render the header from * @return {*} */ getRenderSectionHeader = ({ section, }: { section: SectionListData; }) => { return ( ); }; /** * Gets a FlatList render item * * @param item The item to render * @return {*} */ getRenderItem = ({ item }: { item: RuFoodCategoryType }) => { const { theme } = this.props; return ( {item.dishes.map((object: { name: string }) => object.name !== '' ? ( {SelfMenuScreen.formatName(object.name)} ) : null )} ); }; /** * Extract a key for the given item * * @param item The item to extract the key from * @return {*} The extracted key */ getKeyExtractor = (item: RuFoodCategoryType): string => item.name; render() { return ( readData>(Urls.app.menu)} createDataset={this.createDataset} refreshOnFocus={true} renderItem={this.getRenderItem} renderSectionHeader={this.getRenderSectionHeader} stickyHeader={true} /> ); } } export default withTheme(SelfMenuScreen);