241 lines
6.7 KiB
JavaScript
241 lines
6.7 KiB
JavaScript
import React from "react";
|
|
import {
|
|
StyleSheet,
|
|
View,
|
|
StatusBar,
|
|
ImageBackground,
|
|
Text,
|
|
TouchableOpacity,
|
|
} from "react-native";
|
|
import themeColors from '../components/themeColors';
|
|
import MaterialIcon from "react-native-vector-icons/MaterialIcons";
|
|
import MaterialCommIcon from "react-native-vector-icons/MaterialCommunityIcons";
|
|
|
|
import EntypoIcon from "react-native-vector-icons/Entypo";
|
|
|
|
import { i18n } from '../utility/i18n';
|
|
|
|
import { ConnState, startSession } from '../state/DeviceReduxCoupling';
|
|
import { connect } from 'react-redux';
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
function LargeHeaderView(props) {
|
|
return (
|
|
<View style={largeHeaderStyles.container}>
|
|
<Text style={largeHeaderStyles.titleText}>swimtracker</Text>
|
|
<View style={largeHeaderStyles.separator}></View>
|
|
<Text style={largeHeaderStyles.subText}>bauer.tech</Text>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const largeHeaderStyles = StyleSheet.create({
|
|
container: {
|
|
height: 160,
|
|
maxHeight: 160,
|
|
flex: 1,
|
|
alignItems: "center",
|
|
justifyContent: "flex-end",
|
|
paddingBottom: 10,
|
|
},
|
|
titleText: {
|
|
color: "rgba(255,255,255,1)",
|
|
fontSize: 48,
|
|
},
|
|
subText: {
|
|
color: "rgba(255,255,255, 0.8)",
|
|
marginTop: 15,
|
|
textAlign: "center",
|
|
},
|
|
separator: {
|
|
height: 7,
|
|
backgroundColor: "rgba(255,255,255,1)",
|
|
opacity: 0.5,
|
|
width: 230
|
|
}
|
|
});
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
function ButtonGrid(props) {
|
|
return (
|
|
<View style={buttonGridStyles.rowContainer}>
|
|
<View style={buttonGridStyles.columnContainer}>
|
|
<TouchableOpacity
|
|
onPress={props.onLastSessionsPress}
|
|
style={[{ backgroundColor: themeColors["GREEN SEA"] }, buttonGridStyles.button]}
|
|
activeOpacity={0.6}
|
|
>
|
|
<MaterialCommIcon name="swim" style={buttonGridStyles.icon}></MaterialCommIcon>
|
|
<Text style={buttonGridStyles.buttonText}>{ i18n.t('lastSessions').toUpperCase().split(" ").join("\n") }</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
<View style={buttonGridStyles.columnContainer}>
|
|
<TouchableOpacity
|
|
onPress={props.onSocialPress}
|
|
style={[{ backgroundColor: "#444" }, buttonGridStyles.button]}
|
|
activeOpacity={0.6}
|
|
disabled={true}
|
|
>
|
|
<MaterialCommIcon name="account-group" style={buttonGridStyles.icon}></MaterialCommIcon>
|
|
<Text style={buttonGridStyles.buttonText}>{ i18n.t('mainMenu_social').toUpperCase()}</Text>
|
|
</TouchableOpacity>
|
|
<TouchableOpacity
|
|
onPress={props.onSettingsPress}
|
|
style={[{ backgroundColor: themeColors["MIDNIGHT BLUE"] }, buttonGridStyles.button]}
|
|
activeOpacity={0.6}
|
|
>
|
|
<MaterialIcon name="settings" style={buttonGridStyles.icon}></MaterialIcon>
|
|
<Text style={buttonGridStyles.buttonText}>{ i18n.t('settings').toUpperCase()}</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
const buttonGridStyles = StyleSheet.create({
|
|
rowContainer: {
|
|
flex: 1,
|
|
flexDirection: "column",
|
|
justifyContent: "space-around",
|
|
alignItems: "center",
|
|
paddingTop: 20,
|
|
paddingBottom: 50,
|
|
},
|
|
columnContainer: {
|
|
flex: 1,
|
|
width: "100%",
|
|
flexDirection: "row",
|
|
justifyContent: "space-around",
|
|
alignItems: "center",
|
|
},
|
|
button: {
|
|
flex: 1,
|
|
margin: 14,
|
|
padding: 20,
|
|
width: 120,
|
|
height: 130,
|
|
borderRadius: 10,
|
|
opacity: 0.95,
|
|
justifyContent: "space-around",
|
|
alignItems: "center",
|
|
},
|
|
buttonText: {
|
|
color: "rgba(255,255,255,1)",
|
|
textAlign: "center",
|
|
fontSize: 14,
|
|
},
|
|
icon: {
|
|
color: "rgba(255,255,255,1)",
|
|
fontSize: 60,
|
|
}
|
|
});
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
function FullWidthButton(props) {
|
|
let textStyle = [fullWidthButtonStyles.buttonText];
|
|
let iconStyle = [fullWidthButtonStyles.icon];
|
|
if (props.disabled) {
|
|
textStyle.push(fullWidthButtonStyles.buttonTextDisabled);
|
|
iconStyle.push(fullWidthButtonStyles.iconDisabled);
|
|
}
|
|
return (
|
|
<TouchableOpacity
|
|
onPress={props.onPress}
|
|
style={fullWidthButtonStyles.container}
|
|
disabled={props.disabled}
|
|
activeOpacity={0.6}>
|
|
<View style={{ flex: 1, flexDirection: "row", justifyContent: "center" }}>
|
|
<EntypoIcon name="air" style={iconStyle}></EntypoIcon>
|
|
<Text style={textStyle}>{props.text}</Text>
|
|
</View>
|
|
</TouchableOpacity>
|
|
)
|
|
}
|
|
|
|
const fullWidthButtonStyles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
maxHeight: 70,
|
|
backgroundColor: themeColors["WET ASPHALT"],
|
|
flexDirection: "row",
|
|
alignItems: "center",
|
|
//paddingBottom: 10,
|
|
justifyContent: "center",
|
|
},
|
|
buttonText: {
|
|
padding: 10,
|
|
color: "rgba(255,255,255,1)",
|
|
fontSize: 25,
|
|
fontWeight: "600",
|
|
textAlign: "center",
|
|
},
|
|
buttonTextDisabled: {
|
|
opacity: 0.3,
|
|
},
|
|
icon: {
|
|
fontSize: 40,
|
|
padding: 10,
|
|
color: themeColors["GREEN SEA"],
|
|
},
|
|
iconDisabled: {
|
|
color: themeColors["POMEGRANATE"],
|
|
},
|
|
});
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
function MainMenuView(props) {
|
|
const s = props.connState;
|
|
let startButtonText = i18n.t('mainMenu_swimNow').toUpperCase();
|
|
let startButtonDisabled = false;
|
|
if (s === ConnState.DISCONNECTED) {
|
|
startButtonText = "NICHT VERBUNDEN";
|
|
startButtonDisabled = true;
|
|
} else if (s === ConnState.CONNECTED_RUNNING || s === ConnState.CONNECTED_STARTING) {
|
|
startButtonText = "TRAINING LÄUFT";
|
|
} else if (s === ConnState.CONNECTED_STOPPING) {
|
|
startButtonDisabled = true;
|
|
}
|
|
|
|
const onStartButtonPress = () => {
|
|
if (props.connState !== ConnState.CONNECTED_RUNNING) {
|
|
props.dispatch(startSession());
|
|
}
|
|
props.navigation.navigate('Training')
|
|
};
|
|
|
|
return (
|
|
<View style={{ flex: 1 }}>
|
|
<StatusBar barStyle="light-content" backgroundColor="rgba(0,0,0,0.4)" translucent={true} />
|
|
<ImageBackground
|
|
source={require("../assets/pool_sky_background_blurred.jpg")}
|
|
resizeMode="cover"
|
|
style={{ flex: 1 }}
|
|
>
|
|
<View style={{ flex: 1 }}>
|
|
<LargeHeaderView />
|
|
<ButtonGrid
|
|
onSettingsPress={() => props.navigation.navigate('Settings')}
|
|
onLastSessionsPress = {() => props.navigation.navigate("LastSessions")}
|
|
/>
|
|
<FullWidthButton
|
|
onPress={onStartButtonPress}
|
|
text={startButtonText}
|
|
disabled={startButtonDisabled} />
|
|
</View>
|
|
</ImageBackground>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const mapStateToProps = (state) => {
|
|
return { connState: state.deviceState.connState };
|
|
};
|
|
|
|
export default connect(mapStateToProps)(MainMenuView);
|