From b256d50c3fdb11d552aa70bd437817a1beb3da69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Taneli=20Riihim=C3=A4ki?= <m3034@student.jamk.fi> Date: Fri, 5 Jul 2019 15:03:26 +0300 Subject: [PATCH] ADD styling --- App.js | 18 ++++++++++-- components/GameList.js | 39 +++++++++++++++++++++++--- components/LocationTracker.js | 3 ++ components/Login.js | 50 ++++++++++++++++++++++------------ components/LoginForm.js | 35 ++++++++++++++++++------ components/RegisterForm.js | 38 ++++++++++++++++++++------ images/tacs-logo-neg.png | Bin 0 -> 7676 bytes 7 files changed, 143 insertions(+), 40 deletions(-) create mode 100644 images/tacs-logo-neg.png diff --git a/App.js b/App.js index 22f1e9a..9cdcbee 100755 --- a/App.js +++ b/App.js @@ -1,5 +1,5 @@ import React, { Component } from "react"; -import { StyleSheet, View } from "react-native"; +import { StyleSheet, View, Image } from "react-native"; import Login from "./components/Login"; @@ -8,6 +8,13 @@ export default class App extends Component { return ( <View style={styles.container}> <View style={{ flex: 1, flexDirection: "column" }}> + <View style={styles.logoContainer}> + <Image + resizeMode="stretch" + style={styles.logo} + source={require("./images/tacs-logo-neg.png")} + /> + </View> <Login /> </View> </View> @@ -21,6 +28,13 @@ const styles = StyleSheet.create({ paddingHorizontal: 80, paddingVertical: 80, flex: 1, - backgroundColor: "#F5FCFF" + backgroundColor: "#1d1d1b" + }, + logo: { + marginLeft: "auto", + marginRight: "auto" + }, + logoContainer: { + padding: 20 } }); diff --git a/components/GameList.js b/components/GameList.js index 5c13c42..4436a38 100644 --- a/components/GameList.js +++ b/components/GameList.js @@ -58,6 +58,28 @@ class GameList extends Component { }); await this.getFactions(); } + + getFactionMembers() { + fetch(`https://tacs-testing.cf:8443/game/${this.state.selectedGame.id}`, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json" + } + }) + .then(res => res.json()) + .then(gameInfo => { + let newFactions = [{ factionName: "- -" }, ...gameInfo.factions]; + this.setState({ + factions: newFactions, + selectedFaction: newFactions[0] + }); + }) + .catch(error => { + console.log(error); + }); + } + // Get all the factions from the server getFactions() { fetch(`https://tacs-testing.cf:8443/game/${this.state.selectedGame.id}`, { @@ -207,9 +229,13 @@ class GameList extends Component { timeout: 30000, maximumAge: 0 }; - navigator.geolocation.getCurrentPosition( + navigator.geolocation.watchPosition( position => { - console.log("Position : " + position); + console.log( + "Positio päivittyi: " + + position.coords.latitude + + position.coords.longitude + ); this.setState({ userLocation: { latitude: position.coords.latitude, @@ -253,6 +279,7 @@ class GameList extends Component { <View style={styles.popupBottom}> <View style={styles.popupButton}> <Button + color="#424242" onPress={() => { this.joinFaction(); this.setPopupVisible(!this.state.passwordPopupVisible); @@ -262,6 +289,7 @@ class GameList extends Component { </View> <View style={styles.popupButton}> <Button + color="#424242" onPress={() => { this.setPopupVisible(!this.state.passwordPopupVisible); }} @@ -319,9 +347,11 @@ class GameList extends Component { const styles = StyleSheet.create({ picker: { + color: "#ffffff", paddingBottom: 30 }, pickerTitle: { + color: "#ffffff", paddingTop: 10, fontSize: 20 }, @@ -335,10 +365,11 @@ const styles = StyleSheet.create({ popup: { width: 300, height: "auto", - backgroundColor: "#fff", + backgroundColor: "#1d1d1b", padding: 20 }, popupTitle: { + color: "#ffffff", fontSize: 20, textAlign: "center" }, @@ -353,7 +384,7 @@ const styles = StyleSheet.create({ popupInput: { margin: 20, padding: 5, - backgroundColor: "#e0e0e0" + backgroundColor: "#424242" } }); diff --git a/components/LocationTracker.js b/components/LocationTracker.js index f40a770..d5490c6 100644 --- a/components/LocationTracker.js +++ b/components/LocationTracker.js @@ -7,6 +7,8 @@ const LocationTracker = props => { <Text style={styles.titleText}>Tracking:</Text> <View style={styles.switchContainer}> <Switch + thumbColor="#556023" + trackColor={{ false: "#424242", true: "#859b28" }} style={styles.switch} value={props.tracking} onValueChange={props.handleTrackingChange} @@ -28,6 +30,7 @@ const styles = StyleSheet.create({ }, titleText: { fontSize: 40, + color: "#ffffff", fontWeight: "bold", textAlign: "center" } diff --git a/components/Login.js b/components/Login.js index 33179f4..0449e86 100644 --- a/components/Login.js +++ b/components/Login.js @@ -1,5 +1,5 @@ import React, { Component, Fragment } from "react"; -import { View, Button, StyleSheet, AsyncStorage } from "react-native"; +import { View, Button, StyleSheet, AsyncStorage, Image } from "react-native"; import LoginForm from "./LoginForm"; import RegisterForm from "./RegisterForm"; @@ -71,26 +71,35 @@ class Login extends Component { <View className="container"> <View className="navigation"> {!this.state.username && ( - <Button - id="loginButton" - onPress={() => this.toggleView("login")} - title="Login" - /> + <View style={styles.buttonContainer}> + <Button + color="#424242" + id="loginButton" + onPress={() => this.toggleView("login")} + title="Login" + /> + </View> )} {!this.state.username && ( - <Button - id="registerButton" - onPress={() => this.toggleView("register")} - title="Register" - /> + <View style={styles.buttonContainer}> + <Button + color="#424242" + id="registerButton" + onPress={() => this.toggleView("register")} + title="Register" + /> + </View> )} {this.state.username && ( <Fragment> - <Button - id="logoutButton" - onPress={this.handleLogout.bind(this)} - title="Logout" - /> + <View style={styles.buttonContainer}> + <Button + color="#424242" + id="logoutButton" + onPress={this.handleLogout.bind(this)} + title="Logout" + /> + </View> <GameList token={this.state.token} /> </Fragment> )} @@ -115,7 +124,14 @@ class Login extends Component { } const styles = StyleSheet.create({ - container: {} + buttonContainer: { + padding: 5 + }, + logo: { + alignContent: "center", + alignItems: "center", + justifyContent: "center" + } }); export default Login; diff --git a/components/LoginForm.js b/components/LoginForm.js index e8129d2..15877c4 100644 --- a/components/LoginForm.js +++ b/components/LoginForm.js @@ -63,7 +63,6 @@ export class LoginForm extends React.Component { <View className="sticky"> <Text id="closeLoginFormX" - className="close" style={styles.close} onPress={this.handleView} > @@ -71,8 +70,9 @@ export class LoginForm extends React.Component { </Text> </View> <View className="login"> - <Text>Login</Text> + <Text style={styles.tooltipText}>Login</Text> <TextInput + style={styles.textInput} placeholder="Enter Username" value={this.state.username} onChangeText={username => this.setState({ username })} @@ -81,6 +81,7 @@ export class LoginForm extends React.Component { required /> <TextInput + style={styles.textInput} placeholder="Enter password" secureTextEntry={true} value={this.state.password} @@ -88,11 +89,14 @@ export class LoginForm extends React.Component { id="loginPasswordInput" required /> - <Button - id="submitLoginButton" - title="Submit" - onPress={this.handleLogin} - /> + <View style={styles.buttonContainer}> + <Button + color="#424242" + id="submitLoginButton" + title="Submit" + onPress={this.handleLogin} + /> + </View> <Text>{this.state.errorMsg}</Text> </View> </View> @@ -102,8 +106,23 @@ export class LoginForm extends React.Component { const styles = StyleSheet.create({ close: { + marginTop: 10, + marginLeft: 100, + marginRight: 100, + alignContent: "center", fontSize: 40, - textAlign: "center" + textAlign: "center", + backgroundColor: "#424242" + }, + textInput: { + backgroundColor: "#424242", + margin: 5 + }, + tooltipText: { + color: "#ffffff" + }, + buttonContainer: { + padding: 5 } }); diff --git a/components/RegisterForm.js b/components/RegisterForm.js index f9b0fb1..b7e83e2 100644 --- a/components/RegisterForm.js +++ b/components/RegisterForm.js @@ -74,17 +74,14 @@ export class RegisterForm extends React.Component { return ( <View className="fade-main"> <View className="sticky"> - <Text - className="close" - onPress={this.handleView} - style={styles.close} - > + <Text onPress={this.handleView} style={styles.close}> × </Text> </View> <View className="login"> - <Text>Register New User</Text> + <Text style={styles.tooltipText}>Register New User</Text> <TextInput + style={styles.textInput} placeholder="Enter Username" value={this.state.username} onChangeText={username => this.setState({ username })} @@ -92,6 +89,7 @@ export class RegisterForm extends React.Component { required /> <TextInput + style={styles.textInput} placeholder="Enter password" secureTextEntry={true} value={this.state.password} @@ -99,14 +97,21 @@ export class RegisterForm extends React.Component { required /> <TextInput + style={styles.textInput} placeholder="Verify password" secureTextEntry={true} value={this.state.password2} onChangeText={password2 => this.setState({ password2 })} required /> - <Button title="Submit" onPress={this.handleRegister} /> - <Text>{this.state.errorMsg}</Text> + <View style={styles.buttonContainer}> + <Button + color="#424242" + title="Submit" + onPress={this.handleRegister} + /> + </View> + <Text style={styles.tooltipText}>{this.state.errorMsg}</Text> </View> </View> ); @@ -115,8 +120,23 @@ export class RegisterForm extends React.Component { const styles = StyleSheet.create({ close: { + marginTop: 10, + marginLeft: 100, + marginRight: 100, + alignContent: "center", fontSize: 40, - textAlign: "center" + textAlign: "center", + backgroundColor: "#424242" + }, + textInput: { + backgroundColor: "#424242", + margin: 5 + }, + tooltipText: { + color: "#ffffff" + }, + buttonContainer: { + padding: 5 } }); diff --git a/images/tacs-logo-neg.png b/images/tacs-logo-neg.png new file mode 100644 index 0000000000000000000000000000000000000000..e0940e2dead5354bb113b0edef6e1d22a99671ae GIT binary patch literal 7676 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	=cOVN<ofz%=w3!wZ(U zKV40j<B{QiodS)p#ddIg@5gF|nxAm$@WW{Mdqz3F7oD5MIe!pj)intikHtfqK)^K} z=?tiK;1YgwNdt%?B9qQO07?W09Ed3mCm(Wb<h!-d1Ko@4?Y|LfhY>-1KlwpHz4WHO zn^~QD9NUf*z~D-WIW)$M^V}6s?v)?XnE0i4z*d|K^bsGBAp!t~Ow;`HJCL$<#PK1- S>Ku7SPtvgH)^8MgJd6&4L;L literal 0 HcmV?d00001 -- GitLab