diff --git a/src/components/Lists/CardList/CardList.js b/src/components/Lists/CardList/CardList.js index da09a12..801521e 100644 --- a/src/components/Lists/CardList/CardList.js +++ b/src/components/Lists/CardList/CardList.js @@ -13,6 +13,7 @@ type Props = { } export type cardItem = { + key: string, title: string, subtitle: string, image: string | number, @@ -44,7 +45,7 @@ export default class CardList extends React.Component { return ; }; - keyExtractor = (item: cardItem) => item.title; + keyExtractor = (item: cardItem) => item.key; render() { let containerStyle = {}; diff --git a/src/managers/ServicesManager.js b/src/managers/ServicesManager.js new file mode 100644 index 0000000..cb6a75e --- /dev/null +++ b/src/managers/ServicesManager.js @@ -0,0 +1,261 @@ +// @flow + +import type {cardList} from "../components/Lists/CardList/CardList"; +import i18n from "i18n-js"; +import AvailableWebsites from "../constants/AvailableWebsites"; +import {StackNavigationProp} from "@react-navigation/stack"; +import ConnectionManager from "./ConnectionManager"; + +const CLUBS_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Clubs.png"; +const PROFILE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/ProfilAmicaliste.png"; +const EQUIPMENT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Materiel.png"; +const VOTE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Vote.png"; +const AMICALE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/WebsiteAmicale.png"; + +const PROXIMO_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Proximo.png" +const WIKETUD_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Wiketud.png"; +const EE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/EEC.png"; +const TUTORINSA_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/TutorINSA.png"; + +const BIB_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Bib.png"; +const RU_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/RU.png"; +const ROOM_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Salles.png"; +const EMAIL_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Bluemind.png"; +const ENT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/ENT.png"; +const ACCOUNT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Account.png"; + +export const SERVICES_KEY = { + CLUBS: "clubs", + PROFILE:"profile", + EQUIPMENT: "equipment", + AMICALE_WEBSITE: "amicale_website", + VOTE: "vote", + PROXIMO: "proximo", + WIKETUD: "wiketud", + ELUS_ETUDIANTS: "elus_etudiants", + TUTOR_INSA: "tutor_insa", + RU: "ru", + AVAILABLE_ROOMS: "available_rooms", + BIB: "bib", + EMAIL: "email", + ENT: "ent", + INSA_ACCOUNT: "insa_account", +} + +export default class ServicesManager { + + navigation: StackNavigationProp; + + amicaleDataset: cardList; + studentsDataset: cardList; + insaDataset: cardList; + + constructor(nav: StackNavigationProp) { + this.navigation = nav; + this.amicaleDataset = [ + { + key: SERVICES_KEY.CLUBS, + title: i18n.t('screens.clubs.title'), + subtitle: i18n.t('screens.services.descriptions.clubs'), + image: CLUBS_IMAGE, + onPress: () => this.onAmicaleServicePress("club-list"), + }, + { + key: SERVICES_KEY.PROFILE, + title: i18n.t('screens.profile.title'), + subtitle: i18n.t('screens.services.descriptions.profile'), + image: PROFILE_IMAGE, + onPress: () => this.onAmicaleServicePress("profile"), + }, + { + key: SERVICES_KEY.EQUIPMENT, + title: i18n.t('screens.equipment.title'), + subtitle: i18n.t('screens.services.descriptions.equipment'), + image: EQUIPMENT_IMAGE, + onPress: () => this.onAmicaleServicePress("equipment-list"), + }, + { + key: SERVICES_KEY.AMICALE_WEBSITE, + title: i18n.t('screens.websites.amicale'), + subtitle: i18n.t('screens.services.descriptions.amicaleWebsite'), + image: AMICALE_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.websites.amicale')}), + }, + { + key: SERVICES_KEY.VOTE, + title: i18n.t('screens.vote.title'), + subtitle: i18n.t('screens.services.descriptions.vote'), + image: VOTE_IMAGE, + onPress: () => this.onAmicaleServicePress("vote"), + }, + ]; + this.studentsDataset = [ + { + key: SERVICES_KEY.PROXIMO, + title: i18n.t('screens.proximo.title'), + subtitle: i18n.t('screens.services.descriptions.proximo'), + image: PROXIMO_IMAGE, + onPress: () => nav.navigate("proximo"), + }, + { + key: SERVICES_KEY.WIKETUD, + title: "Wiketud", + subtitle: i18n.t('screens.services.descriptions.wiketud'), + image: WIKETUD_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.WIKETUD, title: "Wiketud"}), + }, + { + key: SERVICES_KEY.ELUS_ETUDIANTS, + title: "Élus Étudiants", + subtitle: i18n.t('screens.services.descriptions.elusEtudiants'), + image: EE_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.WIKETUD, title: "Wiketud"}), + }, + { + key: SERVICES_KEY.TUTOR_INSA, + title: "Tutor'INSA", + subtitle: i18n.t('screens.services.descriptions.tutorInsa'), + image: TUTORINSA_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.TUTOR_INSA, title: "Tutor'INSA"}) + }, + ]; + this.insaDataset = [ + { + key: SERVICES_KEY.RU, + title: i18n.t('screens.menu.title'), + subtitle: i18n.t('screens.services.descriptions.self'), + image: RU_IMAGE, + onPress: () => nav.navigate("self-menu"), + }, + { + key: SERVICES_KEY.AVAILABLE_ROOMS, + title: i18n.t('screens.websites.rooms'), + subtitle: i18n.t('screens.services.descriptions.availableRooms'), + image: ROOM_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AVAILABLE_ROOMS, title: i18n.t('screens.websites.rooms')}), + }, + { + key: SERVICES_KEY.BIB, + title: i18n.t('screens.websites.bib'), + subtitle: i18n.t('screens.services.descriptions.bib'), + image: BIB_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BIB, title: i18n.t('screens.websites.bib')}), + }, + { + key: SERVICES_KEY.EMAIL, + title: i18n.t('screens.websites.mails'), + subtitle: i18n.t('screens.services.descriptions.mails'), + image: EMAIL_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BLUEMIND, title: i18n.t('screens.websites.mails')}), + }, + { + key: SERVICES_KEY.ENT, + title: i18n.t('screens.websites.ent'), + subtitle: i18n.t('screens.services.descriptions.ent'), + image: ENT_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ENT, title: i18n.t('screens.websites.ent')}), + }, + { + key: SERVICES_KEY.INSA_ACCOUNT, + title: i18n.t('screens.insaAccount.title'), + subtitle: i18n.t('screens.services.descriptions.insaAccount'), + image: ACCOUNT_IMAGE, + onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.INSA_ACCOUNT, title: i18n.t('screens.insaAccount.title')}), + }, + ]; + } + + /** + * Redirects the user to the login screen if he is not logged in + * + * @param route + * @returns {null} + */ + onAmicaleServicePress(route: string) { + if (ConnectionManager.getInstance().isLoggedIn()) + this.navigation.navigate(route); + else + this.navigation.navigate("login", {nextScreen: route}); + } + + /** + * Gets the given services list without items of the given ids + * + * @param idList The ids of items to remove + * @param sourceList The item list to use as source + * @returns {[]} + */ + getStrippedList(idList: Array, sourceList: cardList) { + let newArray = []; + for (let i = 0; i < sourceList.length; i++) { + const item = sourceList[i]; + if (!(idList.includes(item.key))) + newArray.push(item); + } + return newArray; + } + + /** + * Gets a services list of items with the given ids only + * + * @param idList The ids of items to find + * @returns {[]} + */ + getServicesOfId(idList: Array) { + const allServices = [ + ...this.amicaleDataset, + ...this.studentsDataset, + ...this.insaDataset, + ] + let servicesFound = []; + for (let i = 0; i < allServices.length; i++) { + const item = allServices[i]; + if (idList.includes(item.key)) { + servicesFound.push(item); + if (servicesFound.length === idList.length) + break; + } + } + return servicesFound; + } + + /** + * Gets the list of amicale's services + * + * @param excludedItems Ids of items to exclude from the returned list + * @returns {cardList|*[]} + */ + getAmicaleServices(excludedItems?: Array) { + if (excludedItems != null) + return this.getStrippedList(excludedItems, this.amicaleDataset) + else + return this.amicaleDataset; + } + + /** + * Gets the list of students' services + * + * @param excludedItems Ids of items to exclude from the returned list + * @returns {cardList|*[]} + */ + getStudentServices(excludedItems?: Array) { + if (excludedItems != null) + return this.getStrippedList(excludedItems, this.studentsDataset) + else + return this.studentsDataset; + } + + /** + * Gets the list of INSA's services + * + * @param excludedItems Ids of items to exclude from the returned list + * @returns {cardList|*[]} + */ + getINSAServices(excludedItems?: Array) { + if (excludedItems != null) + return this.getStrippedList(excludedItems, this.insaDataset) + else + return this.insaDataset; + } + +} diff --git a/src/screens/Amicale/ProfileScreen.js b/src/screens/Amicale/ProfileScreen.js index 459de86..bf8258a 100644 --- a/src/screens/Amicale/ProfileScreen.js +++ b/src/screens/Amicale/ProfileScreen.js @@ -16,6 +16,7 @@ import {StackNavigationProp} from "@react-navigation/stack"; import type {CustomTheme} from "../../managers/ThemeManager"; import AvailableWebsites from "../../constants/AvailableWebsites"; import Mascot, {MASCOT_STYLE} from "../../components/Mascot/Mascot"; +import ServicesManager, {SERVICES_KEY} from "../../managers/ServicesManager"; type Props = { navigation: StackNavigationProp, @@ -44,11 +45,6 @@ type Club = { is_manager: boolean, } -const CLUBS_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Clubs.png"; -const VOTE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Vote.png"; - -const ICON_AMICALE = require('../../../assets/amicale.png'); - class ProfileScreen extends React.Component { state = { @@ -60,37 +56,16 @@ class ProfileScreen extends React.Component { flatListData: Array<{ id: string }>; amicaleDataset: cardList; - constructor() { - super(); + constructor(props: Props) { + super(props); this.flatListData = [ {id: '0'}, {id: '1'}, {id: '2'}, {id: '3'}, ] - this.amicaleDataset = [ - { - title: i18n.t('screens.clubs.title'), - subtitle: i18n.t('screens.services.descriptions.clubs'), - image: CLUBS_IMAGE, - onPress: () => this.props.navigation.navigate("club-list"), - }, - { - title: i18n.t('screens.vote.title'), - subtitle: i18n.t('screens.services.descriptions.vote'), - image: VOTE_IMAGE, - onPress: () => this.props.navigation.navigate("vote"), - }, - { - title: i18n.t('screens.websites.amicale'), - subtitle: i18n.t('screens.services.descriptions.amicaleWebsite'), - image: ICON_AMICALE, - onPress: () => this.props.navigation.navigate("website", { - host: AvailableWebsites.websites.AMICALE, - title: i18n.t('screens.websites.amicale') - }), - }, - ]; + const services = new ServicesManager(props.navigation); + this.amicaleDataset = services.getAmicaleServices([SERVICES_KEY.PROFILE]); } componentDidMount() { diff --git a/src/screens/Services/ServicesScreen.js b/src/screens/Services/ServicesScreen.js index 105f85d..43e9548 100644 --- a/src/screens/Services/ServicesScreen.js +++ b/src/screens/Services/ServicesScreen.js @@ -13,10 +13,10 @@ import i18n from 'i18n-js'; import MaterialHeaderButtons, {Item} from "../../components/Overrides/CustomHeaderButton"; import ConnectionManager from "../../managers/ConnectionManager"; import {StackNavigationProp} from "@react-navigation/stack"; -import AvailableWebsites from "../../constants/AvailableWebsites"; import {MASCOT_STYLE} from "../../components/Mascot/Mascot"; import MascotPopup from "../../components/Mascot/MascotPopup"; import AsyncStorageManager from "../../managers/AsyncStorageManager"; +import ServicesManager from "../../managers/ServicesManager"; type Props = { navigation: StackNavigationProp, @@ -38,24 +38,6 @@ export type listItem = { const AMICALE_LOGO = require("../../../assets/amicale.png"); -const CLUBS_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Clubs.png"; -const PROFILE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/ProfilAmicaliste.png"; -const EQUIPMENT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Materiel.png"; -const VOTE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Vote.png"; -const AMICALE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/WebsiteAmicale.png"; - -const PROXIMO_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Proximo.png" -const WIKETUD_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Wiketud.png"; -const EE_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/EEC.png"; -const TUTORINSA_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/TutorINSA.png"; - -const BIB_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Bib.png"; -const RU_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/RU.png"; -const ROOM_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Salles.png"; -const EMAIL_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Bluemind.png"; -const ENT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/ENT.png"; -const ACCOUNT_IMAGE = "https://etud.insa-toulouse.fr/~amicale_app/images/Account.png"; - class ServicesScreen extends React.Component { amicaleDataset: cardList; @@ -70,103 +52,10 @@ class ServicesScreen extends React.Component { constructor(props) { super(props); - const nav = props.navigation; - this.amicaleDataset = [ - { - title: i18n.t('screens.clubs.title'), - subtitle: i18n.t('screens.services.descriptions.clubs'), - image: CLUBS_IMAGE, - onPress: () => this.onAmicaleServicePress("club-list"), - }, - { - title: i18n.t('screens.profile.title'), - subtitle: i18n.t('screens.services.descriptions.profile'), - image: PROFILE_IMAGE, - onPress: () => this.onAmicaleServicePress("profile"), - }, - { - title: i18n.t('screens.equipment.title'), - subtitle: i18n.t('screens.services.descriptions.equipment'), - image: EQUIPMENT_IMAGE, - onPress: () => this.onAmicaleServicePress("equipment-list"), - }, - { - title: i18n.t('screens.websites.amicale'), - subtitle: i18n.t('screens.services.descriptions.amicaleWebsite'), - image: AMICALE_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.websites.amicale')}), - }, - { - title: i18n.t('screens.vote.title'), - subtitle: i18n.t('screens.services.descriptions.vote'), - image: VOTE_IMAGE, - onPress: () => this.onAmicaleServicePress("vote"), - }, - ]; - this.studentsDataset = [ - { - title: i18n.t('screens.proximo.title'), - subtitle: i18n.t('screens.services.descriptions.proximo'), - image: PROXIMO_IMAGE, - onPress: () => nav.navigate("proximo"), - }, - { - title: "Wiketud", - subtitle: i18n.t('screens.services.descriptions.wiketud'), - image: WIKETUD_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.WIKETUD, title: "Wiketud"}), - }, - { - title: "Élus Étudiants", - subtitle: i18n.t('screens.services.descriptions.elusEtudiants'), - image: EE_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ELUS_ETUDIANTS, title: "Élus Étudiants"}), - }, - { - title: "Tutor'INSA", - subtitle: i18n.t('screens.services.descriptions.tutorInsa'), - image: TUTORINSA_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.TUTOR_INSA, title: "Tutor'INSA"}) - }, - ]; - this.insaDataset = [ - { - title: i18n.t('screens.menu.title'), - subtitle: i18n.t('screens.services.descriptions.self'), - image: RU_IMAGE, - onPress: () => nav.navigate("self-menu"), - }, - { - title: i18n.t('screens.websites.rooms'), - subtitle: i18n.t('screens.services.descriptions.availableRooms'), - image: ROOM_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AVAILABLE_ROOMS, title: i18n.t('screens.websites.rooms')}), - }, - { - title: i18n.t('screens.websites.bib'), - subtitle: i18n.t('screens.services.descriptions.bib'), - image: BIB_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BIB, title: i18n.t('screens.websites.bib')}), - }, - { - title: i18n.t('screens.websites.mails'), - subtitle: i18n.t('screens.services.descriptions.mails'), - image: EMAIL_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BLUEMIND, title: i18n.t('screens.websites.mails')}), - }, - { - title: i18n.t('screens.websites.ent'), - subtitle: i18n.t('screens.services.descriptions.ent'), - image: ENT_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ENT, title: i18n.t('screens.websites.ent')}), - }, - { - title: i18n.t('screens.insaAccount.title'), - subtitle: i18n.t('screens.services.descriptions.insaAccount'), - image: ACCOUNT_IMAGE, - onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.INSA_ACCOUNT, title: i18n.t('screens.insaAccount.title')}), - }, - ]; + const services = new ServicesManager(props.navigation); + this.amicaleDataset = services.getAmicaleServices(); + this.studentsDataset = services.getStudentServices(); + this.insaDataset = services.getINSAServices(); this.finalDataset = [ { title: i18n.t("screens.services.categories.amicale"),