application-amicale/screens/About/AboutScreen.js

219 lines
7.9 KiB
JavaScript
Raw Normal View History

// @flow
import * as React from 'react';
import {Alert, FlatList, Linking, Platform} from 'react-native';
import {Body, Card, CardItem, Container, Content, H1, Left, Right, Text, Thumbnail} from 'native-base';
2019-06-27 11:08:56 +02:00
import CustomHeader from "../../components/CustomHeader";
2019-06-25 22:20:24 +02:00
import i18n from "i18n-js";
2019-06-27 11:08:56 +02:00
import appJson from '../../app';
import packageJson from '../../package';
2019-06-28 11:35:15 +02:00
import CustomMaterialIcon from "../../components/CustomMaterialIcon";
2019-06-25 22:20:24 +02:00
const links = {
appstore: 'https://qwant.com',
2019-08-24 19:17:21 +02:00
playstore: 'https://play.google.com/store/apps/details?id=fr.amicaleinsat.application',
2019-08-05 15:10:20 +02:00
expo: 'https://expo.io/@amicaleinsat/application-amicale',
2019-08-09 11:47:44 +02:00
git: 'https://git.srv-falcon.etud.insa-toulouse.fr/vergnet/application-amicale/src/branch/master/README.md',
2019-08-05 15:10:20 +02:00
bugs: 'https://git.srv-falcon.etud.insa-toulouse.fr/vergnet/application-amicale/issues',
changelog: 'https://git.srv-falcon.etud.insa-toulouse.fr/vergnet/application-amicale/src/branch/master/Changelog.md',
license: 'https://git.srv-falcon.etud.insa-toulouse.fr/vergnet/application-amicale/src/branch/master/LICENSE',
2019-08-24 19:17:21 +02:00
mail: "mailto:vergnet@etud.insa-toulouse.fr?subject=Application Amicale INSA Toulouse&body=",
2019-06-25 22:20:24 +02:00
linkedin: 'https://www.linkedin.com/in/arnaud-vergnet-434ba5179/',
facebook: 'https://www.facebook.com/arnaud.vergnet',
react: 'https://facebook.github.io/react-native/',
};
type Props = {
navigation: Object,
};
2019-06-29 15:43:57 +02:00
/**
* Opens a link in the device's browser
* @param link The link to open
*/
2019-06-28 11:35:15 +02:00
function openWebLink(link) {
Linking.openURL(link).catch((err) => console.error('Error opening link', err));
}
2019-06-25 22:20:24 +02:00
2019-06-29 15:43:57 +02:00
/**
* Class defining an about screen. This screen shows the user information about the app and it's author.
*/
export default class AboutScreen extends React.Component<Props> {
2019-06-25 22:20:24 +02:00
2019-06-29 15:43:57 +02:00
/**
* Data to be displayed in the app card
*/
appData: Array<Object> = [
2019-06-28 11:35:15 +02:00
{
onPressCallback: () => openWebLink(Platform.OS === "ios" ? links.appstore : links.playstore),
icon: Platform.OS === "ios" ? 'apple' : 'google-play',
text: Platform.OS === "ios" ? i18n.t('aboutScreen.appstore') : i18n.t('aboutScreen.playstore'),
showChevron: true
},
{
2019-08-05 15:10:20 +02:00
onPressCallback: () => openWebLink(links.expo),
icon: 'worker',
text: i18n.t('aboutScreen.expoBeta'),
showChevron: true
},
{
onPressCallback: () => openWebLink(links.git),
2019-06-28 11:35:15 +02:00
icon: 'git',
2019-08-05 15:10:20 +02:00
text: 'Git',
2019-06-28 11:35:15 +02:00
showChevron: true
},
{
onPressCallback: () => openWebLink(links.bugs),
icon: 'bug',
text: i18n.t('aboutScreen.bugs'),
showChevron: true
},
{
onPressCallback: () => openWebLink(links.changelog),
icon: 'refresh',
text: i18n.t('aboutScreen.changelog'),
showChevron: true
},
{
onPressCallback: () => openWebLink(links.license),
icon: 'file-document',
text: i18n.t('aboutScreen.license'),
showChevron: true
},
];
2019-06-29 15:43:57 +02:00
/**
* Data to be displayed in the author card
*/
authorData: Array<Object> = [
2019-06-28 11:35:15 +02:00
{
onPressCallback: () => Alert.alert('Coucou', 'Whaou'),
icon: 'account-circle',
text: 'Arnaud VERGNET',
showChevron: false
},
{
onPressCallback: () => openWebLink(links.mail),
icon: 'email',
text: i18n.t('aboutScreen.mail'),
showChevron: true
},
{
onPressCallback: () => openWebLink(links.linkedin),
icon: 'linkedin',
text: 'Linkedin',
showChevron: true
},
{
onPressCallback: () => openWebLink(links.facebook),
icon: 'facebook',
text: 'Facebook',
showChevron: true
},
];
2019-06-29 15:43:57 +02:00
/**
* Data to be displayed in the technologies card
*/
technoData: Array<Object> = [
2019-06-28 11:35:15 +02:00
{
onPressCallback: () => openWebLink(links.react),
icon: 'react',
text: i18n.t('aboutScreen.reactNative'),
showChevron: false
},
{
onPressCallback: () => this.props.navigation.navigate('AboutDependenciesScreen', {data: packageJson.dependencies}),
icon: 'developer-board',
text: i18n.t('aboutScreen.libs'),
showChevron: true
},
];
2019-06-29 15:43:57 +02:00
/**
* Get a clickable card item to be rendered inside a card.
*
* @param onPressCallback The callback to use when the item is clicked
* @param icon The icon name to use from MaterialCommunityIcons
* @param text The text to show
* @param showChevron Whether to show a chevron indicating this button will change screen
* @returns {React.Node}
*/
static getCardItem(onPressCallback: Function, icon: string, text: string, showChevron: boolean) {
2019-06-28 11:35:15 +02:00
return (
<CardItem button
onPress={onPressCallback}>
<Left>
<CustomMaterialIcon icon={icon}/>
<Text>{text}</Text>
</Left>
{showChevron ?
<Right>
<CustomMaterialIcon icon="chevron-right"
fontSize={20}/>
</Right>
:
<Right/>
}
</CardItem>)
;
2019-06-25 22:20:24 +02:00
}
render() {
const nav = this.props.navigation;
return (
<Container>
<CustomHeader navigation={nav} title={i18n.t('screens.about')} hasBackButton={true}/>
<Content padder>
2019-06-25 22:20:24 +02:00
<Card>
<CardItem>
<Left>
2019-06-27 11:08:56 +02:00
<Thumbnail square source={require('../../assets/amicale.png')}/>
2019-06-25 22:20:24 +02:00
<Body>
<H1>Amicale INSA Toulouse</H1>
<Text note>
2019-06-27 11:08:56 +02:00
v.{appJson.expo.version}
2019-06-25 22:20:24 +02:00
</Text>
</Body>
</Left>
</CardItem>
2019-06-28 11:35:15 +02:00
<FlatList
data={this.appData}
keyExtractor={(item) => item.icon}
renderItem={({item}) =>
2019-06-29 15:43:57 +02:00
AboutScreen.getCardItem(item.onPressCallback, item.icon, item.text, item.showChevron)
2019-06-28 11:35:15 +02:00
}
/>
2019-06-25 22:20:24 +02:00
</Card>
<Card>
<CardItem header>
<Text>{i18n.t('aboutScreen.author')}</Text>
</CardItem>
2019-06-28 11:35:15 +02:00
<FlatList
data={this.authorData}
keyExtractor={(item) => item.icon}
renderItem={({item}) =>
2019-06-29 15:43:57 +02:00
AboutScreen.getCardItem(item.onPressCallback, item.icon, item.text, item.showChevron)
2019-06-28 11:35:15 +02:00
}
/>
2019-06-25 22:20:24 +02:00
</Card>
<Card>
<CardItem header>
<Text>{i18n.t('aboutScreen.technologies')}</Text>
</CardItem>
2019-06-28 11:35:15 +02:00
<FlatList
data={this.technoData}
keyExtractor={(item) => item.icon}
renderItem={({item}) =>
2019-06-29 15:43:57 +02:00
AboutScreen.getCardItem(item.onPressCallback, item.icon, item.text, item.showChevron)
2019-06-28 11:35:15 +02:00
}
/>
2019-06-25 22:20:24 +02:00
</Card>
</Content>
</Container>
);
}
}