/*
* 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 .
*/
// @flow
import * as React from 'react';
import {View} from 'react-native';
import {Card} from 'react-native-paper';
import i18n from 'i18n-js';
import {StackNavigationProp} from '@react-navigation/stack';
import {getDateOnlyString, getTimeOnlyString} from '../../utils/Planning';
import DateManager from '../../managers/DateManager';
import BasicLoadingScreen from '../../components/Screens/BasicLoadingScreen';
import {apiRequest, ERROR_TYPE} from '../../utils/WebData';
import ErrorView from '../../components/Screens/ErrorView';
import CustomHTML from '../../components/Overrides/CustomHTML';
import CustomTabBar from '../../components/Tabbar/CustomTabBar';
import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView';
import type {PlanningEventType} from '../../utils/Planning';
import ImageGalleryButton from '../../components/Media/ImageGalleryButton';
type PropsType = {
navigation: StackNavigationProp;
route: {params: {data: PlanningEventType; id: number; eventId: number}};
};
type StateType = {
loading: boolean;
};
const EVENT_INFO_URL = 'event/info';
/**
* Class defining a planning event information page.
*/
class PlanningDisplayScreen extends React.Component {
displayData: null | PlanningEventType;
shouldFetchData: boolean;
eventId: number;
errorCode: number;
/**
* Generates data depending on whether the screen was opened from the planning or from a link
*
* @param props
*/
constructor(props: PropsType) {
super(props);
if (props.route.params.data != null) {
this.displayData = props.route.params.data;
this.eventId = this.displayData.id;
this.shouldFetchData = false;
this.errorCode = 0;
this.state = {
loading: false,
};
} else {
this.displayData = null;
this.eventId = props.route.params.eventId;
this.shouldFetchData = true;
this.errorCode = 0;
this.state = {
loading: true,
};
this.fetchData();
}
}
/**
* Hides loading and saves fetched data
*
* @param data Received data
*/
onFetchSuccess = (data: PlanningEventType) => {
this.displayData = data;
this.setState({loading: false});
};
/**
* Hides loading and saves the error code
*
* @param error
*/
onFetchError = (error: number) => {
this.errorCode = error;
this.setState({loading: false});
};
/**
* Gets content to display
*
* @returns {*}
*/
getContent() {
const {displayData} = this;
if (displayData == null) {
return null;
}
let subtitle = getTimeOnlyString(displayData.date_begin);
const dateString = getDateOnlyString(displayData.date_begin);
if (dateString !== null && subtitle != null) {
subtitle += ` | ${DateManager.getInstance().getTranslatedDate(
dateString,
)}`;
}
return (
{displayData.logo !== null ? (
) : null}
{displayData.description !== null ? (
) : (
)}
);
}
/**
* Shows an error view and use a custom message if the event does not exist
*
* @returns {*}
*/
getErrorView() {
const {navigation} = this.props;
if (this.errorCode === ERROR_TYPE.BAD_INPUT) {
return (
);
}
return (
);
}
/**
* Fetches data for the current event id from the API
*/
fetchData = () => {
this.setState({loading: true});
apiRequest(EVENT_INFO_URL, 'POST', {id: this.eventId})
.then(this.onFetchSuccess)
.catch(this.onFetchError);
};
render() {
const {loading} = this.state;
if (loading) {
return ;
}
if (this.errorCode === 0) {
return this.getContent();
}
return this.getErrorView();
}
}
export default PlanningDisplayScreen;