Improved scanner information display

This commit is contained in:
Arnaud Vergnet 2020-04-08 16:23:33 +02:00
parent 96e9da162e
commit 53daa6671a
4 changed files with 80 additions and 20 deletions

View file

@ -68,7 +68,7 @@ class ClubDisplayScreen extends React.Component<Props, State> {
this.clubId = this.props.route.params.data.id; this.clubId = this.props.route.params.data.id;
this.shouldFetchData = false; this.shouldFetchData = false;
} else { } else {
this.displayData = {}; this.displayData = null;
this.categories = null; this.categories = null;
this.clubId = this.props.route.params.clubId; this.clubId = this.props.route.params.clubId;
this.shouldFetchData = true; this.shouldFetchData = true;
@ -76,10 +76,6 @@ class ClubDisplayScreen extends React.Component<Props, State> {
} }
} }
componentDidMount(): * {
this.props.navigation.setOptions({title: this.displayData.name})
}
getCategoryName(id: number) { getCategoryName(id: number) {
if (this.categories !== null) { if (this.categories !== null) {
for (let i = 0; i < this.categories.length; i++) { for (let i = 0; i < this.categories.length; i++) {
@ -134,8 +130,13 @@ class ClubDisplayScreen extends React.Component<Props, State> {
); );
} }
updateHeaderTitle(data: Object) {
this.props.navigation.setOptions({title: data.name})
}
getScreen = (data: Object) => { getScreen = (data: Object) => {
data = FakeClub; data = FakeClub;
this.updateHeaderTitle(data);
return ( return (
<ScrollView style={{paddingLeft: 5, paddingRight: 5}}> <ScrollView style={{paddingLeft: 5, paddingRight: 5}}>

View file

@ -2,7 +2,7 @@
import * as React from 'react'; import * as React from 'react';
import {StyleSheet, View} from "react-native"; import {StyleSheet, View} from "react-native";
import {Text, withTheme} from 'react-native-paper'; import {Button, Text, withTheme} from 'react-native-paper';
import {BarCodeScanner} from "expo-barcode-scanner"; import {BarCodeScanner} from "expo-barcode-scanner";
import {Camera} from 'expo-camera'; import {Camera} from 'expo-camera';
import URLHandler from "../utils/URLHandler"; import URLHandler from "../utils/URLHandler";
@ -15,6 +15,8 @@ type State = {
hasPermission: boolean, hasPermission: boolean,
scanned: boolean, scanned: boolean,
dialogVisible: boolean, dialogVisible: boolean,
dialogTitle: string,
dialogMessage: string,
}; };
class ScannerScreen extends React.Component<Props, State> { class ScannerScreen extends React.Component<Props, State> {
@ -23,6 +25,8 @@ class ScannerScreen extends React.Component<Props, State> {
hasPermission: false, hasPermission: false,
scanned: false, scanned: false,
dialogVisible: false, dialogVisible: false,
dialogTitle: "",
dialogMessage: "",
}; };
constructor() { constructor() {
@ -30,22 +34,39 @@ class ScannerScreen extends React.Component<Props, State> {
} }
componentDidMount() { componentDidMount() {
Camera.requestPermissionsAsync().then(this.updatePermissionStatus); this.requestPermissions();
} }
requestPermissions = () => Camera.requestPermissionsAsync().then(this.updatePermissionStatus);
updatePermissionStatus = ({status}) => this.setState({hasPermission: status === "granted"}); updatePermissionStatus = ({status}) => this.setState({hasPermission: status === "granted"});
handleCodeScanned = ({type, data}) => { handleCodeScanned = ({type, data}) => {
this.setState({scanned: true});
if (!URLHandler.isUrlValid(data)) if (!URLHandler.isUrlValid(data))
this.showErrorDialog(); this.showErrorDialog();
else else {
this.setState({scanned: true});
Linking.openURL(data); Linking.openURL(data);
}
}; };
getPermissionScreen() { getPermissionScreen() {
return <Text>PLS</Text> return <View style={{marginLeft: 10, marginRight: 10}}>
<Text>{i18n.t("scannerScreen.errorPermission")}</Text>
<Button
icon="camera"
mode="contained"
onPress={this.requestPermissions}
style={{
marginTop: 10,
marginLeft: 'auto',
marginRight: 'auto',
}}
>
{i18n.t("scannerScreen.buttonPermission")}
</Button>
</View>
} }
getOverlay() { getOverlay() {
@ -78,8 +99,22 @@ class ScannerScreen extends React.Component<Props, State> {
); );
} }
showHelpDialog = () => {
this.setState({
dialogVisible: true,
scanned: true,
dialogTitle: i18n.t("scannerScreen.helpTitle"),
dialogMessage: i18n.t("scannerScreen.helpMessage"),
});
};
showErrorDialog() { showErrorDialog() {
this.setState({dialogVisible: true}); this.setState({
dialogVisible: true,
scanned: true,
dialogTitle: i18n.t("scannerScreen.errorTitle"),
dialogMessage: i18n.t("scannerScreen.errorMessage"),
});
} }
onDialogDismiss = () => this.setState({ onDialogDismiss = () => this.setState({
@ -90,12 +125,6 @@ class ScannerScreen extends React.Component<Props, State> {
getScanner() { getScanner() {
return ( return (
<View style={styles.cameraContainer}> <View style={styles.cameraContainer}>
<AlertDialog
visible={this.state.dialogVisible}
onDismiss={this.onDialogDismiss}
title={i18n.t("scannerScreen.errorTitle")}
message={i18n.t("scannerScreen.errorMessage")}
/>
<Camera <Camera
onBarCodeScanned={this.state.scanned ? undefined : this.handleCodeScanned} onBarCodeScanned={this.state.scanned ? undefined : this.handleCodeScanned}
type={Camera.Constants.Type.back} type={Camera.Constants.Type.back}
@ -118,6 +147,20 @@ class ScannerScreen extends React.Component<Props, State> {
? this.getScanner() ? this.getScanner()
: this.getPermissionScreen() : this.getPermissionScreen()
} }
<AlertDialog
visible={this.state.dialogVisible}
onDismiss={this.onDialogDismiss}
title={this.state.dialogTitle}
message={this.state.dialogMessage}
/>
<Button
icon="information"
mode="contained"
onPress={this.showHelpDialog}
style={styles.button}
>
{i18n.t("scannerScreen.helpButton")}
</Button>
</View> </View>
); );
} }
@ -167,6 +210,12 @@ const styles = StyleSheet.create({
aspectRatio: 1, aspectRatio: 1,
width: '100%', width: '100%',
}, },
button: {
position: 'absolute',
bottom: 5,
width: '80%',
left: '10%'
},
overlayTopLeft: { overlayTopLeft: {
...overlayBoxStyle, ...overlayBoxStyle,
top: borderOffset, top: borderOffset,

View file

@ -227,8 +227,13 @@
"membershipNotPayed": "Not payed" "membershipNotPayed": "Not payed"
}, },
"scannerScreen": { "scannerScreen": {
"errorPermission": "Scanotron 3000 needs access to the camera in order to scan QR codes.\nThe camera will never be used for any other purpose.",
"buttonPermission": "Grant camera access",
"errorTitle": "QR code invalid", "errorTitle": "QR code invalid",
"errorMessage": "The QR code scanned could not be recognised, please make sure it is valid." "errorMessage": "The QR code scanned could not be recognised, please make sure it is valid.",
"helpButton": "What can I scan?",
"helpTitle": "How to use Scanotron 3000",
"helpMessage": "Find Campus QR codes posted by clubs and events, scan them and get instant access to detailed information!"
}, },
"loginScreen": { "loginScreen": {
"title": "Amicale account", "title": "Amicale account",

View file

@ -227,8 +227,13 @@
"membershipNotPayed": "Non payée" "membershipNotPayed": "Non payée"
}, },
"scannerScreen": { "scannerScreen": {
"errorPermission": "Scanotron 3000 a besoin d'accéder à la caméra pour scanner des QR codes.\nLa caméra ne sera jamais utilisée autrement.",
"buttonPermission": "Autoriser l'accès à la caméra",
"errorTitle": "QR code invalide", "errorTitle": "QR code invalide",
"errorMessage": "Le QR code scannée n'a pas été reconnu. Merci de vérifier sa validité." "errorMessage": "Le QR code scannée n'a pas été reconnu. Merci de vérifier sa validité.",
"helpButton": "Quoi scanner ?",
"helpTitle": "Comment utiliser Scanotron 3000",
"helpMessage": "Trouvez des QR codes Campus affichés par des clubs ou des respo d'évenements, scannez les et accédez à des informations détaillées !"
}, },
"loginScreen": { "loginScreen": {
"title": "Compte Amicale", "title": "Compte Amicale",