Merge remote-tracking branch 'origin/master' into zmiguel

This commit is contained in:
José Valdiviesso 2019-04-08 10:05:52 +01:00
commit 72f702d22c
362 changed files with 70127 additions and 3366 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -99,11 +99,11 @@ android {
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.app"
applicationId "pt.enei"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
versionCode 3
versionName "3"
ndk {
abiFilters "armeabi-v7a", "x86"
}
@ -149,6 +149,7 @@ android {
}
dependencies {
compile project(':react-native-maps')
compile project(':react-native-device-info')
compile project(':react-native-material-shadows')

0
App/android/app/src/main/assets/fonts/AntDesign.ttf Normal file → Executable file
View File

0
App/android/app/src/main/assets/fonts/Entypo.ttf Normal file → Executable file
View File

0
App/android/app/src/main/assets/fonts/EvilIcons.ttf Normal file → Executable file
View File

0
App/android/app/src/main/assets/fonts/FontAwesome.ttf Normal file → Executable file
View File

View File

View File

View File

0
App/android/app/src/main/assets/fonts/Foundation.ttf Normal file → Executable file
View File

0
App/android/app/src/main/assets/fonts/Ionicons.ttf Normal file → Executable file
View File

View File

View File

0
App/android/app/src/main/assets/fonts/Octicons.ttf Normal file → Executable file
View File

View File

0
App/android/app/src/main/assets/fonts/Zocial.ttf Normal file → Executable file
View File

View File

@ -3,6 +3,7 @@ package com.app;
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.airbnb.android.react.maps.MapsPackage;
import com.learnium.RNDeviceInfo.RNDeviceInfo;
import ui.materialshadows.RNMaterialShadowsPackage;
@ -30,6 +31,7 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new MapsPackage(),
new RNDeviceInfo(),
new RNMaterialShadowsPackage(),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

BIN
App/android/app/src/main/res/mipmap-hdpi/ic_launcher.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
App/android/app/src/main/res/mipmap-mdpi/ic_launcher.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
App/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,3 +1,3 @@
<resources>
<string name="app_name">ENEI 2019</string>
<string name="app_name">ENEI 19</string>
</resources>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

View File

@ -21,5 +21,5 @@ android.enableAapt2=false
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=aspire98H
MYAPP_RELEASE_KEY_PASSWORD=aspire98H
MYAPP_RELEASE_STORE_PASSWORD=9xbHZxMXjR
MYAPP_RELEASE_KEY_PASSWORD=9xbHZxMXjR

View File

@ -1,4 +1,5 @@
rootProject.name = 'app'
include ':react-native-maps'
project(':react-native-maps').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-maps/lib/android')
include ':react-native-device-info'

View File

@ -16,7 +16,7 @@ import {
TouchableOpacity,
TextInput,
NetInfo,
Animated
Animated, Linking,
} from "react-native";
import { bindActionCreators } from "redux";
@ -34,12 +34,12 @@ import Modal from "react-native-modal";
import Router from "./Router";
import Icon from "react-native-vector-icons/Ionicons";
import IconFA from "react-native-vector-icons/FontAwesome5"
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import Swiper from "react-native-swiper";
import resetPassword from "./screens/resetPassword";
//import resetPassword from "./screens/resetPassword";
var TimerMixin = require("react-timer-mixin");
function handleConnectivityChange() {
@ -48,7 +48,7 @@ function handleConnectivityChange() {
class App extends Component {
handleConnectivityChange = isConnected => {
this.setState({ isConnected });
@ -81,15 +81,15 @@ class App extends Component {
logged: false,
isModalVisible: false,
state: { text: "" },
username: "QR code ou",
username: "",
failedAttempt: false,
push: 4,
UI_loginScannerActive: false,
userDetails: { username: "", password: "" },
isConnected: true,
modalOpen: false,
modalResetPassword:false,
resetText:''
modalResetPassword: false,
resetText: ''
};
}
_print = () => {
@ -105,13 +105,13 @@ class App extends Component {
componentDidMount() {
//this.props.hold();
// this.props.loginInternal();
this.setState({ isModalVisible: false });
//verifica se o utilizador tem token guardado
this.props.checkUser(this.props.token);
}
componentWillUnmount() {
NetInfo.isConnected.removeEventListener(
@ -119,14 +119,14 @@ class App extends Component {
this.handleConnectivityChange
);
}
_toggle=()=>{
this.setState({modalResetPassword:false})
_toggle = () => {
this.setState({ modalResetPassword: false })
}
//faz call
_reset=()=>{
_reset = () => {
//fecha modal
this.props.resetPassword(this.props.token,this.state.resetText),
this.setState({modalResetPassword:false})
this.props.resetPassword(this.props.token, this.state.resetText),
this.setState({ modalResetPassword: false })
//faz call
}
@ -148,14 +148,14 @@ class App extends Component {
};
render() {
if (!this.props.logged && this.props.onHold) {
return (
<View style={UtilStyles.containerLoading}>
<ActivityIndicator size="large" color="red" />
<ActivityIndicator size="large" color="#CC1A17" />
</View>
);
} else {
@ -167,22 +167,35 @@ class App extends Component {
return <Router />;
}
return (
<View style={styles.slide2}>
<Modal isVisible={this.props.UI_loginScannerActive}>
<View style={{ flex: 1, backgroundColor: "white" }}>
<Button
onPress={this.props.closeLoginQRScan}
title={"Fechar scanner"}
>
{" "}
</Button>
<QRCodeScanner
onRead={this.onSuccess}
cameraStyle={styles.cameraContainer}
/>
</View>
<View style={styles.slide2}>
<Modal
isVisible={this.props.UI_loginScannerActive}
onBackdropPress={this._toggle}
onBackButtonPress={this._toggle}
animationInTiming={1100}
animationOutTiming={1100}
style={{ marginTop: -20 }}
>
<QRCodeScanner
onRead={this.onSuccess}
cameraStyle={styles.cameraContainer}
showMarker={true}
/>
<Button
onPress={this.props.closeLoginQRScan}
title={"Fechar Scan"}
color={"#CC1A17"}
></Button>
<Text style={{ textAlign: 'center', fontSize: 12, margin: 10, marginBottom: 5, color: 'white' }}>
Sim, o quadrado não está centrado. Era para testar a tua atenção!
</Text>
</Modal>
<Modal
isVisible={this.state.modalResetPassword}
@ -190,32 +203,33 @@ class App extends Component {
onBackButtonPress={this._toggle}
animationInTiming={1100}
animationOutTiming={1100}
>
<View style={{ backgroundColor: "white" , padding:20,paddingBottom:0, alignItems:'center'}}>
<View>
<Text style={{textAlign:'center',fontSize:23, fontWeight:'bold', color:'#CC1A17', margin:30}}>Reset Password</Text>
<Text style={{textAlign:'center', }}>Deves introduzir o email com o qual efectuaste a compra do bilhete.</Text>
<TextInput
style={styles.resetPassword}
onFocus={this._print}
maxLength={50}
blurOnSubmit={true}
onChangeText={r => this.setState({ resetText:r })}
clearButtonMode="always"
value={this.state.resetText}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Email ou Qr code"
/>
<Button
onPress={this._reset}
title={"Enviar"}
color={"#CC1A17"}
></Button>
<Text style={{textAlign:'center', fontSize:12, margin:10,marginBottom:5}}> Caso tenhas problemas com este processo deves contactar a comissão organizadora atravês do email geral.</Text>
>
<View style={{ backgroundColor: "white", padding: 20, paddingBottom: 0, alignItems: 'center' }}>
<View>
<Text style={{ textAlign: 'center', fontSize: 23, fontWeight: 'bold', color: '#CC1A17', margin: 30 }}>Reset Password</Text>
<Text style={{ textAlign: 'center', }}>Deves introduzir o email com o qual efectuaste a compra do bilhete.</Text>
<TextInput
style={styles.resetPassword}
onFocus={this._print}
maxLength={50}
blurOnSubmit={true}
onChangeText={r => this.setState({ resetText: r })}
clearButtonMode="always"
value={this.state.resetText}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Email ou Qr code"
/>
<Button
onPress={this._reset}
title={"Enviar"}
color={"#CC1A17"}
></Button>
<Text style={{ textAlign: 'center', fontSize: 12, margin: 10, marginBottom: 5 }}> Caso tenhas problemas com este processo deves contactar a comissão organizadora atravês do email geral.</Text>
</View>
</View>
</Modal>
@ -225,7 +239,7 @@ class App extends Component {
justifyContent: "center",
alignItems: "center",
margin:20
margin: 20
}}
>
<Image
@ -233,79 +247,118 @@ class App extends Component {
source={require("./assets/img/logo2.png")}
/>
</View>
<View styles={styles.loginContainer}>
<View style={styles.inputSection}>
{!this.props.loadingLogin &&
<View styles={styles.loginContainer}>
<View style={styles.inputSection}>
<TextInput
style={styles.input}
underlineColorAndroid="transparent"
//onFocus={this._print}
maxLength={15}
blurOnSubmit={true}
// secureTextEntry={true}
onChangeText={user => {
this.setState({ username:user });
}}
clearButtonMode="always"
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
value={this.state.username}
placeholder="QR code"
/>
<TouchableOpacity onPress={this._scanQr}>
<View style={styles.scanQR}>
<Icon
style={styles.searchIcon}
name="ios-qr-scanner"
size={40}
color="#000"
/>
</View>
</TouchableOpacity>
</View>
<TextInput
style={styles.input}
placeholder={this.state.username}
onChangeText={searchString => {
this.setState({ username:searchString });
}}
maxLength={15}
underlineColorAndroid="transparent"
style={styles.passwordInput}
onFocus={this._print}
maxLength={10}
blurOnSubmit={true}
secureTextEntry={true}
onChangeText={text => this.setState({ text })}
clearButtonMode="always"
value={this.state.text}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Password"
/>
<TouchableOpacity onPress={this._scanQr}>
<View style={styles.scanQR}>
<Icon
style={styles.searchIcon}
name="ios-qr-scanner"
size={40}
color="#000"
/>
{!this.props.loadingLogin &&
<View style={{ alignItems: 'center', margin: 20 }}>
<TouchableOpacity onPress={this._tryLogin} style={{ backgroundColor: '#CC1A17', borderRadius: 3 }}>
<Text style={{ color: 'white', fontSize: 20, margin: 10, width: 150, textAlign: 'center', }}>Login</Text>
</TouchableOpacity>
</View>
</TouchableOpacity>
}
</View>
<TextInput
style={styles.passwordInput}
onFocus={this._print}
maxLength={10}
blurOnSubmit={true}
secureTextEntry={true}
onChangeText={text => this.setState({ text })}
clearButtonMode="always"
value={this.state.text}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Password"
/>
{ !this.props.loadingLogin &&
<View style={{alignItems:'center', margin:20}}>
<TouchableOpacity onPress={this._tryLogin} style={{backgroundColor:'#CC1A17',borderRadius:3}}>
<Text style={{color:'white', fontSize:20, margin:10, width:150,textAlign:'center',}}>Login</Text>
</TouchableOpacity>
</View>
}
{this.props.alignItems &&
<ActivityIndicator size="large" color="#0000ff" />
}
</View>
}{
this.props.loadingLogin &&
<View style={{ margin: 100 }}>
<ActivityIndicator size="large" color="#CC1A17" />
</View>
}
<View style={styles.buttons}>
<TouchableOpacity style={styles.button}>
<TouchableOpacity style={styles.button} onPress={() => {
Linking.canOpenURL("https://www.facebook.com/ENEIConf/").then(supported => {
if (supported) {
Linking.openURL("https://www.facebook.com/ENEIConf/");
} else {
}
});
}}>
<Icon name="logo-facebook" size={40} />
</TouchableOpacity>
<TouchableOpacity style={styles.button}>
<Icon name="logo-instagram" size={40} />
</TouchableOpacity>
<TouchableOpacity style={styles.button}>
<Icon name="md-heart" size={40} />
</TouchableOpacity>
</View>
<View style={styles.footer}>
<View style={styles.textRow}>
<RkText rkType="primary3">Não sabes a password?</RkText>
<RkButton rkType="clear" onPress={this.onSignUpButtonPressed}>
<TouchableOpacity onPress={() => {this.setState({modalResetPassword:true})}}>
<RkText style={{ color: "#CC1A17", fontWeight:'bold' }} kType="header6">
Reset Password
<TouchableOpacity style={styles.button} onPress={() => {
Linking.canOpenURL("https://www.instagram.com/eneiconf/").then(supported => {
if (supported) {
Linking.openURL("https://www.instagram.com/eneiconf/");
} else {
}
});
}}>
<Icon name="logo-instagram" size={40} />
</TouchableOpacity>
<TouchableOpacity style={styles.button} onPress={() => {
Linking.canOpenURL("https://enei.pt").then(supported => {
if (supported) {
Linking.openURL("https://enei.pt");
} else {
}
});
}}>
<IconFA name="globe" size={35}/>
</TouchableOpacity>
</View>
<View style={styles.footer}>
<View style={styles.textRow}>
<RkText rkType="primary3">Não sabes a password?</RkText>
<RkButton rkType="clear" onPress={this.onSignUpButtonPressed}>
<TouchableOpacity onPress={() => { this.setState({ modalResetPassword: true }) }}>
<RkText style={{ color: "#CC1A17", fontWeight: 'bold' }} kType="header6">
Reset Password
</RkText>
</TouchableOpacity>
</RkButton>
</View>
</TouchableOpacity>
</RkButton>
</View>
</View>
</View >
);
}
}
@ -326,15 +379,15 @@ const overlayColor = "rgba(0,0,0,0.30)";
const styles = {
cameraContainer: {
height: Dimensions.get('window').height ,
height: Dimensions.get('window').height,
},
resetPassword:{
resetPassword: {
borderColor: "#bfbdbd",
borderWidth: 1,
margin:20,
margin: 20,
marginTop: 60,
marginBottom: 60,
@ -349,7 +402,7 @@ const styles = {
paddingLeft: SCREEN_WIDTH * 0.05
},
passwordInput: {
borderColor: "#bfbdbd",
borderWidth: 1,
@ -371,19 +424,19 @@ const styles = {
},
scanQR: {
//flexDirection: 'row',
flex:1,
//paddingTop: 5,
flex: 1,
//paddingTop: 5,
backgroundColor: 10,
alignItems:'center',
padding:5,
paddingRight:15,
alignItems: 'center',
padding: 5,
paddingRight: 15,
//width: 80,
// paddingLeft: 10,
// paddingLeft: 10,
backgroundColor: "#CC1A17",
borderBottomRightRadius: 3,
borderTopRightRadius: 3,
// height: "100%"
// height: "100%"
},
inputSection: {
flexDirection: "row",
@ -560,7 +613,7 @@ mapStateToProps = (state, props) => {
modalOpen: state.apiReducer.modalOpen,
modalInfo: state.apiReducer.modalInfo,
type: state.apiReducer.type,
loadingLogin:state.apiReducer.loadingLogin
loadingLogin: state.apiReducer.loadingLogin
};
};

View File

@ -36,8 +36,14 @@ import Profile from "./screens/Profile";
import editCalendar from './screens/editCalendar';
import choosePath from './screens/choosePath';
import calendarDetail from './screens/calendarDetail';
import FebradaDetail from './screens/FebradaDetail';
import resetPassword from './screens/resetPassword';
//import resetPassword from './screens/resetPassword';
import eventDetail from './screens/eventDetail';
import teamDetail from './screens/teamDetail';
import event from './screens/event';
const navigationOptions = ({navigation}) => ({
headerLeft: <HeaderBackButton onPress={() => navigation.goBack(null)}/>,
@ -45,6 +51,7 @@ const navigationOptions = ({navigation}) => ({
});
const AppStack = createBottomTabNavigator(
{
Calendário: {
@ -58,7 +65,7 @@ const AppStack = createBottomTabNavigator(
},
},
'Jogo do...': {
'Jogo': {
screen: Jogo,
navigationOptions: {
@ -107,6 +114,7 @@ const AppStack = createBottomTabNavigator(
{
initialRouteName: 'Home',
tabBarOptions: {
showLabel: true, // hide labels
activeTintColor: '#CC1A17', // active icon color
@ -132,28 +140,36 @@ const Stack = createStackNavigator({
<TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}}
onPress={() => navigation.navigate('Profile')}>
<Text>Editar dados</Text>
<Text style={{marginRight:5}}>Editar dados</Text>
<IconFA name="user-edit" size={22}/>
</TouchableOpacity>
)
}
}
if (navigation.state.routes[index].routeName == 'Jogo') {
return {
header: (<View style={{backgroundColor:'#CC1A17', padding:15}}>
<Text style={{textAlign:'center', alignSelf:'center', color:'white', fontSize:20, fontWeight:'bold'}}>Jogo do ENEI'19</Text>
</View>)
}
}
else if (navigation.state.routes[index].routeName == 'Calendário') {
return {
headerTitle: 'Calendário',
headerRight: (
<View style={{flex: 1, flexDirection: 'row'}}>
<TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}}
onPress={() => navigation.navigate('Edit')}>
<Text>FAQ</Text>
</TouchableOpacity>
<TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}}
onPress={() => navigation.navigate('choosePath')}>
<Text>Inscrições</Text>
<IconFA name="user-edit" size={22}/>
<Text style={{color:'#CC1A17', marginRight:5}}>Inscrições</Text>
<IconFA name="user-edit" size={22} color={'#CC1A17'}/>
</TouchableOpacity></View>
)
@ -204,12 +220,16 @@ const Stack = createStackNavigator({
calendarDetail: {
screen: calendarDetail,
},
FebradaDetail: {
screen: FebradaDetail,
eventDetail: {
screen: eventDetail,
},
teamDetail:{
screen: teamDetail,
},
resetPassword:{
screen:resetPassword
event:{
screen: event
}
});

View File

@ -29,7 +29,8 @@ const formatObj = obj => {
return a;
};
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
class Calendar extends React.Component {
state = {
index: 0,
@ -45,9 +46,12 @@ class Calendar extends React.Component {
};
componentDidMount() {
this.props.getEvents(this.props.user);
this.props.getSessions(this.props.token);
// this.props.getSessions(this.props.token);
// this.props.getEvents(this.props.user,this.props.careerPath);
}
_openDetails = () => {
@ -64,22 +68,11 @@ class Calendar extends React.Component {
<View style={styles.event}>
<View style={styles.titleContainer}>
<Text style={[styles.title]}>{item.name}</Text>
<Text style={{ color: "black" }}>Local: 1</Text>
<Text style={{ color: "black" }}>{item.place}</Text>
</View>
<View>
<Text style={styles.description}>{item.description}</Text>
<View style={styles.details}>
<Progress.Bar
color={"#000000"}
progress={0}
unfilledColor={"white"}
width={210}
/>
<Text>
{item.Enrolled} / {item.MaxAttendees}
</Text>
</View>
</View>
</View>
</TouchableOpacity>
@ -141,12 +134,14 @@ class Calendar extends React.Component {
super();
}
_refresh=()=>{
this.props.getEvents(this.props.user);
this.props.getEvents(this.props.user,this.props.careerPath, this.props.token);
}
render() {
const ThirdRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}>
{this.props.events != undefined && (
<Timeline
@ -214,6 +209,7 @@ class Calendar extends React.Component {
</ScrollView>
);
const FirstRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}>
{this.props.events != undefined && (
<Timeline
@ -242,6 +238,7 @@ class Calendar extends React.Component {
/>
)}
</ScrollView>
);
const SecondRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}>
@ -315,12 +312,13 @@ class Calendar extends React.Component {
height: Dimensions.get("window").height
}}
style={{ backgroundColor: "#F2F2F2" }}
indicatorStyle={{ backgroundColor: "pink" }}
/>
<Button onPress={this._refresh} title="Refresh" color="#841584"
/>
indicatorStyle={{ backgroundColor: "pink"}}
/><View style={{ alignContent:'center', alignItems:'center', backgroundColor:'transparent',position: 'absolute',marginTop:SCREEN_HEIGHT*0.75,marginLeft:10}}><Button onPress={this._refresh} title="Refresh" color="#CC1A17"
/></View>
</View>
);
}

View File

@ -1,146 +1,207 @@
import * as React from "react";
import {View, StyleSheet, Dimensions, Text, Button, ScrollView, Image, TouchableOpacity} from "react-native";
import {
View,
StyleSheet,
Dimensions,
Text,
Button,
ScrollView,
Image,
TouchableOpacity,
FlatList,
ActivityIndicator
} from "react-native";
import IconFA from "react-native-vector-icons/FontAwesome5";
import { TabView, TabBar, SceneMap } from "react-native-tab-view";
import {TabView, TabBar, SceneMap} from "react-native-tab-view";
import rallyImg from "../assets/rallyTascas.jpg";
import rallyImg from '../assets/rallyTascas.jpg';
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import * as Actions from "../store/actions"; //Import your actionss
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import PTRView from "react-native-pull-to-refresh";
const FirstRoute = () => (
<View style={[styles.scene, {backgroundColor: "#ff4081"}]}/>
);
const SecondRoute = () => (
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/>
);
class Eventos extends React.Component {
_update = () => {
this.props.getAllEvents(this.props.internalToken);
this.props.getEventLocsVisited(
this.props.team.id,
this.props.internalToken
);
};
state = {
index: 0,
routes: [
{ key: "first", title: "Festarola" },
{ key: "second", title: "Febrada" },
{ key: "third", title: "Rally" },
{ key: "fourth", title: "Peddy" }
]
};
const ThirdRoute = () => (
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/>
);
componentDidMount() {
this.props.getAllEvents(this.props.internalToken);
this.props.getEventLocsVisited(
this.props.team.id,
this.props.internalToken
);
}
const FourthRoute = () => (
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/>
);
render() {
const { navigate } = this.props.navigation;
return (
<PTRView onRefresh={this._update}>
<View
style={{
flex: 1,
flexDirection: "row",
alignItems: "center",
alignContent: "center",
alignSelf: "center"
}}
>
<Text
style={{
textAlign: "right",
fontSize: 12,
paddingTop: 10,
marginRight: 5
}}
>
Arrasta o ecrã para atualizar
</Text>
<IconFA name="chevron-circle-down" size={13} color={"#CC1A17"} />
</View>
<View style={styles.container}>
{this.props.eventsInternal == undefined && (
<View
style={{
height: SCREEN_HEIGHT,
//marginTop: SCREEN_HEIGHT * 0.27,
backgroundColor: "white"
}}
>
<Text style={{ fontSize: 12, margin: 15, textAlign: "center" }}>
Se estiver a demorar muito, arrasta para atualizar
</Text>
export default class Eventos extends React.Component {
state = {
index: 0,
routes: [
{key: "first", title: "Festarola"},
{key: "second", title: "Febrada"},
{key: "third", title: "Rally"},
{key: "fourth", title: "Peddy"}
]
};
renderFebrada = (navigate) => {
return (
<View>
<TouchableOpacity onPress={() => navigate('FebradaDetail')}>
<View style={styles.cardContainer}>
<Image
<ActivityIndicator size="large" color="#CC1A17" />
</View>
)}
<ScrollView styles={styles.scroll}>
<FlatList
data={this.props.eventsInternal}
renderItem={({ item }) => (
<View>
<TouchableOpacity
onPress={() => navigate("event", { info: item })}
>
<View style={styles.cardContainer}>
<Image
style={{
flex: 1,
width: undefined,
height: undefined
flex: 1,
width: undefined,
height: undefined
}}
resizeMode="contain"
source={require('../assets/altice_logo.png')}
>
</Image>
source={{ uri: item.imagem }}
/>
<View style={styles.cardDesc}>
<Text style={styles.cardDescText}>{item.nome}</Text>
<Text style={styles.cardHours}>{item.horas}</Text>
</View>
</View>
</TouchableOpacity>
</View>
</TouchableOpacity>
</View>
);
};
renderRally = () => {
return (
<View>
<View style={styles.cardContainer}>
<Image
style={{
flex: 1,
width: undefined,
height: undefined
}}
resizeMode="contain"
source={require('../assets/altice_logo.png')}
>
</Image>
</View>
</View>
);
};
renderCaching = () => {
return (
<View>
<View style={styles.cardContainer}>
<Image
style={{
flex: 1,
width: undefined,
height: undefined
}}
resizeMode="contain"
source={require('../assets/altice_logo.png')}
>
</Image>
</View>
</View>
);
};
render() {
const {navigate} = this.props.navigation;
return (
<View style={styles.container}>
<ScrollView styles={styles.scroll}>
{this.renderFebrada(navigate)}
{this.renderRally()}
{this.renderCaching()}
</ScrollView>
</View>
);
}
)}
/>
</ScrollView>
</View>
</PTRView>
);
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: '#eee',
flex: 1,
flexGrow: 1,
flexDirection: 'column',
},
cardHours: {
textAlign: "center",
color: "white",
margin: 10
// width:'20%'
},
scroll: {
flex: 1,
},
cardDesc: {
//alignSelf:'center',
backgroundColor: "#CC1A17",
// flex:1,
flexDirection: "row"
},
cardDescText: {
fontWeight: "bold",
color: "white",
fontSize: 18,
cardContainer: {
flex: 1,
flexDirection: 'row',
padding: 10,
margin: 20,
backgroundColor: '#fff',
height: SCREEN_WIDTH * (1 / 2),
borderRadius: 5,
//borderWidth: 2,
},
width: "45%",
margin: 10
},
container: {
backgroundColor: "white",
flex: 1,
flexGrow: 1,
flexDirection: "column",
paddingBottom: 20
},
scene: {
flex: 1
}
scroll: {
flex: 1
},
cardContainer: {
flex: 1,
//flexDirection: 'row',
//padding: 10,
margin: 20,
marginBottom: 0,
backgroundColor: "#fff",
height: SCREEN_WIDTH * 0.62,
borderRadius: 5
//borderWidth: 2,
},
scene: {
flex: 1
}
});
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
logged: state.apiReducer.logged,
userDetails: state.apiReducer.userDetails,
onHold: state.apiReducer.onHold,
bilhete: state.apiReducer.bilhete,
alimentacao: state.apiReducer.alimentacao,
alojamento: state.apiReducer.alojamento,
acesso: state.apiReducer.acesso,
team: state.apiReducer.team,
internalToken: state.apiReducer.internalToken,
eventsInternal: state.apiReducer.eventsInternal
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Eventos);

View File

@ -1,246 +0,0 @@
import * as React from 'react';
import {
View,
StyleSheet,
Dimensions,
ScrollView,
Text,
ImageBackground
} from 'react-native';
import {Divider} from 'react-native-elements'
import AppIntroSlider from 'react-native-app-intro-slider';
import NavAbsolute from '../components/Nav';
import * as Actions from "../store/actions";
import {connect} from "react-redux";
import {bindActionCreators} from "redux";
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
class FebradaDetail extends React.Component {
static navigationOptions = ({navigation}) => ({
header: (
<NavAbsolute
navigation={navigation}
// title={navigation.state.params.info.name}
/>
),
});
renderHeader = () => {
return (
<View style={styles.headerContainer}>
<View style={styles.coverContainer}>
<ImageBackground
source={{
uri: 'https://upload.wikimedia.org/wikipedia/commons/9/94/Logo_TvAAC_2014.png',
}}
style={styles.coverImage}
>
</ImageBackground>
</View>
</View>
)
};
renderDescription = () => {
return (
<View style={{height: SCREEN_HEIGHT * (1 / 3)}}>
<View
style={{flexDirection: "row"}}>
<View style={styles.header}>
<View style={styles.nameText}>
<Text
style={{color: '#CC1A17', fontSize: 20}}>Febrada</Text>
</View>
<View style={styles.timeText}>
<Text style={{color: "#CC1A17", fontSize: 15}}>
<Text style={{color: "#CC1A17", fontSize: 15}}>
Sexta 12 -
</Text>
14h00{/*{info.time === info.timeEnd ? info.time : `${info.time} - ${info.timeEnd}`}*/}
</Text>
</View>
</View>
</View>
<View style={styles.descContainer}>
<Text style={{fontSize: 20, color: '#CC1A17'}}>Descrição</Text>
<Divider style={{backgroundColor: '#000'}}/>
<Text style={{paddingRight: 10, paddingTop: 10}}>g</Text>
</View>
</View>
)
};
renderSlider = () => {
const slides = [
{
key: 'somethun',
title: 'Title 1',
titleStyle: '',
text: 'blblbalbalba',
textStyle: '',
backgroundColor: '#59b2ab',
},
{
key: 'somethun-dos',
title: 'Title 2',
titleStyle: '',
text: 'blblbalbalba',
textStyle: '',
backgroundColor: '#febe29',
},
{
key: 'somethun1',
title: 'Rocket guy',
titleStyle: '',
text: 'blblbalbalba',
textStyle: '',
backgroundColor: '#22bcb5',
}
];
return (
<AppIntroSlider
slides={slides}
style={{height: SCREEN_WIDTH * 0.54}}
activeDotStyle={{backgroundColor:'#CC1A17'}}
renderDoneButton={this._buyFinosOrBifanas()}
renderNextButton={this._renderNextButton}
/>
)
};
_buyFinosOrBifanas = () => {
//Modal
};
render() {
return (
<View style={styles.mainViewStyle}>
<ScrollView style={styles.scroll}>
<View style={styles.container}>
<View style={styles.headerContainer}>
{this.renderHeader()}
</View>
<View style={{backgroundColor: "#fff"}}>
{this.renderDescription()}
{this.renderSlider()}
</View>
</View>
</ScrollView>
</View>
)
}
}
const styles = StyleSheet.create({
mainContent: {
flex: 1,
alignItems: 'center',
justifyContent: 'space-around',
},
text: {
//color: 'rgba(255, 255, 255, 0.8)',
backgroundColor: 'transparent',
textAlign: 'center',
color:'#000',
paddingHorizontal: 16,
},
title: {
fontSize: 22,
color: 'white',
backgroundColor: 'transparent',
textAlign: 'center',
marginBottom: 16,
},
header: {
flex: 1,
flexDirection: 'row',
padding: 10,
backgroundColor: 'white',
//height: SCREEN_HEIGHT * (1 / 3),
},
nameText: {
alignSelf: 'flex-start',
flex: 1,
},
timeText: {
alignItems: 'flex-end',
flex: 1,
marginRight: 4,
},
mainViewStyle: {
flex: 1,
flexGrow: 1,
flexDirection: 'column',
},
scroll: {
backgroundColor: '#eee',
flex: 1,
//marginBottom: 55,
},
descContainer: {
padding: 10,
},
headerContainer: {
flex: 1,
},
container: {
flex: 1,
flexDirection: 'column',
},
coverContainer: {
position: 'relative',
},
coverImage: {
height: Dimensions.get('window').width * (2 / 4),
width: Dimensions.get('window').width,
},
});
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
logged: state.apiReducer.logged,
events: state.apiReducer.events,
careerPath: state.apiReducer.careerPath,
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(FebradaDetail);

View File

@ -12,9 +12,16 @@ import {
Image,
ImageBackground,
NetInfo,
AppState
AppState,
TextInput,
Keyboard,
Switch,
Alert
} from "react-native";
const axios = require("axios");
import ToggleSwitch from "toggle-switch-react-native";
import Modal from "react-native-modal";
import QRCodeScanner from "react-native-qrcode-scanner";
import { Shadow } from "react-native-shadow";
import Icon from "react-native-vector-icons/Ionicons";
import { RkButton, RkTheme } from "react-native-ui-kitten";
@ -62,28 +69,39 @@ class Home extends Component {
onHold: true,
user: { Name: "" },
userDetails: {},
appState: AppState.currentState
appState: AppState.currentState,
addUser: false,
switch: false,
team: "",
img:
""
};
}
handleConnectivityChange = () => {
console.log("asdasdasdasdasd");
};
_getImage = qr => {
//enei.pt/api/Users/getProfileImage/ZV4ZWJXTVV
https: axios
.get(`https://enei.pt/api/Users/getProfileImage/${qr}`)
.then(function(response) {
// handle success
return response.data;
})
.catch(function(error) {
// handle error
console.log(error);
});
};
componentDidMount() {
// NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange);
// this.props.hold();
console.log("hold" + this.props.onHold);
//this.props.logoutUser();
//console.log(this.props.token);
this.props.getUserInfo(this.props.token);
//console.log('logged:'+this.props.logged);
//console.log(th2is.props
this.props.getEvents(this.props.user);
this.props.getEvents(this.props.user, this.props.token);
this._getImage();
}
componentWillUnmount() {}
@ -99,9 +117,64 @@ class Home extends Component {
}
_update = () => {
this.props.getUserInfo(this.props.token);
this.props.getEvents(this.props.user);
this.props.getEvents(this.props.user, this.props.token);
this.props.getUserTeam(this.props.user, this.props.internalToken);
};
onSuccess = e => {
//fecha o scanner
this.props.addUserTeam(
{ id: this.props.team.id, newQr: e.data },
this.props.internalToken,
this.props.user
);
this.setState({ addUser: !this.state.addUser });
};
_rm = qr => {
this.props.removeUserTeam(
{
TeamId: this.props.team.id,
UserQR: this.props.team.cap.qRcode,
UserToRemoveQR: qr
},
this.props.internalToken
);
};
_toggle = () => {
this.setState({ addUser: !this.state.addUser });
};
_delTeam = () => {
Alert.alert(
"Apagar equipa",
"Tens a certeza que queres apagar a tua equipa?\n\nAo apagares a equipa, todos os dados serão perdidos... \n\nThere is no coming back..\n\n",
[
{ text: "No, bring my mommy", onPress: () => alert("pussy!!!!") },
{
text: "YES",
onPress: () =>
this.props.deleteTeam(
{ TeamId: this.props.team.id, UserQr: this.props.user.Code },
this.props.internalToken
)
}
],
{ cancelable: false }
);
};
_creatTeam = () => {
var tipo;
if (this.state.switch) tipo = 1;
else {
tipo = 3;
}
var o = {
EventId: tipo,
Nome: this.state.team,
capQR: this.props.user.Code
};
this.props.createTeam(o, this.props.internalToken, this.props.user);
};
render() {
const { navigate } = this.props.navigation;
@ -116,8 +189,43 @@ class Home extends Component {
if (this.props.logged) {
return (
<PTRView onRefresh={this._update}>
<ScrollView style={{ backgroundColor: "#eeeeee" }}>
<ScrollView
style={{ backgroundColor: "#eeeeee", minHeight: SCREEN_HEIGHT }}
>
<View>
<Modal
isVisible={this.state.addUser}
onBackdropPress={this._toggle}
onBackButtonPress={this._toggle}
animationInTiming={1100}
animationOutTiming={1100}
style={{ marginTop: -20 }}
>
<QRCodeScanner
onRead={this.onSuccess}
cameraStyle={styles.cameraContainer}
showMarker={true}
/>
<Button
onPress={this._toggle}
title={"Fechar Scan"}
color={"#CC1A17"}
/>
<Text
style={{
textAlign: "center",
fontSize: 12,
margin: 10,
marginBottom: 5,
color: "white"
}}
>
{" "}
Caso tenhas problemas com este processo deves contactar a
comissão organizadora atravês do email geral.
</Text>
</Modal>
<ImageBackground
opacity={0.9}
source={require("../assets/img/bg_3.jpg")}
@ -130,192 +238,361 @@ class Home extends Component {
>
<View style={styles.homeHeader}>
<View style={styles.userImageContainer}>
{this.props.user.Avatar != null && <Image
style={styles.userImage}
source={{
uri: this.props.user.Avatar
}}
/>
}{ this.props.user.Avatar==null &&
<Image
style={styles.userImage}
source={{ uri: "https://i.imgur.com/XXJ7LxV.jpg" }}
/>
source={require('../assets/logo_black.jpg')}
/>}
</View>
{this.props.user != undefined && (
<Text style={styles.userText}>{this.props.user.Name}</Text>
)}
<Text style={styles.userTextSub}>
{this.props.user.Company}
</Text>
{this.props.user != undefined && (
<Text style={styles.userTextSub}>
{this.props.user.Company}
</Text>
)}
</View>
</ImageBackground>
<View
style={{
flex: 1,
flexDirection: "row",
alignItems: "center",
alignContent: "center",
alignSelf:'center'
}}
>
<Text
style={{ textAlign: "right", fontSize: 12, paddingTop:10 , marginRight:5}}
>
Arrasta o ecrã para atualizar
</Text>
<IconFA
name="chevron-circle-down"
size={13}
color={"#CC1A17"}
/>
</View>
<View style={styles.userStats}>
<View style={{ backgroundColor: "orange" }}>
<Text style={styles.userStatsTitle}>
O que inclui o meu bilhete?
</Text>
</View>
<View style={{ flex: 1, flexDirection: 'row', flexWrap: 'wrap' }}>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Acesso </Text>
<FlatList
data={this.props.acesso}
renderItem={({item}) =>
<View style={styles.boxStyle}>
<Text><IconFA name="check" size={18} color={'#CC1A17'}/> {item}</Text>
</View>}
/>
</View>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Alojamento</Text>
<FlatList
data={this.props.alojamento}
renderItem={({item}) =>
<View style={styles.boxStyle}>
<Text><IconFA name="check" size={18} color={'#CC1A17'}/> {item}</Text>
</View>}
/>
</View>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Alimentação</Text>
<FlatList
data={this.props.alimentacao}
renderItem={({item}) =>
<View style={styles.boxStyle}>
<Text><IconFA name="check" size={18} color={'#CC1A17'}/> {item}</Text>
</View>}
/>
</View>
</View>
</View>
<View>
<View
style={{
margin: 10,
marginTop: 20,
backgroundColor: "white",
borderRadius: 3
}}
style={{ flex: 1, flexDirection: "row", flexWrap: "wrap" }}
>
<View
style={{
backgroundColor: "#CC1A17",
flex: 1,
flexDirection: "row"
}}
>
<View style={{ width: "79%" }}>
<Text
style={{
fontSize: 25,
color: "white",
margin: 10,
fontWeight: "bold",
marginBottom: 0
}}
>
Os tones
</Text>
<Text
style={{
color: "white",
marginLeft: 10,
marginBottom: 5
}}
>
5/6 elementos
</Text>
</View>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Acesso </Text>
<FlatList
data={this.props.acesso}
renderItem={({ item }) => (
<View style={styles.boxStyle}>
<Text>
<IconFA name="check" size={18} color={"#CC1A17"} />{" "}
{item}
</Text>
</View>
)}
/>
</View>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Alojamento</Text>
<FlatList
data={this.props.alojamento}
renderItem={({ item }) => (
<View style={styles.boxStyle}>
<Text>
<IconFA name="check" size={18} color={"#CC1A17"} />{" "}
{item}
</Text>
</View>
)}
/>
</View>
<View style={styles.colBilhete}>
<Text style={styles.titleBilhete}>Alimentação</Text>
<FlatList
data={this.props.alimentacao}
renderItem={({ item }) => (
<View style={styles.boxStyle}>
<Text>
<IconFA name="check" size={18} color={"#CC1A17"} />{" "}
{item}
</Text>
</View>
)}
/>
</View>
</View>
</View>
{this.props.team != undefined && this.props.team == "none" && (
<View style={{ backgroundColor: "white", margin: 10 }}>
<View style={{ backgroundColor: "#CC1A17" }}>
<Text
style={{
fontSize: 18,
color: "white",
margin: 10,
fontWeight: "bold",
marginBottom: 10
}}
>
Equipas Rally / Caching
</Text>
</View>
<View style={{ margin: 10 }}>
<Text style={{ fontSize: 12, textAlign: "center" }}>
Para participares no ENEI caching ou no Rally Tascas deves
formar uma equipa (4 a 6) elementos.
</Text>
<Text
style={{ fontSize: 12, textAlign: "center", margin: 5 }}
>
Ao criares a equipa, ficas como capitão. Podes adicionar e
remover outros elementos.
</Text>
<TextInput
style={{
borderColor: "#bfbdbd",
borderWidth: 1,
margin: 30,
width: SCREEN_WIDTH * 0.8,
backgroundColor: "white",
borderRadius: 3,
height: SCREEN_HEIGHT * 0.08,
borderColor: "#bfbdbd",
borderWidth: 1,
paddingLeft: SCREEN_WIDTH * 0.05
}}
onFocus={this._print}
maxLength={50}
blurOnSubmit={true}
onChangeText={t => this.setState({ team: t })}
clearButtonMode="always"
value={this.state.team}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Nome da Equipa"
/>
<View
style={{
alignItems: "center",
alignContent: "center",
flex: 1,
flexDirection: "row",
margin: 20,
marginBottom: 40,
alignSelf: "center"
}}
>
<IconFA name="plus" color={"white"} size={30} />
<Text style={{ color: "white" }}>Adicionar</Text>
</View>
</View>
<View>
<View style={{ flex: 1 }}>
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>Henrique Dias</Text>
<Text>AFFJASDXZ</Text>
</View>
<TouchableOpacity style={styles.userRemove}>
<Text style={{ fontWeight: "bold" }}>rm equipa</Text>
</TouchableOpacity>
<View style={{ width: "33%", alignSelf: "center" }}>
<Text
style={{
fontWeight: "bold",
fontSize: 17,
textAlign: "center"
}}
>
ENEI Caching
</Text>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>Henrique Dias</Text>
<Text>AFFJASDXZ</Text>
</View>
<TouchableOpacity style={styles.userRemove}>
<IconFA name="times" color={"#CC1A17"} size={30} />
<Text>remover</Text>
</TouchableOpacity>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>Henrique Dias</Text>
<Text>AFFJASDXZ</Text>
</View>
<TouchableOpacity style={styles.userRemove}>
<IconFA name="times" color={"#CC1A17"} size={30} />
<Text>remover</Text>
</TouchableOpacity>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>Henrique Dias</Text>
<Text>AFFJASDXZ</Text>
</View>
<TouchableOpacity style={styles.userRemove}>
<IconFA name="times" color={"#CC1A17"} size={30} />
<Text>remover</Text>
</TouchableOpacity>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>Henrique Dias</Text>
<Text>AFFJASDXZ</Text>
</View>
<TouchableOpacity style={styles.userRemove}>
<IconFA name="times" color={"#CC1A17"} size={30} />
<Text>remover</Text>
</TouchableOpacity>
<ToggleSwitch
isOn={this.state.switch}
onColor="#CC1A17"
offColor="#eeeeee"
labelStyle={{ color: "black", fontWeight: "900" }}
size="large"
onToggle={isOn =>
this.setState({ switch: !this.state.switch })
}
/>
<View style={{ width: "33%", alignSelf: "center" }}>
<Text
style={{
fontWeight: "bold",
fontSize: 17,
textAlign: "center"
}}
>
Rally Tascas
</Text>
</View>
</View>
<Text
style={{ fontSize: 12, textAlign: "center", margin: 5 }}
>
A incrição no Rally tem custo de 5 por elemento. A equipa
apenas fica ativa quando efectuar o pagamento na banca no
ENEI
</Text>
<Button
onPress={this._creatTeam}
disabled={this.state.team == ""}
title={"Criar Equipa"}
color={"#CC1A17"}
/>
</View>
</View>
</View>
)}
{this.props.team != undefined && this.props.team != "none" && (
<View>
<View
style={{
margin: 10,
marginTop: 20,
backgroundColor: "white",
borderRadius: 3
}}
>
<View
style={{
backgroundColor: "#CC1A17",
flex: 1,
flexDirection: "row"
}}
>
<View style={{ width: "60%" }}>
<Text
onPress={() => navigate("teamDetail")}
style={{
fontSize: 25,
color: "white",
margin: 10,
fontWeight: "bold",
marginBottom: 0
}}
>
{this.props.team.nome}
</Text>
<Text
style={{
color: "white",
marginLeft: 10,
marginBottom: 5
}}
>
{this.props.team.nMembros}/6 elementos
</Text>
</View>
{this.props.team != undefined &&
this.props.team.cap.qRcode == this.props.user.Code && (
<TouchableOpacity onPress={this._delTeam}>
<View
style={{
alignItems: "center",
alignContent: "center",
alignSelf: "center",
margin: 10
}}
>
<IconFA
name="trash-alt"
color={"white"}
size={30}
/>
<View>
<Text style={{ color: "white" }}>rm Team </Text>
</View>
</View>
</TouchableOpacity>
)}
{this.props.team.nMembros < 6 &&
this.props.team.cap.qRcode == this.props.user.Code && (
<TouchableOpacity onPress={this._toggle}>
<View
style={{
alignItems: "center",
alignContent: "center",
alignSelf: "center",
margin: 10
}}
>
<IconFA name="plus" color={"white"} size={30} />
<View>
<Text style={{ color: "white" }}> Add</Text>
</View>
</View>
</TouchableOpacity>
)}
</View>
<View>
<View style={{ flex: 1 }}>
<View>
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>
{this.props.team.cap.fullName}
</Text>
<Text>{this.props.team.cap.qRcode}</Text>
</View>
<View style={styles.userRemove}>
<Text
style={{ fontWeight: "bold", color: "#CC1A17" }}
>
Capitão
</Text>
</View>
</View>
<Divider style={{ backgroundColor: "black" }} />
</View>
<FlatList
data={this.props.team.membros}
renderItem={({ item }) => (
<View>
{item.id != this.props.team.cap.id && (
<View style={styles.user}>
<View style={styles.userLogo}>
<IconFA name="user" size={40} />
</View>
<View style={styles.userT}>
<Text style={styles.userName}>
{item.fullName}
</Text>
<Text>{item.qRcode}</Text>
</View>
{this.props.user.Code ==
this.props.team.cap.qRcode && (
<TouchableOpacity
style={styles.userRemove}
onPress={() => this._rm(item.qRcode)}
>
<Text style={{ fontWeight: "bold" }}>
remover
</Text>
</TouchableOpacity>
)}
</View>
)}
<Divider style={{ backgroundColor: "black" }} />
</View>
)}
/>
</View>
</View>
<TouchableOpacity onPress={() => navigate("teamDetail")} style={{backgroundColor:'orange'}}><Text style={{color:'white', fontSize:17, fontWeight:'bold', margin:10, textAlign:'center'}}>Ver o progresso da equipa </Text></TouchableOpacity>
</View>
</View>
)}
</View>
</ScrollView>
</PTRView>
@ -331,24 +608,29 @@ class Home extends Component {
}
const styles = StyleSheet.create({
titleBilhete:{
textAlign:'center',
fontSize:15,
fontWeight:'bold',
marginBottom:10
cameraContainer: {
height: Dimensions.get("window").height
},
colBilhete:{
width:'33%',
padding:10
titleBilhete: {
textAlign: "center",
fontSize: 15,
fontWeight: "bold",
marginBottom: 10
},
colBilhete: {
width: "33%",
padding: 10,
alignContent: "center",
alignItems: "center"
},
boxStyle: {
padding:10,
borderWidth: 1,
padding: 5,
paddingTop: 10,
paddingBottom: 10,
borderWidth: 1,
marginBottom: 5,
borderColor:'#CC1A17'
width: "100%",
borderColor: "#CC1A17"
},
userName: {
fontSize: 16,
@ -481,7 +763,9 @@ function mapStateToProps(state, props) {
bilhete: state.apiReducer.bilhete,
alimentacao: state.apiReducer.alimentacao,
alojamento: state.apiReducer.alojamento,
acesso: state.apiReducer.acesso
acesso: state.apiReducer.acesso,
team: state.apiReducer.team,
internalToken: state.apiReducer.internalToken
};
}

File diff suppressed because it is too large Load Diff

View File

@ -1,427 +1,455 @@
import React, {Component} from 'react'
import {Card, Divider,} from 'react-native-elements'
import React, { Component } from "react";
import { Card, Divider } from "react-native-elements";
import {
Image,
ImageBackground,
Linking,
ListView,
Platform,
ScrollView,
StyleSheet,
Text,
View,
TouchableOpacity,
Dimensions,
TextInput,
Button,
} from 'react-native'
import PropTypes from 'prop-types';
Image,
ImageBackground,
Linking,
ListView,
Platform,
ScrollView,
StyleSheet,
Text,
View,
TouchableOpacity,
Dimensions,
TextInput,
Button,
ActivityIndicator
} from "react-native";
import PropTypes from "prop-types";
import {connect, Provider} from "react-redux";
import {bindActionCreators} from "redux";
import { connect, Provider } from "react-redux";
import { bindActionCreators } from "redux";
import * as Actions from "../store/actions";
import {Validate} from '../Helpers/Validation'
import {RkTextInput} from 'react-native-ui-kitten';
import { Validate } from "../Helpers/Validation";
import { RkTextInput } from "react-native-ui-kitten";
import {createStore} from 'redux';
import { createStore } from "redux";
import Email from "../components/Email";
import Email from '../components/Email';
import Separator from '../components/Separator';
import Tel from '../components/Telephone';
import Separator from "../components/Separator";
import Tel from "../components/Telephone";
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import Icon from "react-native-vector-icons/Ionicons"
import Icon from "react-native-vector-icons/Ionicons";
var options = {
title: "Selecionar foto de perfil",
storageOptions: {
skipBackup: true,
path: "images"
}
};
class Profile extends Component {
constructor(props) {
super(props);
this.state = {
name: this.props.user.Name,
userDetails: {},
token: false,
tokenData: "",
loggedIn: false,
onHold: true,
user: {},
cenas: { Name: "as" },
text: "",
profileIcon: this.props.user.Avatar,
constructor(props) {
formValid: true,
super(props);
jobs: this.props.user.Company,
jobsError: false,
jobsErrorMessage: "",
this.state = {
name: this.props.user.Name,
userDetails: {},
token: false,
tokenData: '',
loggedIn: false,
onHold: true,
user: {},
cenas: {Name: 'as'},
text: '',
email: this.props.user.Email,
emailError: false,
emailErrorMessage: "",
phone: this.props.user.Mobile,
phoneError: false,
phoneErrorMessage: "",
formValid: true,
address: this.props.user.Address,
addressError: false,
addressErrorMessage: "",
jobs: this.props.user.Company,
jobsError: false,
jobsErrorMessage: '',
city: this.props.user.City,
cityError: false,
cityErrorMessage: "",
email: this.props.user.Email,
emailError: false,
emailErrorMessage: '',
oldPass: "",
new1: "",
new2: "",
phone: this.props.user.Mobile,
phoneError: false,
phoneErrorMessage: '',
address: this.props.user.Address,
addressError: false,
addressErrorMessage: '',
city: this.props.user.City,
cityError: false,
cityErrorMessage: '',
oldPass:'',
new1:'',
new2:'',
url:this.props.user.Url,
curso:this.props.user.LastName,
};
}
_press=()=>{
this.props.changePassword(
this.props.token,
this.state.oldPass,
this.state.new1,
this.state.new2
)
}
_logout = () => {
this.props.logoutUser();
url: this.props.user.Url,
curso: this.props.user.LastName
};
}
_press = () => {
this.props.hold();
this.props.changePassword(
this.props.token,
this.state.oldPass,
this.state.new1,
this.state.new2
);
};
_logout = () => {
this.props.logoutUser();
};
_validateData = (name, jobs, email, phone, address, city) => {
let valid = null;
_validateData = (name, jobs, email, phone, address, city) => {
let valid = null;
v = Validate('name', name);
v = Validate("name", name);
let v = Validate("email", email);
this.setState({ emailError: v[0], emailErrorMessage: v[1] });
let v = Validate('email', email);
this.setState({emailError: v[0], emailErrorMessage: v[1]});
v = Validate("jobs", jobs);
v = Validate('jobs', jobs);
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({ jobsError: v[0], jobsErrorMessage: v[1] }, () => {
console.log(
"email error: " +
this.state.emailError +
" job Error: " +
this.state.jobsError
);
});
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({jobsError: v[0], jobsErrorMessage: v[1]}, () => {
v = Validate("city", city);
console.log('email error: ' + this.state.emailError + ' job Error: ' + this.state.jobsError);
});
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({ cityError: v[0], cityErrorMessage: v[1] });
v = Validate("address", address);
v = Validate('city', city);
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({ addressError: v[0], addressErrorMessage: v[1] });
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({cityError: v[0], cityErrorMessage: v[1]})
v = Validate("city", city);
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({ cityError: v[0], cityErrorMessage: v[1] }, () => {
console.log(this.state.cityError + " Error: " + this.state.addressError);
v = Validate('address', address);
if (
this.state.emailError ||
this.state.jobsError ||
this.state.phoneError ||
this.state.addressError ||
this.state.cityError
)
this.setState({ formValid: false });
});
};
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({addressError: v[0], addressErrorMessage: v[1]});
saveData() {
const {
name,
jobs,
email,
phone,
address,
city,
formValid,
url,
curso,
profileIcon
} = this.state;
// this._validateData(name, jobs, email, phone, address, city,curso);
v = Validate('city', city);
console.log(formValid);
// setState is asynchronous and so trying to work with state directly after a setState
// call won't work as the update won't necessarily have run. Instead you can use the second argument to setState which is a callback
this.setState({cityError: v[0], cityErrorMessage: v[1]}, () => {
console.log(this.state.cityError + ' Error: ' + this.state.addressError);
this.props.hold();
if (formValid) {
console.log("data valid");
if (this.state.emailError || this.state.jobsError || this.state.phoneError || this.state.addressError || this.state.cityError)
this.setState({formValid: false});
});
};
saveData() {
const {name, jobs, email, phone, address, city, formValid, url,curso} = this.state;
// this._validateData(name, jobs, email, phone, address, city,curso);
console.log(formValid);
if (formValid) {
console.log("data valid");
this.props.updateUser(this.props.token, {
Name: this.state.name,
Company: jobs,
LastName: curso,
Address: address,
City: city,
Mobile: phone,
Avatar: "base64",
Url:url,
});
}
else
console.log("data not valid");
this.props.updateUser(this.props.token, {
Name: this.state.name,
Company: jobs,
LastName: curso,
Address: address,
City: city,
Mobile: phone,
//Avatar: "aaa",
Url: url
});
} else console.log("data not valid");
}
render() {
if (this.props.onHold) {
return (
<View style={{ marginTop: SCREEN_HEIGHT * 0.4 }}>
<ActivityIndicator size="large" color="#CC1A17" />
</View>
);
}
render() {
return (
<View style={{flex: 1}}>
<ScrollView style={{backgroundColor: '#eee'}}>
<View style={styles.container}>
<View style={styles.userBioRowHeader}>
<View style={styles.userBioRowTitle}>
<Text style={{color: '#CC1A17', fontWeight: 'bold', fontSize: 20}}>Informações Pessoais</Text>
</View>
</View>
<View style={styles.userBio}>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >Nome</Text>
<TextInput style={styles.userBioText}
onChangeText={(n) => {
this.setState({name: n})
}}
value={this.state.name}/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >Curso</Text>
<TextInput style={styles.userBioText}
onChangeText={(cu) => {
this.setState({curso: cu})
}}
value={this.state.curso}/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >Faculdade</Text>
<TextInput style={styles.userBioText}
onChangeText={(job) => {
this.setState({jobs: job})
}}
value={this.state.jobs}/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >Telemóvel</Text>
<TextInput style={styles.userBioText}
onChangeText={(phone) => {
this.setState({phone: phone})
}}
value={this.state.phone}/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >Morada</Text>
<TextInput style={styles.userBioText}
onChangeText={(add) => {
this.setState({address: add})
}}
value={this.state.address}/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo} >LinkedIn</Text>
<TextInput style={styles.userBioText}
onChangeText={(u) => {
this.setState({url: u})
}}
value={this.state.url}/>
</View>
<Button onPress={() => this.saveData() } title="Guardar Alterações" color="#CC1A17"
/>
</View>
</View>
{/*PassWord Edit*/}
<View style={styles.container}>
<View style={styles.userBioRowHeader}>
<View style={styles.userBioRowTitle}>
<Text style={{color: '#CC1A17', fontWeight: 'bold', fontSize: 20}}>Alterar Password</Text>
</View>
</View>
<View style={styles.userBio}>
<View style={styles.userBioRow}>
<TextInput style={styles.userBioText}
placeholder='Antiga Password'
onChangeText={(old => {
this.setState({oldPass: old})
})}
value={this.state.oldPass}
maxLength = {20}
secureTextEntry={true}
/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<TextInput style={styles.userBioText}
placeholder='Nova Password'
secureTextEntry={true}
onChangeText={(newz => {
this.setState({new1: newz})
})}
value={this.state.new1}
maxLength = {20}
/>
</View>
<Divider style={{backgroundColor: 'black'}}/>
<View style={styles.userBioRow}>
<TextInput style={styles.userBioText}
placeholder='Repetir Password'
secureTextEntry={true}
onChangeText={(newzz => {
this.setState({new2: newzz})
})}
value={this.state.new2}
maxLength = {20}
/>
</View>
<Button onPress={this._press} title="Alterar Password" color="#CC1A17"
/>
</View>
</View>
<TouchableOpacity onPress={this._logout} style={{
height: 50,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'black',
marginTop:30
}}>
<Text style={{color: "#fff", fontWeight: 'bold'}}>Logout</Text>
</TouchableOpacity>
</ScrollView>
return (
<View style={{ flex: 1 }}>
<ScrollView style={{ backgroundColor: "#eee" }}>
<View style={styles.container}>
<View style={styles.userBioRowHeader}>
<View style={styles.userBioRowTitle}>
<Text
style={{ color: "#CC1A17", fontWeight: "bold", fontSize: 20 }}
>
Informações Pessoais
</Text>
</View>
</View>
<Image source={this.state.avatarSource} />
)
}
<View style={styles.userBio}>
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>Nome</Text>
<TextInput
style={styles.userBioText}
onChangeText={n => {
this.setState({ name: n });
}}
value={this.state.name}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>Curso</Text>
<TextInput
style={styles.userBioText}
onChangeText={cu => {
this.setState({ curso: cu });
}}
value={this.state.curso}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>Faculdade</Text>
<TextInput
style={styles.userBioText}
onChangeText={job => {
this.setState({ jobs: job });
}}
value={this.state.jobs}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>Telemóvel</Text>
<TextInput
style={styles.userBioText}
onChangeText={phone => {
this.setState({ phone: phone });
}}
value={this.state.phone}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>Morada</Text>
<TextInput
style={styles.userBioText}
onChangeText={add => {
this.setState({ address: add });
}}
value={this.state.address}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<Text style={styles.userBioLogo}>LinkedIn</Text>
<TextInput
style={styles.userBioText}
onChangeText={u => {
this.setState({ url: u });
}}
value={this.state.url}
/>
</View>
<Button
onPress={() => this.saveData()}
title="Guardar Alterações"
color="#CC1A17"
/>
</View>
</View>
{/*PassWord Edit*/}
<View style={styles.container}>
<View style={styles.userBioRowHeader}>
<View style={styles.userBioRowTitle}>
<Text
style={{ color: "#CC1A17", fontWeight: "bold", fontSize: 20 }}
>
Alterar Password
</Text>
</View>
</View>
<View style={styles.userBio}>
<View style={styles.userBioRow}>
<TextInput
style={styles.userBioText}
placeholder="Antiga Password"
onChangeText={old => {
this.setState({ oldPass: old });
}}
value={this.state.oldPass}
maxLength={20}
secureTextEntry={true}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<TextInput
style={styles.userBioText}
placeholder="Nova Password"
secureTextEntry={true}
onChangeText={newz => {
this.setState({ new1: newz });
}}
value={this.state.new1}
maxLength={20}
/>
</View>
<Divider style={{ backgroundColor: "black" }} />
<View style={styles.userBioRow}>
<TextInput
style={styles.userBioText}
placeholder="Repetir Password"
secureTextEntry={true}
onChangeText={newzz => {
this.setState({ new2: newzz });
}}
value={this.state.new2}
maxLength={20}
/>
</View>
<Button
onPress={this._press}
title="Alterar Password"
color="#CC1A17"
/>
</View>
</View>
<TouchableOpacity
onPress={this._logout}
style={{
height: 50,
justifyContent: "center",
alignItems: "center",
backgroundColor: "black",
marginTop: 30
}}
>
<Text style={{ color: "#fff", fontWeight: "bold" }}>Logout</Text>
</TouchableOpacity>
</ScrollView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 10,
margin: 10,
backgroundColor: "white",
borderRadius: 5
},
container: {
flex: 1,
padding: 10,
margin: 20,
backgroundColor: 'white',
borderRadius: 5,
},
userBioRowHeader: {
flex: 1,
flexDirection: "row",
alignItems: "center"
},
userBioRowHeader: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
},
userBioRowTitle: {
flex: 1,
flexDirection: "row",
justifyContent: "flex-start",
padding: 10
},
userBioRowTitle: {
flex: 1,
flexDirection: 'row',
justifyContent: 'flex-start',
padding: 10,
},
userBioRow: {
flex: 1,
flexDirection: "row",
justifyContent: "flex-start",
padding: 10,
// borderWidth: 2,
alignItems: "center"
},
userBioText: {
width: SCREEN_WIDTH * 0.4,
flex: 2
// borderWidth: 2,
},
userBioRow: {
flex: 1,
flexDirection: 'row',
justifyContent: 'flex-start',
padding: 10,
// borderWidth: 2,
alignItems: 'center',
},
userBioText: {
width: SCREEN_WIDTH * 0.40,
flex: 2,
// borderWidth: 2,
},
userPassText: {
flex: 1,
//alignSelf: 'flex-start',
justifyContent: 'flex-end',
borderWidth: 2,
},
userBioLogo: {
marginLeft: 10,
width:80,
},
bottomLogOut: {
height: 20,
},
userPassText: {
flex: 1,
//alignSelf: 'flex-start',
justifyContent: "flex-end",
borderWidth: 2
},
userBioLogo: {
marginLeft: 10,
width: 80
},
bottomLogOut: {
height: 20
}
});
mapStateToProps = (state, props) => {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
userDetails: state.apiReducer.userDetails,
}
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
userDetails: state.apiReducer.userDetails,
onHold: state.apiReducer.onHold
};
};
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
return bindActionCreators(Actions, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(Profile);
export default connect(
mapStateToProps,
mapDispatchToProps
)(Profile);

View File

@ -1,174 +1,104 @@
import React from 'react';
import {View, Image, Vibration, Dimensions, Text, Button, TouchableOpacity, ActivityIndicator} from 'react-native';
import { View, Image, Vibration, Dimensions,Text ,Button ,TouchableOpacity } from 'react-native';
import QRCodeScanner from 'react-native-qrcode-scanner';
import {UtilStyles} from '../assets/styles'
import CodeInput from 'react-native-confirmation-code-input';
import Modal from "react-native-modal";
import {TabView, TabBar, SceneMap} from 'react-native-tab-view';
import {
RkButton,
RkTheme, RkText
} from 'react-native-ui-kitten';
import IconMI from "react-native-vector-icons/MaterialIcons"
import { bindActionCreators } from "redux";
import PTRView from "react-native-pull-to-refresh";
import * as Actions from "../store/actions";
import { connect } from "react-redux";
import {RkButton,
RkTheme , RkText} from 'react-native-ui-kitten';
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
export default class Scan extends React.Component {
class Scan extends React.Component {
_toggleModal = () =>
this.setState({isModalVisible: !this.state.isModalVisible});
this.setState({ isModalVisible: !this.state.isModalVisible });
_activate = () => {
_activate=()=>{
this.setState({isModalVisible: !this.state.isModalVisible, reactivate: true});
this.setState({ isModalVisible: !this.state.isModalVisible ,reactivate:true});
this.scanner.reactivate();
}
onSuccess = (e) => {
this.setState({isModalVisible: !this.state.isModalVisible, isActive: false});
this.setState({code: e.data});
};
this.setState({code:e.data});
this.props.scanQrCode({UserQR:this.props.user.Code, ScanQR: e.data},this.props.internalToken);
state = {
isActive: true,
isRender: true,
reactivate: false,
isModalVisible: false,
code: '',
};
index: 0,
routes: [
{key: 'scan', title: 'Scan', icon: ''},
{key: 'history', title: 'Histórico', icon: 'history'},
{key: 'fav', title: 'Favoritos', icon: 'favorite'},
],
};
componentDidMount() {
state = {
isActive:true,
isRender: true,
reactivate:false,
isModalVisible: false,
code:''
}
componentDidMount() {
this.props.navigation.addListener('willFocus', (route) => {
this.setState({isRender: true})
this.setState({ isRender: true })
});
this.props.navigation.addListener('willBlur', (route) => {
this.setState({isRender: false})
this.setState({ isRender: false })
});
}
render() {
/*Screen SCAN*/
const scanScreen = () => (
<QRCodeScanner
showMarker
ref={(node) => {
this.scanner = node
}}
reactivate={false}
cameraProps={{captureAudio: false}}
onRead={this.onSuccess.bind(this)}
showMarker={true}
cameraStyle={{height: SCREEN_HEIGHT}}
fadeIn={true}
customMarker={
<View style={{flex: 1}}>
<Modal isVisible={this.state.isModalVisible}
style={{backgroundColor: '#E8E8E8', borderRadius: 30, height: 100}}>
<View style={{flex: 1}}>
<Text></Text>
<Text> Qr code data: {this.state.code}</Text>
<Button onPress={this._activate} title="Close" color="#841584"
accessibilityLabel="Learn more about this purple button"/>
</View>
</Modal>
</View>
}
/>
);
const historyScreen = () => (
<View style={{backgroundColor: '#ff4081'}}>
</View>
);
const favScreen = () => (
<View style={{backgroundColor: '#a95'}}>
</View>
);
_renderLazyPlaceholder = () => {
return (
<ActivityIndicator size="large" color="red" />
);
};
{
return (
<View style={{flex: 1}}>
{this.state.isRender &&
<TabView
lazy
navigationState={this.state}
renderScene={SceneMap({
scan: scanScreen,
history: historyScreen,
fav: favScreen,
})}
renderLazyPlaceholder={this._renderLazyPlaceholder}
onIndexChange={(index) => this.setState({index})}
initialLayout={{width: SCREEN_WIDTH, height: SCREEN_HEIGHT}}
renderIcon={({route}) => (
<IconMI
name={route.icon}
size={15}
color={'white'}
/>
)}
/>
}
</View>
)
}
}
render() {
{
return (
<View style={{flex: 1}}>
<TouchableOpacity onPress={this._toggleModal}>
<Text>Show Modal</Text>
</TouchableOpacity>
<Modal isVisible={this.state.isModalVisible}>
<View style={{flex: 1}}>
<Text>Hello!</Text>
<TouchableOpacity onPress={this._toggleModal}>
<Text>Hide me!</Text>
</TouchableOpacity>
</View>
</Modal>
</View>
);
}
<View style={{flex: 1}}>
{ this.state.isRender &&
<QRCodeScanner
showMarker
ref={(node) => { this.scanner = node }}
reactivate={false}
onRead={this.onSuccess.bind(this)}
showMarker={true}
cameraStyle={{ height: SCREEN_HEIGHT }}
fadeIn={true}
/>
}
</View>
)}
}
}
RkTheme.setType('RkButton', 'dark', {
container: {
paddingTop: 10,
backgroundColor: 'gray',
borderRadius: 90,
paddingTop:10,
backgroundColor: 'gray',
borderRadius: 90,
}
});
});
const rectDimensions = SCREEN_WIDTH * 0.85; // this is equivalent to 255 from a 393 device width
@ -176,31 +106,35 @@ const rectDimensions = SCREEN_WIDTH * 0.85; // this is equivalent to 255 from a
const overlayColor = 'rgba(0,0,0,0.30)';
const styles = {
recover: {
paddingTop: 10,
recover:{
paddingTop:10,
color: "red",
paddingBottom: 10
paddingBottom:10
},
manual: {},
manual:{
logo: {
},
logo:{
height: SCREEN_HEIGHT * 0.35,
width: SCREEN_WIDTH,
height:SCREEN_HEIGHT*0.35,
width:SCREEN_WIDTH,
backgroundColor: overlayColor,
},
rectangleContainer: {
flex: 1,
alignItems: "center",
justifyContent: "center",
backgroundColor: "transparent",
},
rectangle: {
height: rectDimensions,
width: rectDimensions,
alignItems: "center",
@ -228,4 +162,24 @@ const styles = {
width: SCREEN_WIDTH,
backgroundColor: overlayColor
},
};
};
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
internalToken: state.apiReducer.internalToken,
cromos: state.apiReducer.cromos
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Scan);

View File

@ -8,9 +8,15 @@ import {
Text,
Button,
TouchableOpacity,
ImageBackground
ImageBackground,
ListView,
FlatList,
ActivityIndicator,
Linking,
Platform
} from "react-native";
import moment from "moment";
import { Divider, Icon, Avatar } from "react-native-elements";
import { TabView, TabBar, SceneMap } from "react-native-tab-view";
import { RkButton, RkCard, RkText, RkTheme } from "react-native-ui-kitten";
@ -47,7 +53,7 @@ class calendarDetail extends React.Component {
header: (
<NavAbsolute
navigation={navigation}
// title={navigation.state.params.info.name}
// title={navigation.state.params.info.name}
/>
)
});
@ -55,13 +61,11 @@ class calendarDetail extends React.Component {
state = {};
componentDidMount() {
this.props.getEvents(this.props.user);
console.log("didMount");
console.log(this.props.events);
this.props.getEvents(this.props.user, this.props.careerPath);
const { navigation } = this.props;
const info = navigation.getParam("info", "error");
console.log("putas");
console.log(info);
this.props.getSessionDetails(this.props.token, info.Id);
}
_update = () => {
@ -75,202 +79,187 @@ class calendarDetail extends React.Component {
this.data = [];
}
renderHeader = info => {
return (
<View style={styles.headerContainer}>
<View style={styles.coverContainer}>
<ImageBackground
source={{
uri: info.imageUrl
}}
style={styles.coverImage}
/>
</View>
</View>
);
};
renderDescription = info => {
return (
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.timeText}>
<Text style={{ color: "#CC1A17", fontSize: 15 }}>
{info.time === info.timeEnd
? info.time
: `${info.time}H - ${info.timeEnd}H`}
</Text>
</View>
</View>
<View>
<Text
style={{
margin: 10,
marginBottom: 0,
marginTop: 0,
fontSize: 20,
color: "#CC1A17"
}}
>
{info.name}
</Text>
<Text style={{ marginLeft: 10 }}>Workshop</Text>
</View>
<View style={{ margin: 10 }}>
<Progress.Bar
color={"#000000"}
progress={info.Enrolled / info.MaxAttendees}
height={10}
unfilledColor={"white"}
width={210}
/>
<Text>
{info.Enrolled} / {info.MaxAttendees}
</Text>
</View>
<Divider style={{ backgroundColor: "#eeeeee" }} />
<View style={{ flex: 1, flexDirection: "row", marginTop: 10 }}>
<View style={{ width: 100, height: 100, padding: 5 }}>
<FitImage
source={{
uri:
"http://enei2019.uingress.com/adminpoint/Content/Images/Uploads/Speakers/ffb043cb-3073-421c-a070-5d273b50fc23.jpeg"
}}
style={{ padding: 5 }}
/>
</View>
<View>
<Text style={{ fontWeight: "bold", fontSize: 20, margin: 10 }}>
André Duarte
</Text>
<Text style={{ marginLeft: 10 }}>
Project manager at ubiwhere
</Text>
<TouchableOpacity>
<Text style={{ color: "#CC1A17", marginLeft: 10 }}>
website
</Text>
</TouchableOpacity>
</View>
</View>
<View>
<Text
style={{
fontWeight: "bold",
color: "#CC1A17",
margin: 10,
marginBottom: 0,
fontSize: 15
}}
>
Descrição do orador:
</Text>
<Text style={{ margin: 10 }}>
Existem muitas variações das passagens do Lorem Ipsum disponíveis,
mas a maior parte sofreu alterações de alguma forma, pela injecção
de humor, ou de palavras aleatórias que nem sequer parecem
suficientemente credíveis.{" "}
</Text>
</View>
</View>
<View style={styles.block}>
<Text style={{ fontSize: 15, color: "#CC1A17", fontWeight:'bold' }}>Descrição da palestra/workshop</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.description}</Text>
</View>
</View>
</View>
);
};
/*
renderMap = () => {
return (
<MapView
provider={PROVIDER_GOOGLE}
style={{flex: 2}}
region={{
latitude: 40.19092111672049,
latitudeDelta: 0.007664297080957283,
longitude: -8.410662319511175,
longitudeDelta: 0.007551424205303192
}}
onRegionChangeComplete={(region) => {
console.log(region);
}}
/>
)
};
*/
renderAttendee = () => {
return (
<View style={{ backgroundColor: "#fff", height: SCREEN_HEIGHT * 0.1 }}>
<View style={styles.AttendeeContainer}>
<View style={styles.leftRow}>
<Avatar
rounded
size="medium"
source={{
uri:
"https://cdn3.iconfinder.com/data/icons/vector-icons-6/96/256-512.png"
}}
/>
</View>
<View style={styles.centerRow}>
<Text style={styles.titleText} numberOfLines={1}>
Nome do gajo
</Text>
</View>
<View style={styles.rightRow}>
<Icon
size={24}
name="visibility"
type="material-icon"
onPress={() => navigation.goBack(null)}
color="#000"
iconStyle={styles.icon}
underlayColor="transparent"
underlineColorAndroid="transparent"
containerStyle={styles.iconContainer}
hitSlop={{ top: 15, bottom: 15, left: 15, right: 15 }}
/>
</View>
</View>
</View>
);
};
render() {
const { navigation } = this.props;
const info = navigation.getParam("info", "error");
if (this.props.sessionDetail == undefined) {
return (<View style={{ flex: 1, alignSelf: 'center', margin: SCREEN_HEIGHT * 0.45 }}>
<ActivityIndicator size="large" color="#CC1A17" />
</View>
)
}
return (
info != undefined &&
<View style={styles.mainViewStyle}>
<ScrollView style={styles.scroll}>
<View style={styles.container}>
<View style={styles.headerContainer}>
{this.renderHeader(info)}
<View style={styles.headerContainer}>
<View style={styles.coverContainer}>
<ImageBackground
source={{
uri: `https://tickets.enei.pt/adminpoint/Content/Images/Uploads/Sessions/${this.props.sessionDetail.Image}`
}}
style={styles.coverImage}
/>
</View>
</View>
</View>
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.timeText}>
<Text style={{ color: "#CC1A17", fontSize: 15 }}>
{`${moment(this.props.sessionDetail.SessionStart).format("HH:mm")}H - ${moment(this.props.sessionDetail.SessionEnd).format("HH:mm")}H`}
</Text>
</View>
</View>
<View>
<Text
style={{
margin: 10,
marginBottom: 0,
marginTop: 0,
fontSize: 20,
color: "#CC1A17"
}}
>
{this.props.sessionDetail.Name}
</Text>
</View>
<View style={{ margin: 10 }}>
{this.props.sessionDetail.Enrolled != 0 && this.props.sessionDetail.MaxAttendees != 0 &&
<Progress.Bar
color={"#000000"}
progress={this.props.sessionDetail.Enrolled / this.props.sessionDetail.MaxAttendees}
height={10}
unfilledColor={"white"}
width={210}
/>}
<Text>
{this.props.sessionDetail.Enrolled} / {this.props.sessionDetail.MaxAttendees}
</Text>
</View>
{this.props.sessionDetail != undefined && (
<FlatList
data={this.props.sessionDetail.Speakers}
renderItem={({ item }) => (
<View>
<View
style={{
flex: 1,
flexDirection: "row",
marginTop: 10
}}
>
<View style={{ width: 100, height: 100, padding: 5 }}>
<FitImage
source={{
uri:
"https://tickets.enei.pt/adminpoint/Content/Images/Uploads/Speakers/ffb043cb-3073-421c-a070-5d273b50fc23.jpeg"
}}
style={{ padding: 5 }}
/>
</View>
<View>
<Text
style={{
fontWeight: "bold",
fontSize: 20,
margin: 10
}}
>
{item.Name}
</Text>
<Text style={{ marginLeft: 10 }}>
{item.MoreInfo}
</Text>
<TouchableOpacity>
<Text
style={{ color: "#CC1A17", marginLeft: 10 }}
>
{item.Title}
</Text>
</TouchableOpacity>
</View>
</View>
<View>
<Text
style={{
fontWeight: "bold",
color: "#CC1A17",
margin: 10,
marginBottom: 0,
fontSize: 15
}}
>
Descrição do orador:
</Text>
<Text style={{ margin: 10 }}>{item.Description}</Text>
</View>
</View>
)}
/>
)}
</View>
<View style={styles.block}>
<Text
style={{ fontSize: 15, color: "#CC1A17", fontWeight: "bold" }}
>
Descrição da palestra/workshop
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{this.props.sessionDetail.Description}</Text>
</View>
</View>
</View>
{this.renderDescription(info)}
</View>
<View style={styles.block}>
<Text style={{ fontSize: 15, color: "#CC1A17",fontWeight:'bold' }}>Localização</Text>
<Divider style={{ backgroundColor: "#000", marginBottom: 10 }} />
<Image source={require('../assets/img/campus.png')} style={{width:SCREEN_WIDTH*0.9}}></Image>
</View>
{
this.props.sessionDetail.LocalRoom != undefined && this.props.sessionDetail.LocalCoordinates != undefined &&
<View style={styles.block}>
<Text
style={{ fontSize: 15, color: "#CC1A17", fontWeight: "bold" }}
>
Localização
</Text>
<Divider style={{ backgroundColor: "#000", marginBottom: 10 }} />
<Text style={{marginBottom:20}}>{this.props.sessionDetail.LocalRoom}</Text>
<Button
onPress={() => {
const scheme = Platform.select({
ios: "maps:0,0?q=",
android: "geo:0,0?q="
});
const latLng = this.props.sessionDetail.LocalCoordinates;
const label = this.props.sessionDetail.LocalRoom;
const url = Platform.select({
ios: `${scheme}${label}@${latLng}`,
android: `${scheme}${latLng}(${label})`
});
Linking.openURL(url);
}}
title={"Abrir no Mapa"}
color={"#CC1A17"}
/>
</View>
}
</ScrollView>
<Divider style={{ backgroundColor: "black" }} />
</View>
@ -481,7 +470,8 @@ function mapStateToProps(state, props) {
user: state.apiReducer.user,
logged: state.apiReducer.logged,
events: state.apiReducer.events,
careerPath: state.apiReducer.careerPath
careerPath: state.apiReducer.careerPath,
sessionDetail: state.apiReducer.sessionDetail
};
}

File diff suppressed because it is too large Load Diff

View File

@ -28,23 +28,24 @@ import Email from '../components/Email';
import Separator from '../components/Separator';
import Tel from '../components/Telephone';
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import Icon from "react-native-vector-icons/Ionicons"
import Swiper from 'react-native-swiper';
class editCalendar extends Component {
static navigationOptions = ({ navigation }) => ({
static navigationOptions = ({navigation}) => ({
title: 'Editar Calendário',
headerTitleStyle : {textAlign: 'center',alignSelf:'center'},
headerStyle:{
backgroundColor:'white',
},
});
headerTitleStyle: {textAlign: 'center', alignSelf: 'center'},
headerStyle: {
backgroundColor: 'white',
},
});
constructor(props) {
super(props);
@ -55,89 +56,88 @@ class editCalendar extends Component {
loggedIn: false,
onHold: true,
user: {},
cenas:{Name:'as'},
text:'',
cenas: {Name: 'as'},
text: '',
};
}
render() {
return (
<ScrollView>
<View styles={styles.header}>
<View style={styles.carreerPath}>
<View style={styles.carreerPath}>
<Text style={styles.carreerPathText}>Carreer Paths</Text>
</View>
<View style={styles.carreerPathDescription}>
<Text >Nesta edição do enei vai ser possível aos participantes ecolherem uma área</Text>
<Text>Nesta edição do enei vai ser possível aos participantes ecolherem uma área</Text>
</View>
<TouchableOpacity style={{marginRight: 20}} onPress={() => navigation.navigate('Profile')}>
<Text>Escolher path</Text>
</TouchableOpacity>
<Text>Escolher path</Text>
</TouchableOpacity>
</View>
<View>
</View>
</View>
</ScrollView>
)
}
}
const styles = StyleSheet.create({
header:{
flex:1,
height: SCREEN_HEIGHT*0.1,
backgroundColor:'red'
header: {
flex: 1,
height: SCREEN_HEIGHT * 0.1,
backgroundColor: 'red'
},
carreerPath:{
flex:1,
carreerPath: {
flex: 1,
backgroundColor:'#CC1A17',
height:SCREEN_HEIGHT*0.1,
backgroundColor: '#CC1A17',
height: SCREEN_HEIGHT * 0.1,
justifyContent: 'center',
alignItems: 'center',
},
carreerPathText:{
fontSize:20,
carreerPathText: {
fontSize: 20,
fontWeight: 'bold',
color:'white'
color: 'white'
},
carreerPathDescription:{
padding:10,
marginBottom:100
},
wrapper: {
carreerPathDescription: {
padding: 10,
marginBottom: 100
},
wrapper: {},
slide1: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#9DD6EB',
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#9DD6EB',
},
slide2: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#97CAE5',
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#97CAE5',
},
slide3: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#92BBD9',
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#92BBD9',
},
text: {
color: '#fff',
fontSize: 30,
fontWeight: 'bold',
color: '#fff',
fontSize: 30,
fontWeight: 'bold',
}

460
App/app/screens/event.js Normal file
View File

@ -0,0 +1,460 @@
import * as React from "react";
import {
View,
StyleSheet,
Dimensions,
Image,
ScrollView,
Text,
Button,
TouchableOpacity,
ImageBackground,
ListView,
FlatList,
ActivityIndicator
} from "react-native";
import moment from "moment";
import {Divider, Icon, Avatar} from "react-native-elements";
import {TabView, TabBar, SceneMap} from "react-native-tab-view";
import {RkButton, RkCard, RkText, RkTheme} from "react-native-ui-kitten";
import Timeline from "react-native-timeline-feed";
import * as Progress from "react-native-progress";
import NavAbsolute from "../components/Nav";
import {connect} from "react-redux";
import {bindActionCreators} from "redux";
import * as Actions from "../store/actions"; //Import your actionss
import Swiper from "react-native-swiper";
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import FitImage from "react-native-fit-image";
import MapView, {PROVIDER_GOOGLE} from "react-native-maps";
const formatObj = obj => {
let a = {};
a.push({});
return a;
};
class event extends React.Component {
static navigationOptions = ({navigation}) => ({
header: (
<NavAbsolute
navigation={navigation}
// title={navigation.state.params.info.name}
/>
)
});
state = {};
componentDidMount() {
const {navigation} = this.props;
const info = navigation.getParam("info", "error");
}
_update = () => {
this.setState({user: this.props.user});
};
_renderRally = (info) => {
console.log(info)
return (
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.leftRow}>
<Text style={{
margin: 10,
marginTop: 0,
marginBottom: 10,
fontSize: 20,
color: "#CC1A17" }}>
{info.location.nome}
</Text>
</View>
<View style={styles.timeText}>
<Text style={{color: "#CC1A17", fontSize: 15}}>
{info.hora}
</Text>
<Text>{info.horas}</Text>
</View>
</View>
<View>
<View style={{margin: 10}}>
<Text
style={{fontSize: 15, color: "#CC1A17", fontWeight: "bold"}}
>
Descrição:
</Text>
<Divider style={{backgroundColor: "#000"}}/>
<View style={{marginTop: 10}}>
<Text>{info.location.desc}</Text>
</View>
</View>
</View>
</View>
</View>
);
};
_renderEventDetail = (info) => {
return (
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.timeText}>
<Text style={{color: "#CC1A17", fontSize: 15}}>
{info.hora}
</Text>
<Text>{info.horas}</Text>
</View>
</View>
<View>
<Text
style={{
margin: 10,
marginTop: 0,
marginBottom: 10,
fontSize: 20,
color: "#CC1A17"
}}
>
{info.nome}
</Text>
<View style={{margin: 10}}>
<Text
style={{fontSize: 15, color: "#CC1A17", fontWeight: "bold"}}
>
Descrição:
</Text>
<Divider style={{backgroundColor: "#000"}}/>
<View style={{marginTop: 10}}>
<Text>{info.desc}</Text>
</View>
<Text
style={{fontSize: 15, color: "#CC1A17", fontWeight: "bold", marginTop: 10}}
>
Como posso participar?
</Text>
<Divider style={{backgroundColor: "#000"}}/>
<View style={{marginTop: 10}}>
<Text>{info.notas}</Text>
</View>
<Text
style={{fontSize: 15, color: "#CC1A17", fontWeight: "bold", marginTop: 10}}
>
Qual é o custo de participação?
</Text>
<Divider style={{backgroundColor: "#000"}}/>
<View style={{marginTop: 10}}>
<Text>{info.custo}</Text>
</View>
</View>
</View>
</View>
</View>
);
};
_renderContainer = (info, eventType) => {
console.log("Estou aqui " + eventType)
if (eventType === "rally") {
return this._renderRally(info);
}
else if (eventType === undefined) {
return this._renderEventDetail(info);
}
};
constructor(props) {
super(props);
this.data = [];
}
render() {
const {navigation} = this.props;
const info = navigation.getParam("info", "error");
const eventType = navigation.getParam("type");
return (
<View style={styles.mainViewStyle}>
<ScrollView style={styles.scroll}>
<View style={styles.container}>
<View style={styles.headerContainer}>
<View style={styles.headerContainer}>
<View style={styles.coverContainer}>
<ImageBackground
source={{
uri: info.imagem
}}
style={styles.coverImage}
/>
</View>
</View>
</View>
{this._renderContainer(info, eventType)}
</View>
<View style={styles.block}>
<Text
style={{fontSize: 15, color: "#CC1A17", fontWeight: "bold"}}
>
Localização
</Text>
<Divider style={{backgroundColor: "#000", marginBottom: 10}}/>
<Text>{info.localizacao}</Text>
</View>
</ScrollView>
<Divider style={{backgroundColor: "black"}}/>
</View>
);
}
}
const styles = StyleSheet.create({
block: {
marginTop: 15,
backgroundColor: "white",
padding: 20,
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 3
},
AttendeeContainer: {
flexDirection: "row",
height: 55,
justifyContent: "center",
marginLeft: 10,
marginRight: 10
},
centerRow: {
alignItems: "center",
backgroundColor: "transparent",
flex: 3,
flexDirection: "column",
justifyContent: "center"
},
leftRow: {
backgroundColor: "transparent",
flex: 1,
flexDirection: "row",
justifyContent: "flex-start",
alignSelf: "center"
},
rightRow: {
alignItems: "flex-end",
backgroundColor: "transparent",
flex: 2,
flexDirection: "row",
justifyContent: "flex-end",
marginRight: 4,
alignSelf: "center"
},
icon: {
justifyContent: "flex-start",
marginTop: 2.8
},
nameAttendee: {
alignSelf: "center",
fontSize: 20,
fontWeight: "400",
color: "#000",
marginBottom: 10
},
details: {
marginTop: 20,
flex: 1,
alignSelf: "center"
},
infoRow: {
margin: 25
},
ramoText: {
alignSelf: "flex-start",
marginBottom: 5,
color: "white",
fontSize: 17,
fontWeight: "400"
},
timeText: {
alignItems: "flex-end",
flex: 2,
lineHeight: 10,
marginRight: 20
},
mainViewStyle: {
flex: 1,
flexGrow: 1,
flexDirection: "column"
},
scroll: {
backgroundColor: "#eee",
flex: 1
//marginBottom: 55,
},
header: {
flex: 1,
padding: 10,
backgroundColor: "white",
borderRadius: 0,
shadowColor: "#000",
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 3
},
cardContainer: {
flex: 1,
padding: 10,
// margin: 20,
backgroundColor: "white",
borderRadius: 5
},
headerContainer: {
flex: 1
},
container: {
flex: 1,
flexDirection: "column"
},
coverContainer: {
position: "relative"
},
coverImage: {
height: Dimensions.get("window").width * (2 / 4),
width: Dimensions.get("window").width
},
/*headerContainer: {
alignItems: 'center',
backgroundColor: '#FFF',
},*/
carreerPathContainer: {
backgroundColor: "#CC1A17",
height: 50,
flex: 1,
alignItems: "center",
justifyContent: "center",
paddingTop: 15
},
carreerPathText: {
height: 50,
color: "white",
fontWeight: "bold",
fontSize: 20
},
companyHeader: {
backgroundColor: "#dddddd",
// height:150,
borderRadius: 5,
margin: 10,
padding: 10
},
companyTitle: {
paddingBottom: 5,
fontWeight: "bold",
color: "#777777",
fontSize: 17
// padding:20
},
companyLogo: {
borderRadius: 20
},
wrapper: {},
company: {
flex: 1,
flexDirection: "row",
// backgroundColor:'red',
color: "black"
},
companyLogoContainer: {
flex: 1,
justifyContent: "center",
width: "60%",
// backgroundColor:'white',
margin: 20
},
aboutCompany: {
width: SCREEN_WIDTH,
flex: 1,
justifyContent: "center",
alignItems: "center"
}
});
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
logged: state.apiReducer.logged,
careerPath: state.apiReducer.careerPath,
sessionDetail: state.apiReducer.sessionDetail
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(event);

View File

@ -0,0 +1,497 @@
import * as React from "react";
import {
View,
StyleSheet,
Dimensions,
Image,
ScrollView,
Text,
Button,
TouchableOpacity,
ImageBackground,
ListView,
FlatList,
ActivityIndicator,
Linking,
Platform
} from "react-native";
import moment from "moment";
import { Divider, Icon, Avatar } from "react-native-elements";
import { TabView, TabBar, SceneMap } from "react-native-tab-view";
import { RkButton, RkCard, RkText, RkTheme } from "react-native-ui-kitten";
import Timeline from "react-native-timeline-feed";
import * as Progress from "react-native-progress";
import NavAbsolute from "../components/Nav";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import * as Actions from "../store/actions"; //Import your actionss
import Swiper from "react-native-swiper";
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
import FitImage from "react-native-fit-image";
import MapView, { PROVIDER_GOOGLE } from "react-native-maps";
const formatObj = obj => {
let a = {};
a.push({});
return a;
};
class eventDetail extends React.Component {
static navigationOptions = ({ navigation }) => ({
header: (
<NavAbsolute
navigation={navigation}
/>
)
});
state = {};
openMaps = () => {};
componentDidMount() {
const { navigation } = this.props;
const info = navigation.getParam("info", "error");
}
_update = () => {
this.setState({ user: this.props.user });
};
_renderRally = info => {
console.log(info);
return (
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.leftRow}>
<Text
style={{
margin: 10,
marginTop: 0,
marginBottom: 10,
fontSize: 20,
color: "#CC1A17"
}}
>
{info.location.nome}
</Text>
</View>
<View style={styles.timeText}>
<Text style={{ color: "#CC1A17", fontSize: 15 }}>
{info.hora}
</Text>
<Text>{info.horas}</Text>
</View>
</View>
<View>
<View style={{ margin: 10 }}>
<Text
style={{ fontSize: 15, color: "#CC1A17", fontWeight: "bold" }}
>
Descrição:
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.location.desc}</Text>
</View>
<Text
style={{
fontSize: 15,
color: "#CC1A17",
fontWeight: "bold",
marginTop: 20
}}
>
Desafio:
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.location.desafio}</Text>
</View>
</View>
</View>
</View>
</View>
);
};
_renderEventDetail = info => {
return (
<View>
<View style={styles.header}>
<View
style={{
flexDirection: "row",
alignItems: "center",
alignSelf: "center"
}}
>
<View style={styles.timeText}>
<Text style={{ color: "#CC1A17", fontSize: 15 }}>
{info.hora}
</Text>
<Text>{info.horas}</Text>
</View>
</View>
<View>
<Text
style={{
margin: 10,
marginTop: 0,
marginBottom: 10,
fontSize: 20,
color: "#CC1A17"
}}
>
{info.nome}
</Text>
<View style={{ margin: 10 }}>
<Text
style={{ fontSize: 15, color: "#CC1A17", fontWeight: "bold" }}
>
Descrição:
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.desc}</Text>
</View>
<Text
style={{
fontSize: 15,
color: "#CC1A17",
fontWeight: "bold",
marginTop: 10
}}
>
Como posso participar?
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.notas}</Text>
</View>
<Text
style={{
fontSize: 15,
color: "#CC1A17",
fontWeight: "bold",
marginTop: 10
}}
>
Qual é o custo de participação?
</Text>
<Divider style={{ backgroundColor: "#000" }} />
<View style={{ marginTop: 10 }}>
<Text>{info.custo}</Text>
</View>
</View>
</View>
</View>
</View>
);
};
_renderContainer = (info, eventType) => {
console.log("Estou aqui " + eventType);
if (eventType === "rally") {
return this._renderRally(info);
} else if (eventType === undefined) {
return this._renderEventDetail(info);
}
};
constructor(props) {
super(props);
this.data = [];
}
render() {
const { navigation } = this.props;
const info = navigation.getParam("info", "error");
const eventType = navigation.getParam("type");
console.log(info)
if(info!= undefined)
return (
<View style={styles.mainViewStyle}>
<ScrollView style={styles.scroll}>
<View style={styles.container}>
<View style={styles.headerContainer}>
<View style={styles.headerContainer}>
<View style={styles.coverContainer}>
<ImageBackground
source={{
uri: info.location.mainPhoto
}}
style={styles.coverImage}
/>
</View>
</View>
</View>
{this._renderContainer(info, eventType)}
</View>
<View>
<TouchableOpacity
onPress={() => {
console.log(info.location.lat)
console.log(info.location.long)
const scheme = Platform.select({
ios: "maps:0,0?q=",
android: "geo:0,0?q="
});
const latLng = `${info.location.lat},${info.location.long}`;
const label = info.location.nome;
const url = Platform.select({
ios: `${scheme}${label}@${latLng}`,
android: `${scheme}${latLng}(${label})`
});
Linking.openURL(url);
}}
>
<FitImage
source={{
uri: info.location.localizacao
}}
/>
</TouchableOpacity>
</View>
</ScrollView>
<Divider style={{ backgroundColor: "black" }} />
</View>
);
}
}
const styles = StyleSheet.create({
block: {
marginTop: 15,
backgroundColor: "white",
padding: 20,
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 3
},
AttendeeContainer: {
flexDirection: "row",
height: 55,
justifyContent: "center",
marginLeft: 10,
marginRight: 10
},
centerRow: {
alignItems: "center",
backgroundColor: "transparent",
flex: 3,
flexDirection: "column",
justifyContent: "center"
},
leftRow: {
backgroundColor: "transparent",
flex: 1,
flexDirection: "row",
justifyContent: "flex-start",
alignSelf: "center"
},
rightRow: {
alignItems: "flex-end",
backgroundColor: "transparent",
flex: 2,
flexDirection: "row",
justifyContent: "flex-end",
marginRight: 4,
alignSelf: "center"
},
icon: {
justifyContent: "flex-start",
marginTop: 2.8
},
nameAttendee: {
alignSelf: "center",
fontSize: 20,
fontWeight: "400",
color: "#000",
marginBottom: 10
},
details: {
marginTop: 20,
flex: 1,
alignSelf: "center"
},
infoRow: {
margin: 25
},
ramoText: {
alignSelf: "flex-start",
marginBottom: 5,
color: "white",
fontSize: 17,
fontWeight: "400"
},
timeText: {
alignItems: "flex-end",
flex: 2,
lineHeight: 10,
marginRight: 20
},
mainViewStyle: {
flex: 1,
flexGrow: 1,
flexDirection: "column"
},
scroll: {
backgroundColor: "#eee",
flex: 1
//marginBottom: 55,
},
header: {
flex: 1,
padding: 10,
backgroundColor: "white",
borderRadius: 0,
shadowColor: "#000",
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 3
},
cardContainer: {
flex: 1,
padding: 10,
// margin: 20,
backgroundColor: "white",
borderRadius: 5
},
headerContainer: {
flex: 1
},
container: {
flex: 1,
flexDirection: "column"
},
coverContainer: {
position: "relative"
},
coverImage: {
height: Dimensions.get("window").width * (2 / 4),
width: Dimensions.get("window").width
},
/*headerContainer: {
alignItems: 'center',
backgroundColor: '#FFF',
},*/
carreerPathContainer: {
backgroundColor: "#CC1A17",
height: 50,
flex: 1,
alignItems: "center",
justifyContent: "center",
paddingTop: 15
},
carreerPathText: {
height: 50,
color: "white",
fontWeight: "bold",
fontSize: 20
},
companyHeader: {
backgroundColor: "#dddddd",
// height:150,
borderRadius: 5,
margin: 10,
padding: 10
},
companyTitle: {
paddingBottom: 5,
fontWeight: "bold",
color: "#777777",
fontSize: 17
// padding:20
},
companyLogo: {
borderRadius: 20
},
wrapper: {},
company: {
flex: 1,
flexDirection: "row",
// backgroundColor:'red',
color: "black"
},
companyLogoContainer: {
flex: 1,
justifyContent: "center",
width: "60%",
// backgroundColor:'white',
margin: 20
},
aboutCompany: {
width: SCREEN_WIDTH,
flex: 1,
justifyContent: "center",
alignItems: "center"
}
});
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
logged: state.apiReducer.logged,
careerPath: state.apiReducer.careerPath,
sessionDetail: state.apiReducer.sessionDetail
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(eventDetail);

View File

@ -1,47 +0,0 @@
/*
/*
/*
/*Esta página só está disponivel a 1 hora do rally..
*/
import * as React from "react";
import {View, StyleSheet, Dimensions, Text, Button, ScrollView} from "react-native";
import {TabView, TabBar, SceneMap} from "react-native-tab-view";
import * as Actions from "../store/actions";
import {connect} from "react-redux";
import {bindActionCreators} from "redux";
export default class rallyTascas extends React.Component {
render() {
return (
<View>
</View>
)
}
}
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
logged: state.apiReducer.logged,
events: state.apiReducer.events
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(rallyTascas);

View File

@ -1,29 +0,0 @@
import React, {Component} from 'react';
import {
ActivityIndicator,
AsyncStorage,
Button,
StatusBar,
StyleSheet,
View,
} from 'react-native';
import {UtilStyles} from '../assets/styles'
export default class resetPassword extends Component {
constructor() {
super();
this._bootstrapAsync();
}
// Render Loading
render() {
return (
<View style={UtilStyles.containerLoading}>
<Text>Reset Password</Text>
</View>
);
}
}

View File

@ -0,0 +1,375 @@
/*
/*
/*
/*Esta página só está disponivel a 1 hora do rally..
*/
import * as React from "react";
import {
View,
StyleSheet,
Dimensions,
Text,
Button,
ScrollView,
FlatList,
TouchableOpacity,
Image,
TextInput
} from "react-native";
import { TabView, TabBar, SceneMap } from "react-native-tab-view";
import { Icon } from "react-native-elements";
import * as Actions from "../store/actions";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import FitImage from "react-native-fit-image";
import PTRView from "react-native-pull-to-refresh";
const SCREEN_WIDTH = Dimensions.get("window").width;
const SCREEN_HEIGHT = Dimensions.get("window").height;
import IconFA from "react-native-vector-icons/FontAwesome5";
class teamDetail extends React.Component {
componentDidMount() {
/* this.props.getEventLocsVisited(
this.props.team.id,
this.props.internalToken
);*/
console.log(this.props.locais);
}
constructor(props) {
super(props);
this.state = {
nome: this.props.team.nome
};
}
_update = () => {
this.props.getEventLocsVisited(this.props.team.id, this.props.internalToken)
};
_alterTeamName = () => {};
render() {
const { navigate } = this.props.navigation;
return (
<PTRView onRefresh={this._update}>
{this.props.team!= undefined &&
<ScrollView style={{ backgroundColor: "#eeeeee" }}>
<View>
<View style={styles.header}>
<View
style={{
backgroundColor: "#CC1A17",
flex: 1,
flexDirection: "row",
alignItems: "center",
alignContent: "center"
}}
>
{this.props.user.Code == this.props.team.cap.qRcode && (
<View
style={{
alignItems: "center",
alignSelf: "center",
width: "100%",
flex: 1,
flexDirection: "row"
}}
>
<View style={{ width: "80%" }}>
<TextInput
style={{
height: 40,
borderColor: "white",
borderWidth: 1,
color: "white",
margin: 10,
padding: 10,
borderRadius: 3,
fontSize: 15,
}}
onChangeText={n => this.setState({ nome: n })}
value={this.state.nome}
maxLength = {30}
/>
</View>
<TouchableOpacity
style={{
flex: 1,
flexDirection: "row",
width: "20%",
alignContent: "center",
alignItems: "center"
}}
onPress={()=>{
this.props.changeTeamName(this.props.internalToken, {
TeamID:this.props.team.id,
nome:this.state.nome,
UserQR:this.props.user.Code,
})
}}
>
<Text>Guardar</Text>
<IconFA name="user-edit" size={22} />
</TouchableOpacity>
</View>
)}
{this.props.user.Code != this.props.team.cap.qRcode && (
<View style={{ width: "100%", padding: 10 }}>
<Text
style={{
fontSize: 22,
fontWeight: "bold",
color: "white",
textAlign: "center",
alignSelf: "center"
}}
>
{this.props.team.nome}
</Text>
</View>
)}
<View>
<Icon
name="md-trophy"
type="ionicon"
color="#CC1A17"
style={{
alignSelf: "center",
alignContent: "center"
}}
/>
<Text style={styles.headerText}>
&nbsp; {this.props.team.pontos}
</Text>
</View>
</View>
<View style={{ paddingBottom: 10 }}>
<View style={styles.row}>
{this.props.team.membros && (
<FlatList
data={this.props.team.membros}
numColumns={6} // Número de colunas
renderItem={({ item }) => (
<View style={styles.memberImage}>
<Image
style={{ width: 50, height: 50 }}
source={require("../assets/logo_black.jpg")}
/>
</View>
)}
/>
)}
</View>
</View>
</View>
<View style={styles.container}>
<View style={{ flex: 1, width: "100%" }}>
{this.props.locais && (
<FlatList
data={this.props.locais}
renderItem={({ item }) => (
<TouchableOpacity
onPress={() =>
navigate("eventDetail", { info: item, type: "rally" })
}
>
<View style={{ margin: 10 }}>
<View
style={{
backgroundColor: "white",
flex: 1,
flexDirection: "row",
padding: 15
}}
>
{/*Se bar estiver concluido, mostrar backgroundColor verde no container..*/}
<View style={{ height: 120, width: 120 }}>
<FitImage
source={{
uri: item.location.squarePhoto
}}
/>
</View>
<View style={{ width: "65%" }}>
<Text
style={{
color: "#CC1A17",
fontWeight: "bold",
fontSize: 20,
marginLeft: 15
}}
>
{item.location.nome}
</Text>
<Text style={{ fontSize: 12, padding: 15 }}>
{item.location.desc}
</Text>
</View>
</View>
{item.complete && (
<View
style={{
backgroundColor: "#CC1A17",
flex: 1,
flexDirection: "row",
alignContent: "center",
alignItems: "center",
alignSelf: "center",
width: "100%",
paddingLeft: 15
}}
>
<Text
style={{
color: "white",
margin: 3,
textAlign: "center"
}}
>
Done
</Text>
<IconFA name="check" size={12} color={"white"} />
</View>
)}
</View>
</TouchableOpacity>
)}
/>
)}
</View>
</View>
</View>
</ScrollView>
}
</PTRView>
);
}
}
const styles = StyleSheet.create({
triangleLeft: {
width: 0,
height: 0,
backgroundColor: "#CC1A17",
borderStyle: "solid",
borderLeftWidth: 25,
borderRightWidth: 25,
borderBottomWidth: 50,
borderLeftColor: "transparent",
borderRightColor: "transparent",
borderBottomColor: "white",
backgroundColor: "#CC1A17",
transform: [{ rotate: "90deg" }]
},
triangleRight: {
width: 0,
height: 0,
backgroundColor: "#CC1A17",
borderStyle: "solid",
borderLeftWidth: 25,
borderRightWidth: 25,
borderBottomWidth: 50,
borderLeftColor: "transparent",
borderRightColor: "transparent",
borderBottomColor: "white",
backgroundColor: "#CC1A17",
transform: [{ rotate: "-90deg" }],
alignSelf: "flex-end"
},
header: {
margin: 0,
flex: 1,
flexGrow: 1,
flexDirection: "column"
},
container: {
margin: 10,
flex: 1,
flexGrow: 1,
flexDirection: "column"
},
row: {
flex: 1,
flexDirection: "row",
padding: 10,
backgroundColor: "white",
borderRadius: 0,
shadowColor: "#000",
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 3
},
headerText: {
fontSize: 18,
color: "#CC1A17",
fontWeight: "bold"
},
centerRow: {
alignItems: "center",
backgroundColor: "transparent",
flex: 3,
flexDirection: "column",
justifyContent: "center"
},
leftRow: {
backgroundColor: "transparent",
flex: 1,
flexDirection: "row",
justifyContent: "flex-start",
alignSelf: "center"
},
rightRow: {
alignItems: "flex-end",
backgroundColor: "transparent",
flex: 2,
flexDirection: "row",
justifyContent: "flex-end",
marginRight: 4,
alignSelf: "center"
},
memberImage: {
flex: 1,
marginRight: 4,
flexDirection: "column",
alignItems: "center",
backgroundColor: "transparent"
}
});
function mapStateToProps(state, props) {
return {
token: state.apiReducer.token,
user: state.apiReducer.user,
team: state.apiReducer.team,
internalToken: state.apiReducer.internalToken,
eventsInternal: state.apiReducer.eventsInternal,
locais: state.apiReducer.locais
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(Actions, dispatch);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(teamDetail);

View File

@ -1,3 +1,14 @@
//MINHA API
export const GET_TEAM='GET_TEAM'
export const GET_INTERNAL_EVENTS ='GET_INTERNAL_EVENTS'
export const CREATE_TEAM='CREATE_TEAM'
export const DELETE_TEAM='DELETE_TEAM'
export const GET_CROMOS='GET_CROMOS'
export const GET_LOCS_VISITED= 'GET_LOCS_VISITED'
export const SCAN_QR = 'SCAN_QR'
export const LOGIN_INTERNAL ='LOGIN_INTERNAL'
export const CHANGE_PASSWORD='CHANGE_PASSWORD'
//API BLUETREND
@ -12,7 +23,7 @@ export const GET_EVENTS='GET_EVENTS'
export const UPDATE_USER='UPDATE_USER'
export const RESET_PASSWORD='RESET_PASSWORD'
export const CHECK_AND_RENEW='CHECK_AND_RENEW'
export const SESSION_DETAIL='SESSION_DETAIL'

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,18 @@ export {checkUser,
waitLogin,
removeSession,
changePassword,
resetPassword
resetPassword,
getSessionDetails,
getUserTeam,
addUserTeam,
removeUserTeam,
getAllEvents,
createTeam,
deleteTeam,
getCromos,
getEventLocsVisited,
scanQrCode,
changeTeamName
} from "./api"

View File

@ -18,7 +18,15 @@ import {
LOADINGLOGIN,
REMOVE_SESSION,
UPDATE_USER,
SESSION_DETAIL,
GET_TEAM,
GET_INTERNAL_EVENTS,
CREATE_TEAM,
GET_CROMOS,
GET_LOCS_VISITED,
SCAN_QR,
LOGIN_INTERNAL,
CHANGE_PASSWORD
} from "../actions/actionTypes"; //Import the actions types constant we defined in our actions
import { REHYDRATE } from "redux-persist";
@ -26,18 +34,19 @@ import { REHYDRATE } from "redux-persist";
let apiState = {
isConnected: false,
logged: false,
onHold: true,
onHold: false,
user: {},
events: [],
showAlert: true,
failedAttempt: false,
token:'',
userDetails: {
username: "",
password: "",
token: {
expirationDateToken: 0,
access_token: "",
refresh_token:""
refresh_token: ""
}
},
calendar: {},
@ -45,15 +54,21 @@ let apiState = {
sessions: {},
Blocks: {},
onHoldBlocks: true,
careerPath: { name: "Sem Career Path", color: "#eeeeee" },
careerPath: { name: "Sem Career Path", color: "#eeeeee" , code:''},
a: {},
b: {},
c: {},
d: {},
loadingLogin: false,
alimentacao:[],
acesso:[],
alojamento:[]
alimentacao: [],
acesso: [],
alojamento: [],
sessionDetail:{},
team:undefined,
internalToken:"",
eventsInternal:[],
cromos:[],
locais:[],
};
const apiReducer = (state = apiState, action) => {
@ -65,31 +80,21 @@ const apiReducer = (state = apiState, action) => {
var expirationDateTokenA = 0;
var access_tokenA = "";
var refresh_tokenA= "puta";
var refresh_tokenA = "puta";
if (action.payload.apiReducer.token != undefined) {
if (
action.payload.apiReducer.token.expirationDateToken !=
undefined
action.payload.apiReducer.token.expirationDateToken != undefined
) {
expirationDateTokenA =
action.payload.apiReducer.token.expirationDateToken;
}
if (
action.payload.apiReducer.token.access_token !=
undefined
) {
access_tokenA =
action.payload.apiReducer.token.access_token;
if (action.payload.apiReducer.token.access_token != undefined) {
access_tokenA = action.payload.apiReducer.token.access_token;
}
if (
action.payload.apiReducer.token.refresh_token !=
undefined
) {
refresh_tokenA =
action.payload.apiReducer.token.refresh_token;
if (action.payload.apiReducer.token.refresh_token != undefined) {
refresh_tokenA = action.payload.apiReducer.token.refresh_token;
}
}
@ -102,26 +107,61 @@ const apiReducer = (state = apiState, action) => {
token: {
expirationDateToken: expirationDateTokenA,
access_token: access_tokenA,
refresh_token:refresh_tokenA,
refresh_token: refresh_tokenA
},
username: action.payload.apiReducer.userDetails.username,
password: action.payload.apiReducer.userDetails.password
},
token:action.payload.apiReducer.token
token: action.payload.apiReducer.token,
team: action.payload.apiReducer.team,
eventsInternal: action.payload.apiReducer.eventsInternal,
alimentacao: action.payload.apiReducer.alimentacao,
acesso: action.payload.apiReducer.acesso,
alojamento: action.payload.apiReducer.alojamento,
internalToken:"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJjZW5hIiwicm9sZSI6IkFkbWluIiwibmJmIjoxNTUyODcwODcwLCJleHAiOjE1NTU0NTkyNzAsImlhdCI6MTU1Mjg3MDg3MH0.wkBk-CUDMCaU-K9jI0pTRJ794IGCl-C9md39dMfHqa5zTf-gNpD76xEYea3PhIbW2dnUVgo0m1fxR1sW7k9LMg",
cromos: action.payload.apiReducer.cromos,
careerPath: action.payload.apiReducer.careerPath,
locais: action.payload.apiReducer.locais,
Blocks: action.payload.apiReducer.Blocks
};
}
case GET_CROMOS:
return Object.assign({}, state, {
cromos: action.cromos
});
case LOGIN_INTERNAL:
return Object.assign({}, state, {
internalToken: action.internalToken
});
case GET_LOCS_VISITED:
return Object.assign({}, state, {
locais: action.locais
});
case CHANGE_PASSWORD:
return Object.assign({}, state, {
onHold: false
});
case "CHANGE_CONNECTION_STATUS":
return Object.assign({}, state, {
isConnected: action.isConnected
});
case SESSION_DETAIL:
state = Object.assign({}, state, {
token: action.token,
sessionDetail: action.sessionDetail
});
return state;
case UPDATE_USER:
state = Object.assign({}, state, { user:action.user});
return state
state = Object.assign({}, state, { user: action.user , toke: action.token, onHold:false});
return state;
case LOADINGLOGIN:
state = Object.assign({}, state, { loadingLogin: true });
return state;
case HOLD:
state = Object.assign({}, state, { onHold: true });
return state;
@ -132,25 +172,32 @@ const apiReducer = (state = apiState, action) => {
//token:action.token,
failedAttempt: action.failedAttempt,
user: action.user,
userDetails: {
token: action.token,
username: action.userDetails.username,
password: action.userDetails.password
},
loadingLogin: false,
onHold: action.onHold,
token:action.token
onHold: false,
token: action.token
});
return state;
case CHECK_USER:
case GET_TEAM:
state = Object.assign({}, state, {
team: action.team
});
case GET_INTERNAL_EVENTS:
return Object.assign({}, state, {
eventsInternal: action.eventsInternal
});
return state;
case CHECK_USER:
state = Object.assign({}, state, {
logged: action.logged,
onHold: action.onHold,
// userDetails: u,
token:action.token
onHold: false,
// userDetails: u,
token: action.token
});
return state;
@ -159,25 +206,25 @@ const apiReducer = (state = apiState, action) => {
state = Object.assign({}, state, {
user: {},
userDetails: {},
token:{},
token: {},
logged: false
});
return state;
case USER_INFO:
state = Object.assign({}, state, {
user: action.user,
loggedIn: action.loggedIn,
onHold: action.onHold,
token: action.token
});
return state;
case GET_EVENTS:
console.log("aaaaaaqqquii")
console.log(action)
state = Object.assign({}, state, {
events: action.events,
a: action.day1,
@ -186,8 +233,7 @@ const apiReducer = (state = apiState, action) => {
d: action.day4,
alimentacao: action.alimentacao,
alojamento: action.alojamento,
acesso:action.acesso
acesso: action.acesso
});
return state;
@ -198,7 +244,8 @@ const apiReducer = (state = apiState, action) => {
Blocks: action.Blocks,
careerPath: action.careerPath,
changingGuest: action.changingGuest,
user: action.user
user: action.user,
token: action.token
});
return state;
@ -220,30 +267,29 @@ const apiReducer = (state = apiState, action) => {
return state;
case SIGN_SESSION:
if(action.sessions==undefined || action.Blocks==undefined || action.user==undefined){
if (
action.sessions == undefined ||
action.Blocks == undefined ||
action.user == undefined
) {
state = Object.assign({}, state, {
changingGuest: false
});
} else {
state = Object.assign({}, state, {
sessions: action.sessions,
Blocks: action.Blocks,
careerPath: action.careerPath,
changingGuest: false,
user: action.user,
a: action.day1,
b: action.day2,
c: action.day3,
d: action.day4,
token: action.token
});
}
else{
state = Object.assign({}, state, {
sessions: action.sessions,
Blocks: action.Blocks,
careerPath: action.careerPath,
changingGuest: false,
user: action.user,
a:action.day1,
b:action.day2,
c:action.day3,
d:action.day4
});
}
return state;
case SESSION_BLOCKS:
@ -258,7 +304,7 @@ const apiReducer = (state = apiState, action) => {
var c = {
guests: action.guests
};
state = Object.assign({}, state, { calendar: c });
state = Object.assign({}, state, { calendar: c, token: action.token });
return state;
@ -267,7 +313,8 @@ const apiReducer = (state = apiState, action) => {
changingGuest: false,
sessions: action.sessions,
Blocks: action.Blocks,
careerPath: action.careerPath
careerPath: action.careerPath,
token: action.token
});
return state;
@ -278,15 +325,17 @@ const apiReducer = (state = apiState, action) => {
case TIMERWAIT_CHANGE:
state = Object.assign({}, state, { Blocks: true });
return state;
case GET_SESSIONS:
state = Object.assign({}, state, {
sessions: action.sessions,
Blocks: action.Blocks,
careerPath: action.careerPath
careerPath: action.careerPath,
token: action.token
});
return state;
default:
return state;
}
};
export default apiReducer;
export default apiReducer;

0
App/ios/app-tvOS/Info.plist Normal file → Executable file
View File

0
App/ios/app-tvOSTests/Info.plist Normal file → Executable file
View File

108
App/ios/app.xcodeproj/project.pbxproj Normal file → Executable file
View File

@ -5,6 +5,7 @@
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
@ -35,9 +36,11 @@
2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
2DCD954D1E0B4F2C00145EB5 /* appTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appTests.m */; };
2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };
4EBB88037B054A508BF35245 /* libRNDeviceInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F42241E0235464C91B24049 /* libRNDeviceInfo.a */; };
514DB1DF2E3B452F9EF272E3 /* libRNVectorIcons-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */; };
69E1B84AE0DF486CB1B1D226 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
A52E07192CD249F7B10FDA66 /* libAirMaps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C0906CC582484A7393F9B1F6 /* libAirMaps.a */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
BE104176D74E47E9A369B15A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */; };
BE302B6D221B7875005626CF /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE302B6C221B7860005626CF /* libRNCamera.a */; };
@ -58,9 +61,7 @@
BE5EAB86221B7D5400E92E5B /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE5EAB77221B7D5400E92E5B /* Zocial.ttf */; };
BE5EAC3A221B83CF00E92E5B /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE302B75221B7C3B005626CF /* Ionicons.ttf */; };
BE5EAC41221B889900E92E5B /* libReactNativePermissions.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE5EAC40221B888C00E92E5B /* libReactNativePermissions.a */; };
4EBB88037B054A508BF35245 /* libRNDeviceInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F42241E0235464C91B24049 /* libRNDeviceInfo.a */; };
E677346A94D54E90817979B0 /* libRNDeviceInfo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C4D43A092A4408B91B32E76 /* libRNDeviceInfo-tvOS.a */; };
A52E07192CD249F7B10FDA66 /* libAirMaps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C0906CC582484A7393F9B1F6 /* libAirMaps.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -386,6 +387,27 @@
remoteGlobalIDString = 9D23B34F1C767B80008B4819;
remoteInfo = ReactNativePermissions;
};
BE7C0E9A223D9A43009CAF95 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = DA5891D81BA9A9FC002B4DB2;
remoteInfo = RNDeviceInfo;
};
BE7C0E9C223D9A43009CAF95 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E72EC1401F7ABB5A0001BC90;
remoteInfo = "RNDeviceInfo-tvOS";
};
BE7C0EA1223D9A43009CAF95 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A97F1617782E42EC83467F41 /* AirMaps.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 11FA5C511C4A1296003AC2EE;
remoteInfo = AirMaps;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
@ -398,6 +420,7 @@
00E356EE1AD99517003FC87E /* appTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = appTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00E356F21AD99517003FC87E /* appTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = appTests.m; sourceTree = "<group>"; };
0F42241E0235464C91B24049 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = "<group>"; };
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = app.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -412,11 +435,14 @@
2D02E47B1E0B4A5D006451C7 /* app-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "app-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
2D02E4901E0B4A5D006451C7 /* app-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "app-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };
3C4D43A092A4408B91B32E76 /* libRNDeviceInfo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNDeviceInfo-tvOS.a"; sourceTree = "<group>"; };
5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNDeviceInfo.xcodeproj; path = "../node_modules/react-native-device-info/ios/RNDeviceInfo.xcodeproj"; sourceTree = "<group>"; };
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
664970B9D10A41A18B44727F /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = "<group>"; };
A97F1617782E42EC83467F41 /* AirMaps.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = AirMaps.xcodeproj; path = "../node_modules/react-native-maps/lib/ios/AirMaps.xcodeproj"; sourceTree = "<group>"; };
ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = "<group>"; };
BE302B67221B7860005626CF /* RNCamera.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RNCamera.xcodeproj"; sourceTree = "<group>"; };
BE302B6E221B7AC7005626CF /* RNGestureHandler.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNGestureHandler.xcodeproj; path = "../node_modules/react-native-gesture-handler/ios/RNGestureHandler.xcodeproj"; sourceTree = "<group>"; };
@ -437,12 +463,8 @@
BE5EAB77221B7D5400E92E5B /* Zocial.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = "<group>"; };
BE5EAC3B221B888C00E92E5B /* ReactNativePermissions.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativePermissions.xcodeproj; path = "../node_modules/react-native-permissions/ios/ReactNativePermissions.xcodeproj"; sourceTree = "<group>"; };
C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = "<group>"; };
C0906CC582484A7393F9B1F6 /* libAirMaps.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libAirMaps.a; sourceTree = "<group>"; };
EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */ = {isa = PBXFileReference; name = "RNDeviceInfo.xcodeproj"; path = "../node_modules/react-native-device-info/ios/RNDeviceInfo.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
0F42241E0235464C91B24049 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; name = "libRNDeviceInfo.a"; path = "libRNDeviceInfo.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
3C4D43A092A4408B91B32E76 /* libRNDeviceInfo-tvOS.a */ = {isa = PBXFileReference; name = "libRNDeviceInfo-tvOS.a"; path = "libRNDeviceInfo-tvOS.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
A97F1617782E42EC83467F41 /* AirMaps.xcodeproj */ = {isa = PBXFileReference; name = "AirMaps.xcodeproj"; path = "../node_modules/react-native-maps/lib/ios/AirMaps.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
C0906CC582484A7393F9B1F6 /* libAirMaps.a */ = {isa = PBXFileReference; name = "libAirMaps.a"; path = "libAirMaps.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -765,6 +787,9 @@
EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */,
95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */,
C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */,
0F42241E0235464C91B24049 /* libRNDeviceInfo.a */,
C0906CC582484A7393F9B1F6 /* libAirMaps.a */,
3C4D43A092A4408B91B32E76 /* libRNDeviceInfo-tvOS.a */,
);
name = "Recovered References";
sourceTree = "<group>";
@ -795,6 +820,23 @@
name = Products;
sourceTree = "<group>";
};
BE7C0E96223D9A42009CAF95 /* Products */ = {
isa = PBXGroup;
children = (
BE7C0E9B223D9A43009CAF95 /* libRNDeviceInfo.a */,
BE7C0E9D223D9A43009CAF95 /* libRNDeviceInfo-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
};
BE7C0E9E223D9A43009CAF95 /* Products */ = {
isa = PBXGroup;
children = (
BE7C0EA2223D9A43009CAF95 /* libAirMaps.a */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -881,6 +923,7 @@
TargetAttributes = {
00E356ED1AD99517003FC87E = {
CreatedOnToolsVersion = 6.2;
DevelopmentTeam = HLA62A6826;
TestTargetID = 13B07F861A680F5B00A75B9A;
};
13B07F861A680F5B00A75B9A = {
@ -888,6 +931,7 @@
};
2D02E47A1E0B4A5D006451C7 = {
CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = HLA62A6826;
ProvisioningStyle = Automatic;
};
2D02E48F1E0B4A5D006451C7 = {
@ -902,6 +946,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
@ -909,6 +954,10 @@
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = BE7C0E9E223D9A43009CAF95 /* Products */;
ProjectRef = A97F1617782E42EC83467F41 /* AirMaps.xcodeproj */;
},
{
ProductGroup = BE5EAC32221B835A00E92E5B /* Products */;
ProjectRef = 1908F5E093844AC5A143E888 /* BVLinearGradient.xcodeproj */;
@ -969,6 +1018,10 @@
ProductGroup = BE302B68221B7860005626CF /* Products */;
ProjectRef = BE302B67221B7860005626CF /* RNCamera.xcodeproj */;
},
{
ProductGroup = BE7C0E96223D9A42009CAF95 /* Products */;
ProjectRef = 5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */;
},
{
ProductGroup = BE302B6F221B7AC7005626CF /* Products */;
ProjectRef = BE302B6E221B7AC7005626CF /* RNGestureHandler.xcodeproj */;
@ -1297,6 +1350,27 @@
remoteRef = BE5EAC3F221B888C00E92E5B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
BE7C0E9B223D9A43009CAF95 /* libRNDeviceInfo.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNDeviceInfo.a;
remoteRef = BE7C0E9A223D9A43009CAF95 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
BE7C0E9D223D9A43009CAF95 /* libRNDeviceInfo-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRNDeviceInfo-tvOS.a";
remoteRef = BE7C0E9C223D9A43009CAF95 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
BE7C0EA2223D9A43009CAF95 /* libAirMaps.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libAirMaps.a;
remoteRef = BE7C0EA1223D9A43009CAF95 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
@ -1446,6 +1520,7 @@
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
DEVELOPMENT_TEAM = HLA62A6826;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
@ -1455,7 +1530,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = appTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
@ -1484,12 +1559,13 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = HLA62A6826;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = appTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
@ -1525,7 +1601,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = app/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1551,7 +1627,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = app/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1576,6 +1652,7 @@
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = HLA62A6826;
ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
@ -1583,7 +1660,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = "app-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1619,13 +1696,14 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = HLA62A6826;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = "app-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1666,7 +1744,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = "app-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@ -1707,7 +1785,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
"$(SRCROOT)\..\node_modules\react-native-maps\lib\ios/**",
"$(SRCROOT)..\node_modules\neact-native-mapslibios/**",
);
INFOPLIST_FILE = "app-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";

View File

View File

0
App/ios/app/AppDelegate.h Normal file → Executable file
View File

0
App/ios/app/AppDelegate.m Normal file → Executable file
View File

17
App/ios/app/Base.lproj/LaunchScreen.xib Normal file → Executable file
View File

@ -1,9 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
@ -12,20 +15,20 @@
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="Henrique Dias" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<rect key="frame" x="20" y="439" width="441" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="app" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="ENEI 2019" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>

View File

@ -1,48 +1,57 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "ItunesArtwork@2x.png",
"scale" : "1x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

0
App/ios/app/Images.xcassets/Contents.json Normal file → Executable file
View File

56
App/ios/app/Info.plist Normal file → Executable file
View File

@ -2,20 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string></string>
<string>FontAwesome5_Solid.ttf</string>
<string>FontAwesome5_Regular.ttf</string>
<string>FontAwesome5_Brands.ttf</string>
<string>FontAwesome.ttf</string>
<string>Foundation.ttf</string>
<string>Ionicons.ttf</string>
</array>
<key>LSApplicationCategoryType</key>
<string></string>
<key>CFBundleDisplayName</key>
<string>app</string>
<string>ENEI 2019</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -27,11 +15,13 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<string>1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<string>12</string>
<key>LSApplicationCategoryType</key>
<string></string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
@ -47,21 +37,47 @@
</dict>
</dict>
</dict>
<key>NSAppleMusicUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSCalendarsUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSCameraUsageDescription</key>
<string>A camera é usada para ler os QR codes presentes no evento. Facilita o uso da aplicação.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSMotionUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Not used, just added this key because i used react-native and needed this keys for approval.</string>
<key>UIAppFonts</key>
<array>
<string>MaterialIcons.ttf</string>
<string>FontAwesome5_Solid.ttf</string>
<string>FontAwesome5_Regular.ttf</string>
<string>FontAwesome5_Brands.ttf</string>
<string>FontAwesome.ttf</string>
<string>Foundation.ttf</string>
<string>Ionicons.ttf</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera use</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

0
App/ios/app/main.m Normal file → Executable file
View File

0
App/ios/appTests/Info.plist Normal file → Executable file
View File

0
App/ios/appTests/appTests.m Normal file → Executable file
View File

63
App/package-lock.json generated
View File

@ -2958,7 +2958,7 @@
"integrity": "sha512-xo8wZ9/4F3P1xN9nKFSJM3Gb2m0p05aRncjgFF+jxM5XfvKkUrzW0a6FYOY/h/r2r1wyQI7OTBPTiTH/GxuwgA==",
"requires": {
"@babel/runtime": "^7.1.2",
"@expo/vector-icons": "github:expo/vector-icons#d0fb774a001b047d223cfa5e9537220b20591efd",
"@expo/vector-icons": "github:expo/vector-icons#expo-font-fix",
"@expo/websql": "^1.0.1",
"@types/fbemitter": "^2.0.32",
"@types/invariant": "^2.2.29",
@ -3020,7 +3020,7 @@
"qs": "^6.5.0",
"react-native-branch": "2.2.5",
"react-native-gesture-handler": "~1.0.14",
"react-native-maps": "github:expo/react-native-maps#e6f98ff7272e5d0a7fe974a41f28593af2d77bb2",
"react-native-maps": "github:expo/react-native-maps#v0.22.1-exp.0",
"react-native-reanimated": "1.0.0-alpha.11",
"react-native-screens": "1.0.0-alpha.22",
"react-native-svg": "8.0.10",
@ -3746,7 +3746,8 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true
"bundled": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -3764,11 +3765,13 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -3781,15 +3784,18 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@ -3892,7 +3898,8 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true
"bundled": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -3902,6 +3909,7 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -3914,17 +3922,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true
"bundled": true,
"optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@ -3941,6 +3952,7 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -4013,7 +4025,8 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
@ -4023,6 +4036,7 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -4098,7 +4112,8 @@
},
"safe-buffer": {
"version": "5.1.1",
"bundled": true
"bundled": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -4128,6 +4143,7 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -4145,6 +4161,7 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -4183,11 +4200,13 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true
"bundled": true,
"optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true
"bundled": true,
"optional": true
}
}
},
@ -7942,6 +7961,7 @@
}
}
},
"react-native-image-overlay": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/react-native-image-overlay/-/react-native-image-overlay-0.1.2.tgz",
@ -7950,6 +7970,7 @@
"prop-types": "^15.6.1"
}
},
"react-native-ionicons": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/react-native-ionicons/-/react-native-ionicons-4.5.5.tgz",
@ -8170,6 +8191,14 @@
"prop-types": "^15.5.10"
}
},
"react-native-switch": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/react-native-switch/-/react-native-switch-1.5.0.tgz",
"integrity": "sha1-pcjnL4fe9knRyd4CfFrifiA36kA=",
"requires": {
"prop-types": "^15.6.0"
}
},
"react-native-tab-view": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-1.3.1.tgz",
@ -9825,6 +9854,14 @@
}
}
},
"toggle-switch-react-native": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/toggle-switch-react-native/-/toggle-switch-react-native-2.0.2.tgz",
"integrity": "sha512-Q7bGEkcPgFsLIa9Io/ZSXA4LIvIxBqothaiUU6b9ay8XXQoKqsgvoPehLVYBvfpnQOmyfZ5NHOdOKiV8ewI6fQ==",
"requires": {
"prop-types": "^15.5.7"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",

View File

@ -27,7 +27,9 @@
"react-native-elements": "^1.0.0",
"react-native-fit-image": "^1.5.4",
"react-native-gesture-handler": "^1.0.15",
"react-native-image-overlay": "^0.1.2",
"react-native-ionicons": "^4.5.5",
"react-native-linear-gradient": "^2.5.3",
"react-native-loader": "^1.2.1",
@ -44,6 +46,7 @@
"react-native-qrcode-scanner": "^1.1.2",
"react-native-shadow": "^1.2.2",
"react-native-swiper": "^1.5.14",
"react-native-switch": "^1.5.0",
"react-native-timeline-feed": "^1.0.1",
"react-native-timeline-listview": "^0.2.3",
"react-native-ui-kitten": "^3.1.2",
@ -54,7 +57,8 @@
"redux": "^4.0.1",
"redux-logger": "^3.0.6",
"redux-persist": "^5.10.0",
"redux-thunk": "^2.3.0"
"redux-thunk": "^2.3.0",
"toggle-switch-react-native": "^2.0.2"
},
"devDependencies": {
"babel-jest": "23.6.0",

View File

@ -1032,6 +1032,11 @@ async-limiter@~1.0.0:
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
async@0.2.x, async@~0.2.9:
version "0.2.10"
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
async@^2.1.4, async@^2.4.0, async@^2.5.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
@ -1622,6 +1627,11 @@ color@^3.1.0:
color-convert "^1.9.1"
color-string "^1.5.2"
colors@0.6.x:
version "0.6.2"
resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc"
integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
@ -1791,6 +1801,11 @@ cssstyle@^1.0.0:
dependencies:
cssom "0.3.x"
cycle@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@ -1848,6 +1863,11 @@ deep-diff@^0.3.5:
resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=
deep-equal@*:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@ -1966,6 +1986,11 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
email-validator@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@ -2589,6 +2614,11 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
eyes@0.1.x:
version "0.1.8"
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
fancy-log@^1.3.2:
version "1.3.3"
resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
@ -3093,6 +3123,11 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
i@0.3.x:
version "0.3.6"
resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=
iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@ -3446,7 +3481,7 @@ isomorphic-fetch@^2.1.1:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
isstream@~0.1.2:
isstream@0.1.x, isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
@ -4679,7 +4714,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
mkdirp@^0.5.0, mkdirp@^0.5.1:
mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@ -4724,6 +4759,11 @@ mute-stream@0.0.7:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
nan@^2.9.2:
version "2.12.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
@ -4751,6 +4791,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
ncp@0.4.x:
version "0.4.2"
resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574"
integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=
needle@^2.2.1:
version "2.2.4"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
@ -5220,6 +5265,16 @@ pkg-up@^2.0.0:
dependencies:
find-up "^2.1.0"
pkginfo@0.3.x:
version "0.3.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
pkginfo@0.x.x:
version "0.4.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=
plist@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b"
@ -5309,6 +5364,17 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
prompt@^0.2.14:
version "0.2.14"
resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc"
integrity sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=
dependencies:
pkginfo "0.x.x"
read "1.0.x"
revalidator "0.1.x"
utile "0.2.x"
winston "0.8.x"
prompts@^0.1.9:
version "0.1.14"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
@ -5317,7 +5383,7 @@ prompts@^0.1.9:
kleur "^2.0.1"
sisteransi "^0.1.1"
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@ -5445,6 +5511,13 @@ react-native-app-intro-slider@^1.0.1:
resolved "https://registry.yarnpkg.com/react-native-app-intro-slider/-/react-native-app-intro-slider-1.0.1.tgz#712bf3dc1d66b3432bf4092971db4dfc01b916bd"
integrity sha512-5Gzg5FG2uP/RHkSDFB5+2df4vQ2FpyUJ5PGYd23lLEISsEOJe0Zredh1hHMJj+fB5D9B7ZoL0IlR+SNn8iFxHg==
react-native-awesome-alerts@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/react-native-awesome-alerts/-/react-native-awesome-alerts-1.2.0.tgz#a19b105d5133e92712d865795d532cd3f1e4de2d"
integrity sha512-ouxDGJ/porNkuaeqpgxIJA4jAPqHC9bJIsxLA21NA6eZhnEhbqWOprjsNqwI0/7bJxXm9baTzXESCMzwAy3eZw==
dependencies:
prop-types "^15.5.10"
react-native-branch@2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/react-native-branch/-/react-native-branch-2.2.5.tgz#4074dd63b4973e6397d9ce50e97b57c77a518e9d"
@ -5457,6 +5530,23 @@ react-native-camera@^1.9.2:
dependencies:
prop-types "^15.6.2"
react-native-check-box@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/react-native-check-box/-/react-native-check-box-2.1.7.tgz#f349d3505a13c15d19949ec4cec40c7adc4f3626"
integrity sha512-dPVOoz4jKs2je2HSHp7+XJXNyZFq8Kij7IHutigrQKzB550Dko6ZAQu/1mG1FzdUMFxxkZ2nX59KmbR0Co0T8Q==
dependencies:
prop-types "^15.5.7"
react-native-cli@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/react-native-cli/-/react-native-cli-2.0.1.tgz#f2cd3c7aa1b83828cdfba630e2dfd817df766d54"
integrity sha1-8s08eqG4OCjN+6Yw4t/YF992bVQ=
dependencies:
chalk "^1.1.1"
minimist "^1.2.0"
prompt "^0.2.14"
semver "^5.0.3"
react-native-confirmation-code-input@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/react-native-confirmation-code-input/-/react-native-confirmation-code-input-1.0.4.tgz#f5c2cced66f26b61050fea8bfd17473af1ad5ff9"
@ -5465,6 +5555,11 @@ react-native-confirmation-code-input@^1.0.4:
lodash "^4.17.4"
prop-types "^15.5.10"
react-native-device-info@^0.26.4:
version "0.26.5"
resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-0.26.5.tgz#7c63f047894e4cf2d4d9bfa1832444fb37e53569"
integrity sha512-Z3/Ue8A0VPtchT/NLykA+sKuOSE6FPNGQMKFqLea+urvYimmzfs1hAVbJ3my+ijnJXpuebu5c4xbYEqaRhuV6w==
react-native-elements@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/react-native-elements/-/react-native-elements-1.0.0.tgz#95bc194f61ec4658d8dbd977524f8c4fd3ada136"
@ -5501,6 +5596,7 @@ react-native-image-overlay@^0.1.2:
dependencies:
prop-types "^15.6.1"
react-native-ionicons@^4.5.5:
version "4.5.5"
resolved "https://registry.yarnpkg.com/react-native-ionicons/-/react-native-ionicons-4.5.5.tgz#4657ce742e39f0443b0960f20b946269fa0b90b5"
@ -5516,15 +5612,66 @@ react-native-loader@^1.2.1:
resolved "https://registry.yarnpkg.com/react-native-loader/-/react-native-loader-1.2.1.tgz#e08589a89cfcd076595b9301c1d618f54da73329"
integrity sha1-4IWJqJz80HZZW5MBwdYY9U2nMyk=
"react-native-maps@github:expo/react-native-maps#v0.22.1-exp.0":
react-native-loading-spinner-overlay@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/react-native-loading-spinner-overlay/-/react-native-loading-spinner-overlay-1.0.1.tgz#07f85a072b6f7d05b8749668cd626df4cc330347"
integrity sha512-njZZWs+cgyq6Ni7tkYEowMmuAuHVljuH4CqTWA0plNOfSzZhEcrW209y7WcgHjRWz0RvvEYF5oWGT8DWtTq8bA==
dependencies:
prop-types "^15.6.2"
react-native-maps@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/react-native-maps/-/react-native-maps-0.23.0.tgz#edbfdcad0e42190627eb1c8067eaba5965c8f81e"
integrity sha512-qxOIQGsDtQXQlSJdXMW1wg8pvLaVYdbiIolB7tZTTgTGgIA/hDxXwZbQZ08c4KDD6/VTk8krfd1APaHkqvh6og==
react-native-maps@expo/react-native-maps#v0.22.1-exp.0:
version "0.22.1"
resolved "https://codeload.github.com/expo/react-native-maps/tar.gz/e6f98ff7272e5d0a7fe974a41f28593af2d77bb2"
react-native-material-buttons@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/react-native-material-buttons/-/react-native-material-buttons-0.5.0.tgz#ab2b3e3fc3f500ca713f51e9d75978aff602152a"
integrity sha1-qys+P8P1AMpxP1Hp11l4r/YCFSo=
dependencies:
prop-types "^15.5.9"
react-native-material-ripple "^0.7.0"
react-native-material-dropdown@^0.11.1:
version "0.11.1"
resolved "https://registry.yarnpkg.com/react-native-material-dropdown/-/react-native-material-dropdown-0.11.1.tgz#c0fe434a8e617941ef910ba44d2f07c8f37584fe"
integrity sha1-wP5DSo5heUHvkQukTS8HyPN1hP4=
dependencies:
prop-types "^15.5.9"
react-native-material-buttons "^0.5.0"
react-native-material-ripple "^0.8.0"
react-native-material-textfield "^0.12.0"
react-native-material-ripple@^0.7.0:
version "0.7.5"
resolved "https://registry.yarnpkg.com/react-native-material-ripple/-/react-native-material-ripple-0.7.5.tgz#e2af5110680532f14aea3c3a438247be2ffef659"
integrity sha1-4q9REGgFMvFK6jw6Q4JHvi/+9lk=
dependencies:
prop-types "^15.5.10"
react-native-material-ripple@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/react-native-material-ripple/-/react-native-material-ripple-0.8.0.tgz#b8c24e6fdea2af2a21e8468b1f40b35483019e2f"
integrity sha1-uMJOb96iryoh6EaLH0CzVIMBni8=
dependencies:
prop-types "^15.5.10"
react-native-material-shadows@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/react-native-material-shadows/-/react-native-material-shadows-0.0.2.tgz#024a50b097423325c6e51f93298c4ab1b226e7f5"
integrity sha512-igZWUvc9qCHk6vN0sR4bktBixrSHMwmy8n/sNQC9EqxoOcp0ChWF82hujPp9XqbVii7ZX0E3FGiYCWFtGfPHVA==
react-native-material-textfield@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/react-native-material-textfield/-/react-native-material-textfield-0.12.0.tgz#3fba19d76ab89f67052c81e082152fc243d82a3f"
integrity sha1-P7oZ12q4n2cFLIHgghUvwkPYKj8=
dependencies:
prop-types "^15.5.9"
react-native-modal@^7.0.2:
version "7.0.2"
resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-7.0.2.tgz#6048217807e03cd585204dace2e1ca1726c0b647"
@ -5533,6 +5680,11 @@ react-native-modal@^7.0.2:
prop-types "^15.6.1"
react-native-animatable "^1.2.4"
react-native-network-info@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/react-native-network-info/-/react-native-network-info-4.0.1.tgz#e0242cfec0d9c0e1c6c32b8df596bb4c3223a5a3"
integrity sha512-ZeSkeBL/fHsFR6sAOVHMd4oMknCwsbEeL+Zewec1/3ielg8k9YcddK3wymXS7kvwV0mTB2ji4X5tI0b7XY0sDA==
react-native-offline@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/react-native-offline/-/react-native-offline-4.3.0.tgz#6877e4a4b961e230e0a198bce2d0611ca8af9d89"
@ -5548,6 +5700,13 @@ react-native-permissions@^1.1.1:
resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-1.1.1.tgz#4876004681ff8556454613d85249b01baff9b35b"
integrity sha512-t0Ujm177bagjUOSzhpmkSz+LqFW04HnY9TeZFavDCmV521fQvFz82aD+POXqWsAdsJVOK3umJYBNNqCjC3g0hQ==
react-native-progress-bar-animated@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/react-native-progress-bar-animated/-/react-native-progress-bar-animated-1.0.6.tgz#18de003ababb8222c84299ef2f20d0eab549dc19"
integrity sha512-UPAAwxtBVV+sPwhgVd78SA7QybPshV5CydaV0GJyM+eZ89ikkZQSasAUAgIQwVVCW1Tj6XNrgizimXM9JdczeA==
dependencies:
prop-types "^15.6.0"
react-native-progress@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/react-native-progress/-/react-native-progress-3.5.0.tgz#d1ccc7f96dc17c609aedb43b2e6695d67deae0ec"
@ -5626,6 +5785,13 @@ react-native-swiper@^1.5.14:
dependencies:
prop-types "^15.5.10"
react-native-switch@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/react-native-switch/-/react-native-switch-1.5.0.tgz#a5c8e72f87def649d1c9de027c5ae27e2037ea40"
integrity sha1-pcjnL4fe9knRyd4CfFrifiA36kA=
dependencies:
prop-types "^15.6.0"
react-native-tab-view@^1.0.0, react-native-tab-view@^1.2.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.3.2.tgz#c4e43a538dcacce151938745cea09176beeccbc3"
@ -5796,7 +5962,7 @@ react-test-renderer@16.6.3:
react-is "^16.6.3"
scheduler "^0.11.2"
react-timer-mixin@^0.13.2:
react-timer-mixin@^0.13.2, react-timer-mixin@^0.13.4:
version "0.13.4"
resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3"
integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==
@ -5864,6 +6030,13 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2"
path-type "^2.0.0"
read@1.0.x:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
dependencies:
mute-stream "~0.0.4"
readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
@ -6112,7 +6285,12 @@ ret@~0.1.10:
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
rimraf@^2.5.4, rimraf@^2.6.1:
revalidator@0.1.x:
version "0.1.8"
resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs=
rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@ -6474,6 +6652,11 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
stack-trace@0.0.x:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
stack-utils@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
@ -6726,6 +6909,13 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
toggle-switch-react-native@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/toggle-switch-react-native/-/toggle-switch-react-native-2.0.2.tgz#3979bb41343a8bbc45735246d138a93e3d0917a1"
integrity sha512-Q7bGEkcPgFsLIa9Io/ZSXA4LIvIxBqothaiUU6b9ay8XXQoKqsgvoPehLVYBvfpnQOmyfZ5NHOdOKiV8ewI6fQ==
dependencies:
prop-types "^15.5.7"
tough-cookie@^2.3.3, tough-cookie@^2.3.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@ -6904,6 +7094,18 @@ util.promisify@^1.0.0:
define-properties "^1.1.2"
object.getownpropertydescriptors "^2.0.3"
utile@0.2.x:
version "0.2.1"
resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7"
integrity sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=
dependencies:
async "~0.2.9"
deep-equal "*"
i "0.3.x"
mkdirp "0.x.x"
ncp "0.4.x"
rimraf "2.x.x"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
@ -7032,6 +7234,19 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.2 || 2"
winston@0.8.x:
version "0.8.3"
resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0"
integrity sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=
dependencies:
async "0.2.x"
colors "0.6.x"
cycle "1.0.x"
eyes "0.1.x"
isstream "0.1.x"
pkginfo "0.3.x"
stack-trace "0.0.x"
wordwrap@^1.0.0, wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"

0
App/{
View File

BIN
api/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -25,7 +25,7 @@ namespace api.Controllers
public class AuthController : ControllerBase
{
private readonly DataContext context;
private readonly IConfiguration config;
public UserManager<User> _userManager { get; }
public SignInManager<User> _signInManager { get; }
@ -34,7 +34,7 @@ namespace api.Controllers
private readonly RoleManager<Role> _roleManager;
private readonly System.Net.Http.IHttpClientFactory clientFactory;
public AuthController(IConfiguration config, UserManager<User> UserManager, SignInManager<User> SignInManager, IMapper mapper, RoleManager<Role> roleManager, IUsersRepository repo, System.Net.Http.IHttpClientFactory clientFactory)
public AuthController(DataContext context,IConfiguration config, UserManager<User> UserManager, SignInManager<User> SignInManager, IMapper mapper, RoleManager<Role> roleManager, IUsersRepository repo, System.Net.Http.IHttpClientFactory clientFactory)
{
_mapper = mapper;
_roleManager = roleManager;
@ -43,6 +43,7 @@ namespace api.Controllers
this.config = config;
_userManager = UserManager;
_signInManager = SignInManager;
this.context = context;
}
@ -86,25 +87,32 @@ namespace api.Controllers
}
[HttpPost("loginQR")]
public async Task<IActionResult> loginQr(UserForLoginDto userLoginDTO){
var token= "_A6q1cVGa12QutCrYCsYETfz9nPspnbcnPqjD-87kDaYPr99ArEfpdRTbkEzA4p-WEJzPFQhsMX7nG5BmUm0E6RTju8vQHnaTjGd80NIqUCr-jXefUtGwyl6I00fGD4sN6psW714JnCFuZRbtZbIXsdIRKmD3b8YUpPo2lvYP8SzjoEgACyabj13T3CLpHF43PI8Dvny6ylW6j0ka5qGNvw5MHVvYFURUPiTA7hlxoyQ35eOqHE8-eIiLNSTUJW7q-o8CxIGqGWSkltKPxbrY-Xo5iYagUucesqmj64VxYs";
public async Task<IActionResult> loginQr(loginQr a){
var u = await _userManager.FindByNameAsync(a.QRcode);
using (var client = new HttpClient())
{
try{
var url = "http://enei2019.uingress.com/internal/api/Attendee/Detail";
var url = "https://tickets.enei.pt/internal/api/Attendee/Detail";
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + a.token);
var response = await client.GetStringAsync(url);
Console.WriteLine(response);
// Console.WriteLine(response);
//var resource = JObject.Parse(response);
return Ok(response);
var appUser = await _userManager.Users.FirstOrDefaultAsync(SU => SU.NormalizedUserName == a.QRcode.ToUpper());
return Ok(new
{
token = GenerateJwtToken(appUser).Result
});
}catch(Exception e){
@ -116,6 +124,7 @@ namespace api.Controllers
}
return Unauthorized();
}
@ -144,7 +153,7 @@ namespace api.Controllers
{
Subject = new ClaimsIdentity(claims),
//data de expiração (atual + 24 horas)
Expires = DateTime.Now.AddDays(1),
Expires = DateTime.Now.AddDays(30),
//passa as signing credentials definidas em cima
SigningCredentials = creds

44
api/Controllers/CromosController.cs Normal file → Executable file
View File

@ -26,31 +26,51 @@ namespace api.Controllers
this.context = context;
_mapper = mapper;
}
// GET api/cromos/QR
// GET cromos do user QR
[HttpGet("{QR}")]
public async Task<List<Cromos>> GetCromos(string QR)
public async Task<IActionResult> GetCromos(string QR)
{
var usr = await context.Users.FirstOrDefaultAsync(u=>u.QRcode == QR);
int soma = 0;
var usr = await context.Users.FirstOrDefaultAsync(u => u.QRcode == QR);
string[] usrCromos = usr.cromos.Substring(1).Split(",");
Console.WriteLine(usrCromos[0]);
var allCromos = await context.Cromos.ToListAsync();
List<Cromos> rList = new List<Cromos>();
allCromos.ForEach(delegate(Cromos c){
for(int i=0;i<usrCromos.Length;i++){
if(Int32.Parse(usrCromos[i])==c.Id){
Cromos toAdd = new Cromos{Id = c.Id,Nome=c.Nome,DescMostrar=c.DescUnlocked,QRCode=c.QRCode,img=c.img};
rList.Add(toAdd);
}else{ //user NAO tem o cromo
Cromos toAdd = new Cromos{Id = c.Id,Nome=c.Nome,DescMostrar=c.DescLocked,QRCode=c.QRCode,img=c.img};
allCromos.ForEach(delegate (Cromos c)
{
Boolean found = false;
for (int i = 0; i < usrCromos.Length; i++)
{
if (Int32.Parse(usrCromos[i]) == c.Id)
{
soma += c.pontos;
Cromos toAdd = new Cromos { Id = c.Id, Nome = c.Nome, DescMostrar = c.DescUnlocked, QRCode = c.QRCode, img = c.img, unlocked = true, websiteCromo = c.websiteCromo, pontos = c.pontos, logo = c.logo };
rList.Add(toAdd);
found = true;
}
}
if (!found)
{
Cromos toAdd = new Cromos { Id = c.Id, Nome = c.Nome, DescMostrar = c.DescLocked, QRCode = c.QRCode, img = c.img, unlocked = false, websiteCromo = c.websiteCromo, pontos = c.pontos };
rList.Add(toAdd);
}
});
return rList;
cromosToReturn a = new cromosToReturn();
a.cromos = rList;
a.pontuacao = soma;
return Ok(a);
}
}

0
api/Controllers/EventLocsController.cs Normal file → Executable file
View File

0
api/Controllers/EventLocsVisitedController.cs Normal file → Executable file
View File

1
api/Controllers/EventsController.cs Normal file → Executable file
View File

@ -31,6 +31,7 @@ namespace api.Controllers
// GET api/events
// GET all events
[AllowAnonymous]
[HttpGet]
public async Task<IActionResult> GetEvents()
{

6
api/Controllers/ScanController.cs Normal file → Executable file
View File

@ -30,7 +30,7 @@ namespace api.Controllers
// PSOT api/scan
// POST scan de QR code
[HttpPost]
public async Task<ScanReturn> doScan(QRToScan ScanData)
public async Task<IActionResult> doScan(QRToScan ScanData)
{
User usr = await context.Users.FirstOrDefaultAsync(b=>b.QRcode == ScanData.UserQR);
var allUsers = await context.Users.ToListAsync();
@ -45,7 +45,7 @@ namespace api.Controllers
_mapper.Map(userAProcurar,ru);
toReturn.user = ru;
toReturn.tipo=1;
return toReturn;
return Ok(toReturn);
}else{
allCromos.ForEach(delegate(Cromos c){
if(c.QRCode == ScanData.ScanQR){
@ -58,7 +58,7 @@ namespace api.Controllers
}
});
return toReturn;
return Ok(toReturn);
}
//return toReturn;

300
api/Controllers/TeamsController.cs Normal file → Executable file
View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using api.Data;
using api.Dtos;
@ -24,7 +25,7 @@ namespace api.Controllers
private readonly IMapper _mapper;
private readonly RoleManager<Role> _roleManager;
private readonly UserManager<User> _userManager;
public TeamsController(DataContext context,ITeamsRepository repo, IMapper mapper,RoleManager<Role> roleManager,UserManager<User> UserManager)
public TeamsController(DataContext context, ITeamsRepository repo, IMapper mapper, RoleManager<Role> roleManager, UserManager<User> UserManager)
{
this.context = context;
_mapper = mapper;
@ -32,26 +33,27 @@ namespace api.Controllers
_userManager = UserManager;
_repo = repo;
}
// GET api/teams
// GET all teams
[HttpGet]
public async Task<List<TeamToReturn>> GetTeams()
{
List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeams = new List<TeamToReturn>();
List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeams = new List<TeamToReturn>();
for(var i = 0; i < allTeams.Count;i++){
TeamToReturn tR = new TeamToReturn();
_mapper.Map(allTeams[i],tR);
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR);
UserForListDto uT = new UserForListDto();
_mapper.Map(usr,uT);
tR.Cap = uT;
rTeams.Add(tR);
}
for (var i = 0; i < allTeams.Count; i++)
{
TeamToReturn tR = new TeamToReturn();
_mapper.Map(allTeams[i], tR);
var usr = await context.Users.FirstOrDefaultAsync(a => a.QRcode == allTeams[i].CapQR);
UserForListDto uT = new UserForListDto();
_mapper.Map(usr, uT);
tR.Cap = uT;
rTeams.Add(tR);
}
return rTeams;
return rTeams;
}
// GET api/teams/e/[id]
@ -59,44 +61,84 @@ namespace api.Controllers
[HttpGet("e/{id}")]
public async Task<List<TeamToReturn>> GetTeamsEvent(int id)
{
List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeam = new List<TeamToReturn>();
TeamToReturn tR = new TeamToReturn();
List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeam = new List<TeamToReturn>();
TeamToReturn tR = new TeamToReturn();
for(var i = 0; i < allTeams.Count;i++){
if(allTeams[i].EventId == id){
_mapper.Map(allTeams[i],tR);
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR);
UserForListDto uT = new UserForListDto();
_mapper.Map(usr,uT);
tR.Cap = uT;
rTeam.Add(tR);
}
}
return rTeam;
for (var i = 0; i < allTeams.Count; i++)
{
if (allTeams[i].EventId == id)
{
_mapper.Map(allTeams[i], tR);
var usr = await context.Users.FirstOrDefaultAsync(a => a.QRcode == allTeams[i].CapQR);
UserForListDto uT = new UserForListDto();
_mapper.Map(usr, uT);
tR.Cap = uT;
rTeam.Add(tR);
}
}
return rTeam;
}
// GET api/teams/u/[id]
// GET all teams for user id
[HttpGet("u/{QR}")]
public async Task<TeamToReturn> GetTeamsUser(String QR)
public async Task<IActionResult> GetTeamsUser(String QR)
{
var rUsr = await context.Users.Include(b=>b.team).FirstOrDefaultAsync(a=>a.QRcode == QR);
List<Team> allTeams = await context.Teams.ToListAsync();
TeamToReturn rTeam = new TeamToReturn();
var rUsr = await context.Users.Include(b => b.team).FirstOrDefaultAsync(a => a.QRcode == QR);
for(var i = 0; i < allTeams.Count;i++){
if(allTeams[i].Id == rUsr.team.Id){
_mapper.Map(allTeams[i],rTeam);
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR);
UserForListDto uT = new UserForListDto();
_mapper.Map(usr,uT);
rTeam.Cap = uT;
}
}
if (rUsr == null)
{
return NotFound("O utilizador não possui equipa");
}
List<Team> allTeams = await context.Teams.ToListAsync();
TeamToReturn rTeam = new TeamToReturn();
for (var i = 0; i < allTeams.Count; i++)
{
if (allTeams[i].Id == rUsr.team.Id)
{
rTeam.ativa= allTeams[i].pagamento;
_mapper.Map(allTeams[i], rTeam);
var usr = await context.Users.FirstOrDefaultAsync(a => a.QRcode == allTeams[i].CapQR);
return rTeam;
var users = await context.Users.ToListAsync();
List<UserForListDto> usersToReturn = new List<UserForListDto>();
for (var t = 0; t < users.Count; t++)
{
if (users[t].team != null && users[t].team.Id == allTeams[i].Id)
{
UserForListDto u = new UserForListDto();
_mapper.Map(users[t], u);
usersToReturn.Add(u);
}
}
UserForListDto uT = new UserForListDto();
_mapper.Map(usr, uT);
rTeam.Membros = usersToReturn;
rTeam.Cap = uT;
}
}
return Ok(rTeam);
}
// POST api/teams/add
@ -105,27 +147,31 @@ namespace api.Controllers
public async Task<IActionResult> CreateTeam(TeamForAdd TeamAddDetails)
{
User tCap = await context.Users.Include(a=>a.team).FirstOrDefaultAsync(u=>u.QRcode == TeamAddDetails.capQR);
if(tCap.team == null){
Team tAdd = new Team{EventId = TeamAddDetails.EventId, Nome = TeamAddDetails.Nome, CapQR = tCap.QRcode, NMembros = 1, Pontos = 0};
User tCap = await context.Users.Include(a => a.team).FirstOrDefaultAsync(u => u.QRcode == TeamAddDetails.capQR);
tCap.team = tAdd;
if (tCap.team == null)
{
await context.Teams.AddAsync(tAdd);
context.Users.Update(tCap);
Team tAdd = new Team { EventId = TeamAddDetails.EventId, Nome = TeamAddDetails.Nome, CapQR = tCap.QRcode, NMembros = 1, Pontos = 0 };
tCap.team = tAdd;
await context.Teams.AddAsync(tAdd);
context.Users.Update(tCap);
var result = context.SaveChanges();
if (result >= 1)
{
return StatusCode(201);
}
return BadRequest();
}
else
{
return BadRequest();
}
var result = context.SaveChanges();
if (result >= 1)
{
return StatusCode(201);
}
return BadRequest();
}else{
return BadRequest();
}
}
// POST api/teams/add/member
@ -134,25 +180,29 @@ namespace api.Controllers
public async Task<IActionResult> AddTeamMember(TeamAddMember MemberToAdd)
{
User newMember = await context.Users.FirstOrDefaultAsync(u=>u.QRcode == MemberToAdd.newQR);
User newMember = await context.Users.FirstOrDefaultAsync(u => u.QRcode == MemberToAdd.newQR);
Team tEdit = await context.Teams.FirstOrDefaultAsync(t=>t.Id == MemberToAdd.id);
Team tEdit = await context.Teams.FirstOrDefaultAsync(t => t.Id == MemberToAdd.id);
if(newMember.team == null){
tEdit.NMembros++;
newMember.team = tEdit;
if (newMember.team == null)
{
context.Teams.Update(tEdit);
context.Users.Update(newMember);
tEdit.NMembros++;
newMember.team = tEdit;
var result = context.SaveChanges();
context.Teams.Update(tEdit);
context.Users.Update(newMember);
return StatusCode(201);
var result = context.SaveChanges();
return StatusCode(201);
}
else
{
return StatusCode(403);
}
}else{
return StatusCode(403);
}
}
// POST api/teams/ChangeName
@ -161,20 +211,21 @@ namespace api.Controllers
public async Task<IActionResult> ChangeName(TeamChangeName NameChange)
{
Team tEdit = await context.Teams.FirstOrDefaultAsync(t=>t.Id == NameChange.TeamID);
Team tEdit = await context.Teams.FirstOrDefaultAsync(t => t.Id == NameChange.TeamID);
User cap = await context.Users.FirstOrDefaultAsync(u=>u.QRcode == NameChange.UserQR);
User cap = await context.Users.FirstOrDefaultAsync(u => u.QRcode == NameChange.UserQR);
if(cap.QRcode == tEdit.CapQR){
tEdit.Nome = NameChange.nome;
}
if (cap.QRcode == tEdit.CapQR)
{
tEdit.Nome = NameChange.nome;
}
context.Teams.Update(tEdit);
context.Teams.Update(tEdit);
var result = context.SaveChanges();
return StatusCode(201);
var result = context.SaveChanges();
return StatusCode(201);
}
// POST api/teams/delete
@ -183,19 +234,24 @@ namespace api.Controllers
public async Task<IActionResult> DeleteTeam(TeamDelete DeleteData)
{
Team tEdit = await context.Teams.FirstOrDefaultAsync(t=>t.Id == DeleteData.TeamID);
Team tEdit = await context.Teams.FirstOrDefaultAsync(t => t.Id == DeleteData.TeamID);
User cap = await context.Users.FirstOrDefaultAsync(u=>u.QRcode == DeleteData.UserQR);
User cap = await context.Users.FirstOrDefaultAsync(u => u.QRcode == DeleteData.UserQR);
if(cap.QRcode == tEdit.CapQR){
context.Teams.Remove(tEdit);
cap.team = null;
context.Users.Update(cap);
var result = context.SaveChanges();
return StatusCode(201);
}else{
return StatusCode(403);
}
if (tEdit != null && cap.QRcode == tEdit.CapQR)
{
context.Teams.Remove(tEdit);
cap.team = null;
context.Users.Update(cap);
var result = context.SaveChanges();
return StatusCode(201);
}
else
{
return StatusCode(403);
}
}
// POST api/teams/remove/member
@ -204,28 +260,48 @@ namespace api.Controllers
public async Task<IActionResult> RemoveTeamMember(TeamRemoveMEmber MemberToRemove)
{
User rmMember = await context.Users.FirstOrDefaultAsync(u=>u.QRcode == MemberToRemove.UserToRemoveQR);
Console.WriteLine(MemberToRemove.TeamID);
//obtem o user para remover
Team tEdit = await context.Teams.FirstOrDefaultAsync(t=>t.Id == MemberToRemove.TeamID);
try
{
User rmMember = await context.Users.FirstOrDefaultAsync(u => u.QRcode == MemberToRemove.UserToRemoveQR);
if(rmMember.QRcode == tEdit.CapQR){
return StatusCode(403);
}
Console.WriteLine(rmMember.QRcode);
//encontra a equipa de onde quer remover o user
Team tEdit = await context.Teams.FirstOrDefaultAsync(t => t.Id == MemberToRemove.TeamID);
Console.WriteLine(tEdit.Nome);
var id = 0;
if(rmMember.team == tEdit){
tEdit.NMembros--;
rmMember.team = null;
if (rmMember.QRcode == tEdit.CapQR)
{
return StatusCode(403);
}
context.Teams.Update(tEdit);
context.Users.Update(rmMember);
if (rmMember.team == tEdit)
{
tEdit.NMembros--;
rmMember.team = null;
var result = context.SaveChanges();
return StatusCode(201);
}else{
return StatusCode(403);
}
context.Teams.Update(tEdit);
context.Users.Update(rmMember);
var result = context.SaveChanges();
return StatusCode(201);
}
else
{
return StatusCode(403);
}
}
catch (Exception e)
{
return StatusCode(403);
}
}
}
}

View File

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
@ -22,7 +23,7 @@ namespace api.Controllers
private readonly RoleManager<Role> _roleManager;
private readonly UserManager<User> _userManager;
public UsersController(IUsersRepository repo, IMapper mapper,RoleManager<Role> roleManager,UserManager<User> UserManager)
public UsersController(IUsersRepository repo, IMapper mapper, RoleManager<Role> roleManager, UserManager<User> UserManager)
{
_mapper = mapper;
_roleManager = roleManager;
@ -30,35 +31,87 @@ namespace api.Controllers
_repo = repo;
}
[AllowAnonymous]
[HttpGet("getProfileImage/{QRcode}")]
public async Task<IActionResult> getProfileImage(string QRcode)
{
var user = _repo.getProfileImageAsync(QRcode);
if (user.Result != null)
{
return Ok(user.Result);
}
return NotFound();
}
[HttpPost("changeProfileImage")]
public async Task<IActionResult> changeProfileImage(profileImage i)
{
User a = new User();
var cenas = await _repo.changeProfileImage(i);
return Ok(cenas);
}
//
[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)
{
var user = await _repo.GetUser(id);
var userToReturn = _mapper.Map<UserForDetailedDto>(user);
return Ok(userToReturn);
}
[Authorize(Policy= "RequireAdminRole")]
[Authorize(Policy = "RequireAdminRole")]
[HttpGet]
public async Task<IActionResult> GetUsers()
{
var users = await _repo.GetUsers();
var usersToReturn = _mapper.Map<IEnumerable<UserForListDto>>(users);
return Ok(usersToReturn);
}
[Authorize(Policy = "RequireAdminRole")]
[HttpPost("updateAll")]
public async Task<IActionResult> UpdateUsers(updateUsersDTO[] req)
{
try
{
foreach (var user in req)
{
}
return Ok(req);
}
catch (Exception e)
{
}
return Ok();
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateUser(int id, UserForUpdateDto userForUpdate){
public async Task<IActionResult> UpdateUser(int id, UserForUpdateDto userForUpdate)
{
if (id != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized(); //garante que é o próprio pode aceder à sua informação
@ -66,36 +119,38 @@ namespace api.Controllers
_mapper.Map(userForUpdate, userFromRepo);
if(await _repo.SaveAll())
if (await _repo.SaveAll())
return NoContent();
throw new System.Exception($"updating user {id} failed on save");
}
[HttpPut("update/{id}")]
[Authorize(Policy= "RequireAdminRole")]
public async Task<IActionResult> UpdateUserById(int id, UserForUpdateDto userForUpdate){
[Authorize(Policy = "RequireAdminRole")]
public async Task<IActionResult> UpdateUserById(int id, UserForUpdateDto userForUpdate)
{
var userFromRepo = await _repo.GetUser(id);
_mapper.Map(userForUpdate, userFromRepo);
if(await _repo.SaveAll())
if (await _repo.SaveAll())
return NoContent();
throw new System.Exception($"updating user {id} failed on save");
}
//adiciona uma nova role à base de dados
[Authorize(Policy= "RequireAdminRole")]
[Authorize(Policy = "RequireAdminRole")]
[HttpPost("addRole")]
public IActionResult addRole( Role role) {
public IActionResult addRole(Role role)
{
_roleManager.CreateAsync(role).Wait();
return Ok();
}

0
api/Data/EventLocsRepository.cs Normal file → Executable file
View File

41
api/Data/EventLocsVisitedRepository.cs Normal file → Executable file
View File

@ -18,29 +18,50 @@ namespace api.Data
public async Task<IEnumerable<EventLocVisited>> GetEventLocsVisited()
{
var rEventLocsVisitedList = await _context.EventLocsVisited.Include(e=>e.Team).Include(e=>e.Location).ToListAsync();
var rEventLocsVisitedList = await _context.EventLocsVisited.Include(e => e.Team).Include(e => e.Location).ToListAsync();
return rEventLocsVisitedList;
}
public async Task<List<EventLocVisited>> GetEventLocsVisitedTeam(int id)
{
List<EventLocVisited> allLocs = await _context.EventLocsVisited.Include(e=>e.Team).Include(e=>e.Location).ToListAsync();
List<EventLoc> allPlaces = await _context.EventLocs.ToListAsync();
List<EventLocVisited> allLocs = await _context.EventLocsVisited.Include(e => e.Team).Include(e => e.Location).ToListAsync();
List<EventLocVisited> rList = new List<EventLocVisited>();
for(var i=0;i<allLocs.Count;i++){
if(allLocs[i].Team.Id == id){
rList.Add(allLocs[i]);
for (int j = 0; j < allPlaces.Count; j++)
{
EventLocVisited novo=new EventLocVisited();
novo.Location= allPlaces[j];
novo.complete=false;
for (var i = 0; i < allLocs.Count; i++)
{
if(allPlaces[j].Id == allLocs[i].Id){
novo.complete=true;
}
}
rList.Add(novo);
}
return rList;
}
public async Task<List<EventLocVisited>> GetEventLocsVisitedEvent(int id)
public async Task<List<EventLocVisited>> GetEventLocsVisitedEvent(int id)
{
List<EventLocVisited> allLocs = await _context.EventLocsVisited.Include(e=>e.Team).Include(e=>e.Location).ToListAsync();
List<EventLocVisited> allLocs = await _context.EventLocsVisited.Include(e => e.Team).Include(e => e.Location).ToListAsync();
List<EventLocVisited> rList = new List<EventLocVisited>();
for(var i=0;i<allLocs.Count;i++){
if(allLocs[i].Location.EventId == id){
for (var i = 0; i < allLocs.Count; i++)
{
if (allLocs[i].Location.EventId == id)
{
rList.Add(allLocs[i]);
}
}

0
api/Data/EventsRepository.cs Normal file → Executable file
View File

0
api/Data/IEventLocsRepository.cs Normal file → Executable file
View File

Some files were not shown because too many files have changed in this diff Show More