diff --git a/src/screens/Planning/PlanningDisplayScreen.js b/src/screens/Planning/PlanningDisplayScreen.tsx similarity index 89% rename from src/screens/Planning/PlanningDisplayScreen.js rename to src/screens/Planning/PlanningDisplayScreen.tsx index 09991ef..5b8ff55 100644 --- a/src/screens/Planning/PlanningDisplayScreen.js +++ b/src/screens/Planning/PlanningDisplayScreen.tsx @@ -36,12 +36,12 @@ import type {PlanningEventType} from '../../utils/Planning'; import ImageGalleryButton from '../../components/Media/ImageGalleryButton'; type PropsType = { - navigation: StackNavigationProp, - route: {params: {data: PlanningEventType, id: number, eventId: number}}, + navigation: StackNavigationProp; + route: {params: {data: PlanningEventType; id: number; eventId: number}}; }; type StateType = { - loading: boolean, + loading: boolean; }; const EVENT_INFO_URL = 'event/info'; @@ -111,22 +111,23 @@ class PlanningDisplayScreen extends React.Component { * * @returns {*} */ - getContent(): React.Node { - const {navigation} = this.props; + getContent() { const {displayData} = this; - if (displayData == null) return null; + if (displayData == null) { + return null; + } let subtitle = getTimeOnlyString(displayData.date_begin); const dateString = getDateOnlyString(displayData.date_begin); - if (dateString !== null && subtitle != null) + if (dateString !== null && subtitle != null) { subtitle += ` | ${DateManager.getInstance().getTranslatedDate( dateString, )}`; + } return ( {displayData.logo !== null ? ( { * * @returns {*} */ - getErrorView(): React.Node { + getErrorView() { const {navigation} = this.props; - if (this.errorCode === ERROR_TYPE.BAD_INPUT) + if (this.errorCode === ERROR_TYPE.BAD_INPUT) { return ( { icon="calendar-remove" /> ); + } return ( { */ fetchData = () => { this.setState({loading: true}); - apiRequest(EVENT_INFO_URL, 'POST', {id: this.eventId}) + apiRequest(EVENT_INFO_URL, 'POST', {id: this.eventId}) .then(this.onFetchSuccess) .catch(this.onFetchError); }; - render(): React.Node { + render() { const {loading} = this.state; - if (loading) return ; - if (this.errorCode === 0) return this.getContent(); + if (loading) { + return ; + } + if (this.errorCode === 0) { + return this.getContent(); + } return this.getErrorView(); } } diff --git a/src/screens/Planning/PlanningScreen.js b/src/screens/Planning/PlanningScreen.tsx similarity index 88% rename from src/screens/Planning/PlanningScreen.js rename to src/screens/Planning/PlanningScreen.tsx index df41c3e..ebebda7 100644 --- a/src/screens/Planning/PlanningScreen.js +++ b/src/screens/Planning/PlanningScreen.tsx @@ -17,8 +17,6 @@ * along with Campus INSAT. If not, see . */ -// @flow - import * as React from 'react'; import {BackHandler, View} from 'react-native'; import i18n from 'i18n-js'; @@ -26,12 +24,12 @@ import {Agenda, LocaleConfig} from 'react-native-calendars'; import {Avatar, Divider, List} from 'react-native-paper'; import {StackNavigationProp} from '@react-navigation/stack'; import {readData} from '../../utils/WebData'; -import type {PlanningEventType} from '../../utils/Planning'; import { generateEventAgenda, getCurrentDateString, getDateOnlyString, getTimeOnlyString, + PlanningEventType, } from '../../utils/Planning'; import CustomAgenda from '../../components/Overrides/CustomAgenda'; import {MASCOT_STYLE} from '../../components/Mascot/Mascot'; @@ -77,17 +75,16 @@ LocaleConfig.locales.fr = { 'Samedi', ], dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'], - today: "Aujourd'hui", }; type PropsType = { - navigation: StackNavigationProp, + navigation: StackNavigationProp; }; type StateType = { - refreshing: boolean, - agendaItems: {[key: string]: Array}, - calendarShowing: boolean, + refreshing: boolean; + agendaItems: {[key: string]: Array}; + calendarShowing: boolean; }; const FETCH_URL = 'https://www.amicale-insat.fr/api/event/list'; @@ -97,19 +94,22 @@ const AGENDA_MONTH_SPAN = 3; * Class defining the app's planning screen */ class PlanningScreen extends React.Component { - agendaRef: null | Agenda; + agendaRef: null | Agenda; - lastRefresh: Date; + lastRefresh: Date | null; minTimeBetweenRefresh = 60; - currentDate = getDateOnlyString(getCurrentDateString()); + currentDate: string | null; constructor(props: PropsType) { super(props); if (i18n.currentLocale().startsWith('fr')) { LocaleConfig.defaultLocale = 'fr'; } + this.agendaRef = null; + this.currentDate = getDateOnlyString(getCurrentDateString()); + this.lastRefresh = null; this.state = { refreshing: false, agendaItems: {}, @@ -145,6 +145,7 @@ class PlanningScreen extends React.Component { onBackButtonPressAndroid = (): boolean => { const {calendarShowing} = this.state; if (calendarShowing && this.agendaRef != null) { + // @ts-ignore this.agendaRef.chooseDay(this.agendaRef.state.selectedDay); return true; } @@ -156,11 +157,13 @@ class PlanningScreen extends React.Component { */ onRefresh = () => { let canRefresh; - if (this.lastRefresh !== undefined) + if (this.lastRefresh) { canRefresh = (new Date().getTime() - this.lastRefresh.getTime()) / 1000 > this.minTimeBetweenRefresh; - else canRefresh = true; + } else { + canRefresh = true; + } if (canRefresh) { this.setState({refreshing: true}); @@ -185,7 +188,7 @@ class PlanningScreen extends React.Component { * * @param ref */ - onAgendaRef = (ref: Agenda) => { + onAgendaRef = (ref: Agenda) => { this.agendaRef = ref; }; @@ -204,23 +207,24 @@ class PlanningScreen extends React.Component { * @param item The current event to render * @return {*} */ - getRenderItem = (item: PlanningEventType): React.Node => { + getRenderItem = (item: PlanningEventType) => { const {navigation} = this.props; const onPress = () => { navigation.navigate('planning-information', { data: item, }); }; - if (item.logo !== null) { + const logo = item.logo; + if (logo) { return ( ( + left={() => ( )} @@ -246,23 +250,22 @@ class PlanningScreen extends React.Component { * * @return {*} */ - getRenderEmptyDate = (): React.Node => ; + getRenderEmptyDate = () => ; - render(): React.Node { + render() { const {state, props} = this; return ( { firstDay={1} // ref to this agenda in order to handle back button event onRef={this.onAgendaRef} + rowHasChanged={(r1: PlanningEventType, r2: PlanningEventType) => + r1.id !== r2.id + } /> { message={i18n.t('screens.planning.mascotDialog.message')} icon="party-popper" buttons={{ - action: null, cancel: { message: i18n.t('screens.planning.mascotDialog.button'), icon: 'check',