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 buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig { defaultConfig {
applicationId "com.app" applicationId "pt.enei"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1 versionCode 3
versionName "1.0" versionName "3"
ndk { ndk {
abiFilters "armeabi-v7a", "x86" abiFilters "armeabi-v7a", "x86"
} }
@ -149,6 +149,7 @@ android {
} }
dependencies { dependencies {
compile project(':react-native-maps') compile project(':react-native-maps')
compile project(':react-native-device-info') compile project(':react-native-device-info')
compile project(':react-native-material-shadows') 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 android.app.Application;
import com.facebook.react.ReactApplication; import com.facebook.react.ReactApplication;
import com.airbnb.android.react.maps.MapsPackage; import com.airbnb.android.react.maps.MapsPackage;
import com.learnium.RNDeviceInfo.RNDeviceInfo; import com.learnium.RNDeviceInfo.RNDeviceInfo;
import ui.materialshadows.RNMaterialShadowsPackage; import ui.materialshadows.RNMaterialShadowsPackage;
@ -30,6 +31,7 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() { protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList( return Arrays.<ReactPackage>asList(
new MainReactPackage(), new MainReactPackage(),
new MapsPackage(), new MapsPackage(),
new RNDeviceInfo(), new RNDeviceInfo(),
new RNMaterialShadowsPackage(), 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> <resources>
<string name="app_name">ENEI 2019</string> <string name="app_name">ENEI 19</string>
</resources> </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_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=aspire98H MYAPP_RELEASE_STORE_PASSWORD=9xbHZxMXjR
MYAPP_RELEASE_KEY_PASSWORD=aspire98H MYAPP_RELEASE_KEY_PASSWORD=9xbHZxMXjR

View File

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

View File

@ -16,7 +16,7 @@ import {
TouchableOpacity, TouchableOpacity,
TextInput, TextInput,
NetInfo, NetInfo,
Animated Animated, Linking,
} from "react-native"; } from "react-native";
import { bindActionCreators } from "redux"; import { bindActionCreators } from "redux";
@ -34,12 +34,12 @@ import Modal from "react-native-modal";
import Router from "./Router"; import Router from "./Router";
import Icon from "react-native-vector-icons/Ionicons"; 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_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width; const SCREEN_WIDTH = Dimensions.get("window").width;
import Swiper from "react-native-swiper"; import Swiper from "react-native-swiper";
import resetPassword from "./screens/resetPassword"; //import resetPassword from "./screens/resetPassword";
var TimerMixin = require("react-timer-mixin"); var TimerMixin = require("react-timer-mixin");
function handleConnectivityChange() { function handleConnectivityChange() {
@ -48,7 +48,7 @@ function handleConnectivityChange() {
class App extends Component { class App extends Component {
handleConnectivityChange = isConnected => { handleConnectivityChange = isConnected => {
this.setState({ isConnected }); this.setState({ isConnected });
@ -81,15 +81,15 @@ class App extends Component {
logged: false, logged: false,
isModalVisible: false, isModalVisible: false,
state: { text: "" }, state: { text: "" },
username: "QR code ou", username: "",
failedAttempt: false, failedAttempt: false,
push: 4, push: 4,
UI_loginScannerActive: false, UI_loginScannerActive: false,
userDetails: { username: "", password: "" }, userDetails: { username: "", password: "" },
isConnected: true, isConnected: true,
modalOpen: false, modalOpen: false,
modalResetPassword:false, modalResetPassword: false,
resetText:'' resetText: ''
}; };
} }
_print = () => { _print = () => {
@ -105,13 +105,13 @@ class App extends Component {
componentDidMount() { componentDidMount() {
//this.props.hold(); //this.props.hold();
// this.props.loginInternal();
this.setState({ isModalVisible: false }); this.setState({ isModalVisible: false });
//verifica se o utilizador tem token guardado //verifica se o utilizador tem token guardado
this.props.checkUser(this.props.token); this.props.checkUser(this.props.token);
} }
componentWillUnmount() { componentWillUnmount() {
NetInfo.isConnected.removeEventListener( NetInfo.isConnected.removeEventListener(
@ -119,14 +119,14 @@ class App extends Component {
this.handleConnectivityChange this.handleConnectivityChange
); );
} }
_toggle=()=>{ _toggle = () => {
this.setState({modalResetPassword:false}) this.setState({ modalResetPassword: false })
} }
//faz call //faz call
_reset=()=>{ _reset = () => {
//fecha modal //fecha modal
this.props.resetPassword(this.props.token,this.state.resetText), this.props.resetPassword(this.props.token, this.state.resetText),
this.setState({modalResetPassword:false}) this.setState({ modalResetPassword: false })
//faz call //faz call
} }
@ -148,14 +148,14 @@ class App extends Component {
}; };
render() { render() {
if (!this.props.logged && this.props.onHold) { if (!this.props.logged && this.props.onHold) {
return ( return (
<View style={UtilStyles.containerLoading}> <View style={UtilStyles.containerLoading}>
<ActivityIndicator size="large" color="red" /> <ActivityIndicator size="large" color="#CC1A17" />
</View> </View>
); );
} else { } else {
@ -167,22 +167,35 @@ class App extends Component {
return <Router />; return <Router />;
} }
return ( 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 <View style={styles.slide2}>
onRead={this.onSuccess}
cameraStyle={styles.cameraContainer} <Modal
/> isVisible={this.props.UI_loginScannerActive}
</View> 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>
<Modal <Modal
isVisible={this.state.modalResetPassword} isVisible={this.state.modalResetPassword}
@ -190,32 +203,33 @@ class App extends Component {
onBackButtonPress={this._toggle} onBackButtonPress={this._toggle}
animationInTiming={1100} animationInTiming={1100}
animationOutTiming={1100} animationOutTiming={1100}
> >
<View style={{ backgroundColor: "white" , padding:20,paddingBottom:0, alignItems:'center'}}>
<View> <View style={{ backgroundColor: "white", padding: 20, paddingBottom: 0, alignItems: 'center' }}>
<Text style={{textAlign:'center',fontSize:23, fontWeight:'bold', color:'#CC1A17', margin:30}}>Reset Password</Text> <View>
<Text style={{textAlign:'center', }}>Deves introduzir o email com o qual efectuaste a compra do bilhete.</Text> <Text style={{ textAlign: 'center', fontSize: 23, fontWeight: 'bold', color: '#CC1A17', margin: 30 }}>Reset Password</Text>
<TextInput <Text style={{ textAlign: 'center', }}>Deves introduzir o email com o qual efectuaste a compra do bilhete.</Text>
style={styles.resetPassword} <TextInput
onFocus={this._print} style={styles.resetPassword}
maxLength={50} onFocus={this._print}
blurOnSubmit={true} maxLength={50}
blurOnSubmit={true}
onChangeText={r => this.setState({ resetText:r })}
clearButtonMode="always" onChangeText={r => this.setState({ resetText: r })}
value={this.state.resetText} clearButtonMode="always"
clearTextOnFocus={true} value={this.state.resetText}
onSubmitEditing={Keyboard.dismiss} clearTextOnFocus={true}
placeholder="Email ou Qr code" onSubmitEditing={Keyboard.dismiss}
/> placeholder="Email ou Qr code"
/>
<Button
onPress={this._reset} <Button
title={"Enviar"} onPress={this._reset}
color={"#CC1A17"} title={"Enviar"}
></Button> color={"#CC1A17"}
<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> ></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>
</View> </View>
</Modal> </Modal>
@ -225,7 +239,7 @@ class App extends Component {
justifyContent: "center", justifyContent: "center",
alignItems: "center", alignItems: "center",
margin:20 margin: 20
}} }}
> >
<Image <Image
@ -233,79 +247,118 @@ class App extends Component {
source={require("./assets/img/logo2.png")} source={require("./assets/img/logo2.png")}
/> />
</View> </View>
<View styles={styles.loginContainer}> {!this.props.loadingLogin &&
<View style={styles.inputSection}> <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 <TextInput
style={styles.input} style={styles.passwordInput}
placeholder={this.state.username} onFocus={this._print}
onChangeText={searchString => { maxLength={10}
this.setState({ username:searchString }); blurOnSubmit={true}
}} secureTextEntry={true}
maxLength={15} onChangeText={text => this.setState({ text })}
underlineColorAndroid="transparent" clearButtonMode="always"
value={this.state.text}
clearTextOnFocus={true}
onSubmitEditing={Keyboard.dismiss}
placeholder="Password"
/> />
<TouchableOpacity onPress={this._scanQr}> {!this.props.loadingLogin &&
<View style={styles.scanQR}> <View style={{ alignItems: 'center', margin: 20 }}>
<Icon <TouchableOpacity onPress={this._tryLogin} style={{ backgroundColor: '#CC1A17', borderRadius: 3 }}>
style={styles.searchIcon} <Text style={{ color: 'white', fontSize: 20, margin: 10, width: 150, textAlign: 'center', }}>Login</Text>
name="ios-qr-scanner" </TouchableOpacity>
size={40}
color="#000"
/>
</View> </View>
</TouchableOpacity> }
</View> </View>
}{
<TextInput this.props.loadingLogin &&
style={styles.passwordInput} <View style={{ margin: 100 }}>
onFocus={this._print} <ActivityIndicator size="large" color="#CC1A17" />
maxLength={10} </View>
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>
<View style={styles.buttons}> <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} /> <Icon name="logo-facebook" size={40} />
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity style={styles.button}> <TouchableOpacity style={styles.button} onPress={() => {
<Icon name="logo-instagram" size={40} /> Linking.canOpenURL("https://www.instagram.com/eneiconf/").then(supported => {
</TouchableOpacity> if (supported) {
<TouchableOpacity style={styles.button}> Linking.openURL("https://www.instagram.com/eneiconf/");
<Icon name="md-heart" size={40} /> } else {
</TouchableOpacity>
</View> }
<View style={styles.footer}> });
<View style={styles.textRow}> }}>
<RkText rkType="primary3">Não sabes a password?</RkText> <Icon name="logo-instagram" size={40} />
<RkButton rkType="clear" onPress={this.onSignUpButtonPressed}> </TouchableOpacity>
<TouchableOpacity onPress={() => {this.setState({modalResetPassword:true})}}> <TouchableOpacity style={styles.button} onPress={() => {
<RkText style={{ color: "#CC1A17", fontWeight:'bold' }} kType="header6"> Linking.canOpenURL("https://enei.pt").then(supported => {
Reset Password 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> </RkText>
</TouchableOpacity> </TouchableOpacity>
</RkButton> </RkButton>
</View>
</View> </View>
</View> </View>
</View >
); );
} }
} }
@ -326,15 +379,15 @@ const overlayColor = "rgba(0,0,0,0.30)";
const styles = { const styles = {
cameraContainer: { cameraContainer: {
height: Dimensions.get('window').height , height: Dimensions.get('window').height,
}, },
resetPassword:{ resetPassword: {
borderColor: "#bfbdbd", borderColor: "#bfbdbd",
borderWidth: 1, borderWidth: 1,
margin:20, margin: 20,
marginTop: 60, marginTop: 60,
marginBottom: 60, marginBottom: 60,
@ -349,7 +402,7 @@ const styles = {
paddingLeft: SCREEN_WIDTH * 0.05 paddingLeft: SCREEN_WIDTH * 0.05
}, },
passwordInput: { passwordInput: {
borderColor: "#bfbdbd", borderColor: "#bfbdbd",
borderWidth: 1, borderWidth: 1,
@ -371,19 +424,19 @@ const styles = {
}, },
scanQR: { scanQR: {
//flexDirection: 'row', //flexDirection: 'row',
flex:1, flex: 1,
//paddingTop: 5, //paddingTop: 5,
backgroundColor: 10, backgroundColor: 10,
alignItems:'center', alignItems: 'center',
padding:5, padding: 5,
paddingRight:15, paddingRight: 15,
//width: 80, //width: 80,
// paddingLeft: 10, // paddingLeft: 10,
backgroundColor: "#CC1A17", backgroundColor: "#CC1A17",
borderBottomRightRadius: 3, borderBottomRightRadius: 3,
borderTopRightRadius: 3, borderTopRightRadius: 3,
// height: "100%" // height: "100%"
}, },
inputSection: { inputSection: {
flexDirection: "row", flexDirection: "row",
@ -560,7 +613,7 @@ mapStateToProps = (state, props) => {
modalOpen: state.apiReducer.modalOpen, modalOpen: state.apiReducer.modalOpen,
modalInfo: state.apiReducer.modalInfo, modalInfo: state.apiReducer.modalInfo,
type: state.apiReducer.type, 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 editCalendar from './screens/editCalendar';
import choosePath from './screens/choosePath'; import choosePath from './screens/choosePath';
import calendarDetail from './screens/calendarDetail'; 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}) => ({ const navigationOptions = ({navigation}) => ({
headerLeft: <HeaderBackButton onPress={() => navigation.goBack(null)}/>, headerLeft: <HeaderBackButton onPress={() => navigation.goBack(null)}/>,
@ -45,6 +51,7 @@ const navigationOptions = ({navigation}) => ({
}); });
const AppStack = createBottomTabNavigator( const AppStack = createBottomTabNavigator(
{ {
Calendário: { Calendário: {
@ -58,7 +65,7 @@ const AppStack = createBottomTabNavigator(
}, },
}, },
'Jogo do...': { 'Jogo': {
screen: Jogo, screen: Jogo,
navigationOptions: { navigationOptions: {
@ -107,6 +114,7 @@ const AppStack = createBottomTabNavigator(
{ {
initialRouteName: 'Home', initialRouteName: 'Home',
tabBarOptions: { tabBarOptions: {
showLabel: true, // hide labels showLabel: true, // hide labels
activeTintColor: '#CC1A17', // active icon color activeTintColor: '#CC1A17', // active icon color
@ -132,28 +140,36 @@ const Stack = createStackNavigator({
<TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}} <TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}}
onPress={() => navigation.navigate('Profile')}> onPress={() => navigation.navigate('Profile')}>
<Text>Editar dados</Text> <Text style={{marginRight:5}}>Editar dados</Text>
<IconFA name="user-edit" size={22}/> <IconFA name="user-edit" size={22}/>
</TouchableOpacity> </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') { else if (navigation.state.routes[index].routeName == 'Calendário') {
return { return {
headerTitle: 'Calendário', headerTitle: 'Calendário',
headerRight: ( headerRight: (
<View style={{flex: 1, flexDirection: 'row'}}> <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'}} <TouchableOpacity style={{marginRight: 20, flex: 1, flexDirection: 'row'}}
onPress={() => navigation.navigate('choosePath')}> onPress={() => navigation.navigate('choosePath')}>
<Text>Inscrições</Text> <Text style={{color:'#CC1A17', marginRight:5}}>Inscrições</Text>
<IconFA name="user-edit" size={22}/> <IconFA name="user-edit" size={22} color={'#CC1A17'}/>
</TouchableOpacity></View> </TouchableOpacity></View>
) )
@ -204,12 +220,16 @@ const Stack = createStackNavigator({
calendarDetail: { calendarDetail: {
screen: calendarDetail, screen: calendarDetail,
}, },
FebradaDetail: { eventDetail: {
screen: FebradaDetail, screen: eventDetail,
},
teamDetail:{
screen: teamDetail,
}, },
resetPassword:{
screen:resetPassword event:{
screen: event
} }
}); });

View File

@ -29,7 +29,8 @@ const formatObj = obj => {
return a; return a;
}; };
const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width;
class Calendar extends React.Component { class Calendar extends React.Component {
state = { state = {
index: 0, index: 0,
@ -45,9 +46,12 @@ class Calendar extends React.Component {
}; };
componentDidMount() { 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 = () => { _openDetails = () => {
@ -64,22 +68,11 @@ class Calendar extends React.Component {
<View style={styles.event}> <View style={styles.event}>
<View style={styles.titleContainer}> <View style={styles.titleContainer}>
<Text style={[styles.title]}>{item.name}</Text> <Text style={[styles.title]}>{item.name}</Text>
<Text style={{ color: "black" }}>Local: 1</Text> <Text style={{ color: "black" }}>{item.place}</Text>
</View> </View>
<View> <View>
<Text style={styles.description}>{item.description}</Text> <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>
</View> </View>
</TouchableOpacity> </TouchableOpacity>
@ -141,12 +134,14 @@ class Calendar extends React.Component {
super(); super();
} }
_refresh=()=>{ _refresh=()=>{
this.props.getEvents(this.props.user); this.props.getEvents(this.props.user,this.props.careerPath, this.props.token);
} }
render() { render() {
const ThirdRoute = () => ( const ThirdRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}> <ScrollView contentContainerStyle={styles.contentContainer}>
{this.props.events != undefined && ( {this.props.events != undefined && (
<Timeline <Timeline
@ -214,6 +209,7 @@ class Calendar extends React.Component {
</ScrollView> </ScrollView>
); );
const FirstRoute = () => ( const FirstRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}> <ScrollView contentContainerStyle={styles.contentContainer}>
{this.props.events != undefined && ( {this.props.events != undefined && (
<Timeline <Timeline
@ -242,6 +238,7 @@ class Calendar extends React.Component {
/> />
)} )}
</ScrollView> </ScrollView>
); );
const SecondRoute = () => ( const SecondRoute = () => (
<ScrollView contentContainerStyle={styles.contentContainer}> <ScrollView contentContainerStyle={styles.contentContainer}>
@ -315,12 +312,13 @@ class Calendar extends React.Component {
height: Dimensions.get("window").height height: Dimensions.get("window").height
}} }}
style={{ backgroundColor: "#F2F2F2" }} style={{ backgroundColor: "#F2F2F2" }}
indicatorStyle={{ backgroundColor: "pink" }} 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"
<Button onPress={this._refresh} title="Refresh" color="#841584" /></View>
/>
</View> </View>
); );
} }

View File

@ -1,146 +1,207 @@
import * as React from "react"; 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_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width; const SCREEN_WIDTH = Dimensions.get("window").width;
import PTRView from "react-native-pull-to-refresh";
const FirstRoute = () => ( class Eventos extends React.Component {
<View style={[styles.scene, {backgroundColor: "#ff4081"}]}/> _update = () => {
); this.props.getAllEvents(this.props.internalToken);
const SecondRoute = () => ( this.props.getEventLocsVisited(
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/> 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 = () => ( componentDidMount() {
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/> this.props.getAllEvents(this.props.internalToken);
); this.props.getEventLocsVisited(
this.props.team.id,
this.props.internalToken
);
}
const FourthRoute = () => ( render() {
<View style={[styles.scene, {backgroundColor: "#673ab7"}]}/> 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>
<ActivityIndicator size="large" color="#CC1A17" />
export default class Eventos extends React.Component { </View>
state = { )}
index: 0, <ScrollView styles={styles.scroll}>
routes: [ <FlatList
{key: "first", title: "Festarola"}, data={this.props.eventsInternal}
{key: "second", title: "Febrada"}, renderItem={({ item }) => (
{key: "third", title: "Rally"}, <View>
{key: "fourth", title: "Peddy"} <TouchableOpacity
] onPress={() => navigate("event", { info: item })}
}; >
<View style={styles.cardContainer}>
<Image
renderFebrada = (navigate) => {
return (
<View>
<TouchableOpacity onPress={() => navigate('FebradaDetail')}>
<View style={styles.cardContainer}>
<Image
style={{ style={{
flex: 1, flex: 1,
width: undefined, width: undefined,
height: undefined height: undefined
}} }}
resizeMode="contain" resizeMode="contain"
source={require('../assets/altice_logo.png')} source={{ uri: item.imagem }}
> />
</Image> <View style={styles.cardDesc}>
<Text style={styles.cardDescText}>{item.nome}</Text>
<Text style={styles.cardHours}>{item.horas}</Text>
</View>
</View>
</TouchableOpacity>
</View> </View>
</TouchableOpacity> )}
</View> />
); </ScrollView>
</View>
}; </PTRView>
);
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>
);
}
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { cardHours: {
backgroundColor: '#eee', textAlign: "center",
flex: 1, color: "white",
flexGrow: 1, margin: 10
flexDirection: 'column',
},
// width:'20%'
},
scroll: { cardDesc: {
flex: 1, //alignSelf:'center',
}, backgroundColor: "#CC1A17",
// flex:1,
flexDirection: "row"
},
cardDescText: {
fontWeight: "bold",
color: "white",
fontSize: 18,
cardContainer: { width: "45%",
flex: 1, margin: 10
flexDirection: 'row', },
padding: 10, container: {
margin: 20, backgroundColor: "white",
backgroundColor: '#fff', flex: 1,
height: SCREEN_WIDTH * (1 / 2), flexGrow: 1,
borderRadius: 5, flexDirection: "column",
//borderWidth: 2, paddingBottom: 20
}, },
scene: { scroll: {
flex: 1 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, Image,
ImageBackground, ImageBackground,
NetInfo, NetInfo,
AppState AppState,
TextInput,
Keyboard,
Switch,
Alert
} from "react-native"; } 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 { Shadow } from "react-native-shadow";
import Icon from "react-native-vector-icons/Ionicons"; import Icon from "react-native-vector-icons/Ionicons";
import { RkButton, RkTheme } from "react-native-ui-kitten"; import { RkButton, RkTheme } from "react-native-ui-kitten";
@ -62,28 +69,39 @@ class Home extends Component {
onHold: true, onHold: true,
user: { Name: "" }, user: { Name: "" },
userDetails: {}, userDetails: {},
appState: AppState.currentState appState: AppState.currentState,
addUser: false,
switch: false,
team: "",
img:
""
}; };
} }
handleConnectivityChange = () => { handleConnectivityChange = () => {
console.log("asdasdasdasdasd"); 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() { componentDidMount() {
// NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange);
// this.props.hold();
console.log("hold" + this.props.onHold); console.log("hold" + this.props.onHold);
//this.props.logoutUser();
//console.log(this.props.token);
this.props.getUserInfo(this.props.token); this.props.getUserInfo(this.props.token);
//console.log('logged:'+this.props.logged); this.props.getEvents(this.props.user, this.props.token);
this._getImage();
//console.log(th2is.props
this.props.getEvents(this.props.user);
} }
componentWillUnmount() {} componentWillUnmount() {}
@ -99,9 +117,64 @@ class Home extends Component {
} }
_update = () => { _update = () => {
this.props.getUserInfo(this.props.token); 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() { render() {
const { navigate } = this.props.navigation; const { navigate } = this.props.navigation;
@ -116,8 +189,43 @@ class Home extends Component {
if (this.props.logged) { if (this.props.logged) {
return ( return (
<PTRView onRefresh={this._update}> <PTRView onRefresh={this._update}>
<ScrollView style={{ backgroundColor: "#eeeeee" }}> <ScrollView
style={{ backgroundColor: "#eeeeee", minHeight: SCREEN_HEIGHT }}
>
<View> <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 <ImageBackground
opacity={0.9} opacity={0.9}
source={require("../assets/img/bg_3.jpg")} source={require("../assets/img/bg_3.jpg")}
@ -130,192 +238,361 @@ class Home extends Component {
> >
<View style={styles.homeHeader}> <View style={styles.homeHeader}>
<View style={styles.userImageContainer}> <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 <Image
style={styles.userImage} style={styles.userImage}
source={{ uri: "https://i.imgur.com/XXJ7LxV.jpg" }} source={require('../assets/logo_black.jpg')}
/> />}
</View> </View>
{this.props.user != undefined && ( {this.props.user != undefined && (
<Text style={styles.userText}>{this.props.user.Name}</Text> <Text style={styles.userText}>{this.props.user.Name}</Text>
)} )}
<Text style={styles.userTextSub}> {this.props.user != undefined && (
{this.props.user.Company} <Text style={styles.userTextSub}>
</Text> {this.props.user.Company}
</Text>
)}
</View> </View>
</ImageBackground> </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={styles.userStats}>
<View style={{ backgroundColor: "orange" }}> <View style={{ backgroundColor: "orange" }}>
<Text style={styles.userStatsTitle}> <Text style={styles.userStatsTitle}>
O que inclui o meu bilhete? O que inclui o meu bilhete?
</Text> </Text>
</View> </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 <View
style={{ style={{ flex: 1, flexDirection: "row", flexWrap: "wrap" }}
margin: 10,
marginTop: 20,
backgroundColor: "white",
borderRadius: 3
}}
> >
<View <View style={styles.colBilhete}>
style={{ <Text style={styles.titleBilhete}>Acesso </Text>
backgroundColor: "#CC1A17", <FlatList
flex: 1, data={this.props.acesso}
flexDirection: "row" renderItem={({ item }) => (
}} <View style={styles.boxStyle}>
> <Text>
<View style={{ width: "79%" }}> <IconFA name="check" size={18} color={"#CC1A17"} />{" "}
<Text {item}
style={{ </Text>
fontSize: 25, </View>
color: "white", )}
margin: 10, />
fontWeight: "bold", </View>
marginBottom: 0 <View style={styles.colBilhete}>
}} <Text style={styles.titleBilhete}>Alojamento</Text>
> <FlatList
Os tones data={this.props.alojamento}
</Text> renderItem={({ item }) => (
<Text <View style={styles.boxStyle}>
style={{ <Text>
color: "white", <IconFA name="check" size={18} color={"#CC1A17"} />{" "}
marginLeft: 10, {item}
marginBottom: 5 </Text>
}} </View>
> )}
5/6 elementos />
</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 <View
style={{ style={{
alignItems: "center", flex: 1,
alignContent: "center", flexDirection: "row",
margin: 20,
marginBottom: 40,
alignSelf: "center" alignSelf: "center"
}} }}
> >
<IconFA name="plus" color={"white"} size={30} /> <View style={{ width: "33%", alignSelf: "center" }}>
<Text style={{ color: "white" }}>Adicionar</Text> <Text
</View> style={{
</View> fontWeight: "bold",
fontSize: 17,
<View> textAlign: "center"
<View style={{ flex: 1 }}> }}
<View style={styles.user}> >
<View style={styles.userLogo}> ENEI Caching
<IconFA name="user" size={40} /> </Text>
</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> </View>
<Divider style={{ backgroundColor: "black" }} /> <ToggleSwitch
<View style={styles.user}> isOn={this.state.switch}
<View style={styles.userLogo}> onColor="#CC1A17"
<IconFA name="user" size={40} /> offColor="#eeeeee"
</View> labelStyle={{ color: "black", fontWeight: "900" }}
<View style={styles.userT}> size="large"
<Text style={styles.userName}>Henrique Dias</Text> onToggle={isOn =>
<Text>AFFJASDXZ</Text> this.setState({ switch: !this.state.switch })
</View> }
/>
<TouchableOpacity style={styles.userRemove}> <View style={{ width: "33%", alignSelf: "center" }}>
<IconFA name="times" color={"#CC1A17"} size={30} /> <Text
<Text>remover</Text> style={{
</TouchableOpacity> fontWeight: "bold",
</View> fontSize: 17,
<Divider style={{ backgroundColor: "black" }} /> textAlign: "center"
<View style={styles.user}> }}
<View style={styles.userLogo}> >
<IconFA name="user" size={40} /> Rally Tascas
</View> </Text>
<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> </View>
</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> </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> </View>
</ScrollView> </ScrollView>
</PTRView> </PTRView>
@ -331,24 +608,29 @@ class Home extends Component {
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
titleBilhete:{ cameraContainer: {
textAlign:'center', height: Dimensions.get("window").height
fontSize:15,
fontWeight:'bold',
marginBottom:10
}, },
colBilhete:{ titleBilhete: {
width:'33%', textAlign: "center",
padding:10 fontSize: 15,
fontWeight: "bold",
marginBottom: 10
},
colBilhete: {
width: "33%",
padding: 10,
alignContent: "center",
alignItems: "center"
}, },
boxStyle: { boxStyle: {
padding: 5,
paddingTop: 10,
padding:10, paddingBottom: 10,
borderWidth: 1, borderWidth: 1,
marginBottom: 5, marginBottom: 5,
borderColor:'#CC1A17' width: "100%",
borderColor: "#CC1A17"
}, },
userName: { userName: {
fontSize: 16, fontSize: 16,
@ -481,7 +763,9 @@ function mapStateToProps(state, props) {
bilhete: state.apiReducer.bilhete, bilhete: state.apiReducer.bilhete,
alimentacao: state.apiReducer.alimentacao, alimentacao: state.apiReducer.alimentacao,
alojamento: state.apiReducer.alojamento, 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 React, { Component } from "react";
import {Card, Divider,} from 'react-native-elements' import { Card, Divider } from "react-native-elements";
import { import {
Image, Image,
ImageBackground, ImageBackground,
Linking, Linking,
ListView, ListView,
Platform, Platform,
ScrollView, ScrollView,
StyleSheet, StyleSheet,
Text, Text,
View, View,
TouchableOpacity, TouchableOpacity,
Dimensions, Dimensions,
TextInput, TextInput,
Button, Button,
} from 'react-native' ActivityIndicator
import PropTypes from 'prop-types'; } from "react-native";
import PropTypes from "prop-types";
import {connect, Provider} from "react-redux"; import { connect, Provider } from "react-redux";
import {bindActionCreators} from "redux"; import { bindActionCreators } from "redux";
import * as Actions from "../store/actions"; import * as Actions from "../store/actions";
import {Validate} from '../Helpers/Validation' import { Validate } from "../Helpers/Validation";
import {RkTextInput} from 'react-native-ui-kitten'; 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_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width; 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 { 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 = { email: this.props.user.Email,
name: this.props.user.Name, emailError: false,
userDetails: {}, emailErrorMessage: "",
token: false,
tokenData: '',
loggedIn: false,
onHold: true,
user: {},
cenas: {Name: 'as'},
text: '',
phone: this.props.user.Mobile,
phoneError: false,
phoneErrorMessage: "",
formValid: true, address: this.props.user.Address,
addressError: false,
addressErrorMessage: "",
jobs: this.props.user.Company, city: this.props.user.City,
jobsError: false, cityError: false,
jobsErrorMessage: '', cityErrorMessage: "",
email: this.props.user.Email, oldPass: "",
emailError: false, new1: "",
emailErrorMessage: '', new2: "",
phone: this.props.user.Mobile, url: this.props.user.Url,
phoneError: false, curso: this.props.user.LastName
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();
}; };
}
_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) => { _validateData = (name, jobs, email, phone, address, city) => {
let valid = null; 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); v = Validate("jobs", jobs);
this.setState({emailError: v[0], emailErrorMessage: v[1]});
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 v = Validate("city", city);
// 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({ 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 v = Validate("city", city);
// 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]})
// 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 saveData() {
// 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 const {
this.setState({addressError: v[0], addressErrorMessage: v[1]}); 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 this.props.hold();
// 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 if (formValid) {
this.setState({cityError: v[0], cityErrorMessage: v[1]}, () => { console.log("data valid");
console.log(this.state.cityError + ' Error: ' + this.state.addressError);
if (this.state.emailError || this.state.jobsError || this.state.phoneError || this.state.addressError || this.state.cityError) this.props.updateUser(this.props.token, {
this.setState({formValid: false}); Name: this.state.name,
Company: jobs,
}); LastName: curso,
Address: address,
City: city,
}; Mobile: phone,
//Avatar: "aaa",
Url: url
saveData() { });
} else console.log("data not valid");
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");
render() {
if (this.props.onHold) {
return (
<View style={{ marginTop: SCREEN_HEIGHT * 0.4 }}>
<ActivityIndicator size="large" color="#CC1A17" />
</View>
);
} }
return (
<View style={{ flex: 1 }}>
render() { <ScrollView style={{ backgroundColor: "#eee" }}>
return ( <View style={styles.container}>
<View style={{flex: 1}}> <View style={styles.userBioRowHeader}>
<ScrollView style={{backgroundColor: '#eee'}}> <View style={styles.userBioRowTitle}>
<View style={styles.container}> <Text
<View style={styles.userBioRowHeader}> style={{ color: "#CC1A17", fontWeight: "bold", fontSize: 20 }}
<View style={styles.userBioRowTitle}> >
<Text style={{color: '#CC1A17', fontWeight: 'bold', fontSize: 20}}>Informações Pessoais</Text> Informações Pessoais
</View> </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>
</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({ const styles = StyleSheet.create({
container: {
flex: 1,
padding: 10,
margin: 10,
backgroundColor: "white",
borderRadius: 5
},
container: { userBioRowHeader: {
flex: 1, flex: 1,
padding: 10, flexDirection: "row",
margin: 20, alignItems: "center"
backgroundColor: 'white', },
borderRadius: 5,
},
userBioRowHeader: { userBioRowTitle: {
flex: 1, flex: 1,
flexDirection: 'row', flexDirection: "row",
alignItems: 'center', justifyContent: "flex-start",
}, padding: 10
},
userBioRowTitle: { userBioRow: {
flex: 1, flex: 1,
flexDirection: 'row', flexDirection: "row",
justifyContent: 'flex-start', justifyContent: "flex-start",
padding: 10, padding: 10,
}, // borderWidth: 2,
alignItems: "center"
},
userBioText: {
width: SCREEN_WIDTH * 0.4,
flex: 2
// borderWidth: 2,
},
userBioRow: { userPassText: {
flex: 1, flex: 1,
flexDirection: 'row', //alignSelf: 'flex-start',
justifyContent: 'flex-start', justifyContent: "flex-end",
padding: 10, borderWidth: 2
// 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,
},
userBioLogo: {
marginLeft: 10,
width: 80
},
bottomLogOut: {
height: 20
}
}); });
mapStateToProps = (state, props) => { mapStateToProps = (state, props) => {
return {
return { token: state.apiReducer.token,
user: state.apiReducer.user,
token: state.apiReducer.token, userDetails: state.apiReducer.userDetails,
user: state.apiReducer.user, onHold: state.apiReducer.onHold
userDetails: state.apiReducer.userDetails, };
}
}; };
function mapDispatchToProps(dispatch) { 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 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 QRCodeScanner from 'react-native-qrcode-scanner';
import {UtilStyles} from '../assets/styles' import {UtilStyles} from '../assets/styles'
import CodeInput from 'react-native-confirmation-code-input'; import CodeInput from 'react-native-confirmation-code-input';
import Modal from "react-native-modal"; 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; class Scan extends React.Component {
const SCREEN_WIDTH = Dimensions.get("window").width;
export default class Scan extends React.Component {
_toggleModal = () => _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(); this.scanner.reactivate();
} }
onSuccess = (e) => { 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, state = {
routes: [ isActive:true,
{key: 'scan', title: 'Scan', icon: ''}, isRender: true,
{key: 'history', title: 'Histórico', icon: 'history'}, reactivate:false,
{key: 'fav', title: 'Favoritos', icon: 'favorite'}, isModalVisible: false,
], code:''
}; }
componentDidMount() {
componentDidMount() {
this.props.navigation.addListener('willFocus', (route) => { this.props.navigation.addListener('willFocus', (route) => {
this.setState({isRender: true}) this.setState({ isRender: true })
}); });
this.props.navigation.addListener('willBlur', (route) => { this.props.navigation.addListener('willBlur', (route) => {
this.setState({isRender: false}) this.setState({ isRender: false })
}); });
} }
render() { 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>
)
}
return ( return (
<View style={{flex: 1}}>
<TouchableOpacity onPress={this._toggleModal}> <View style={{flex: 1}}>
<Text>Show Modal</Text>
</TouchableOpacity>
<Modal isVisible={this.state.isModalVisible}>
<View style={{flex: 1}}>
<Text>Hello!</Text> { this.state.isRender &&
<TouchableOpacity onPress={this._toggleModal}>
<Text>Hide me!</Text> <QRCodeScanner
</TouchableOpacity> showMarker
</View> ref={(node) => { this.scanner = node }}
</Modal> reactivate={false}
</View>
); onRead={this.onSuccess.bind(this)}
}
showMarker={true}
cameraStyle={{ height: SCREEN_HEIGHT }}
fadeIn={true}
/>
}
</View>
)}
}
} }
RkTheme.setType('RkButton', 'dark', { RkTheme.setType('RkButton', 'dark', {
container: { container: {
paddingTop: 10, paddingTop:10,
backgroundColor: 'gray', backgroundColor: 'gray',
borderRadius: 90, borderRadius: 90,
} }
}); });
const rectDimensions = SCREEN_WIDTH * 0.85; // this is equivalent to 255 from a 393 device width 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 overlayColor = 'rgba(0,0,0,0.30)';
const styles = { const styles = {
recover: { recover:{
paddingTop: 10, paddingTop:10,
color: "red", color: "red",
paddingBottom: 10 paddingBottom:10
}, },
manual: {}, manual:{
logo: { },
logo:{
height: SCREEN_HEIGHT * 0.35, height:SCREEN_HEIGHT*0.35,
width: SCREEN_WIDTH, width:SCREEN_WIDTH,
backgroundColor: overlayColor, backgroundColor: overlayColor,
}, },
rectangleContainer: { rectangleContainer: {
flex: 1, flex: 1,
alignItems: "center", alignItems: "center",
justifyContent: "center", justifyContent: "center",
backgroundColor: "transparent", backgroundColor: "transparent",
}, },
rectangle: { rectangle: {
height: rectDimensions, height: rectDimensions,
width: rectDimensions, width: rectDimensions,
alignItems: "center", alignItems: "center",
@ -228,4 +162,24 @@ const styles = {
width: SCREEN_WIDTH, width: SCREEN_WIDTH,
backgroundColor: overlayColor 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, Text,
Button, Button,
TouchableOpacity, TouchableOpacity,
ImageBackground ImageBackground,
ListView,
FlatList,
ActivityIndicator,
Linking,
Platform
} from "react-native"; } from "react-native";
import moment from "moment";
import { Divider, Icon, Avatar } from "react-native-elements"; import { Divider, Icon, Avatar } from "react-native-elements";
import { TabView, TabBar, SceneMap } from "react-native-tab-view"; import { TabView, TabBar, SceneMap } from "react-native-tab-view";
import { RkButton, RkCard, RkText, RkTheme } from "react-native-ui-kitten"; import { RkButton, RkCard, RkText, RkTheme } from "react-native-ui-kitten";
@ -47,7 +53,7 @@ class calendarDetail extends React.Component {
header: ( header: (
<NavAbsolute <NavAbsolute
navigation={navigation} navigation={navigation}
// title={navigation.state.params.info.name} // title={navigation.state.params.info.name}
/> />
) )
}); });
@ -55,13 +61,11 @@ class calendarDetail extends React.Component {
state = {}; state = {};
componentDidMount() { componentDidMount() {
this.props.getEvents(this.props.user); this.props.getEvents(this.props.user, this.props.careerPath);
console.log("didMount");
console.log(this.props.events);
const { navigation } = this.props; const { navigation } = this.props;
const info = navigation.getParam("info", "error"); const info = navigation.getParam("info", "error");
console.log("putas"); this.props.getSessionDetails(this.props.token, info.Id);
console.log(info);
} }
_update = () => { _update = () => {
@ -75,202 +79,187 @@ class calendarDetail extends React.Component {
this.data = []; 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() { render() {
const { navigation } = this.props; const { navigation } = this.props;
const info = navigation.getParam("info", "error"); 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 ( return (
info != undefined &&
<View style={styles.mainViewStyle}> <View style={styles.mainViewStyle}>
<ScrollView style={styles.scroll}> <ScrollView style={styles.scroll}>
<View style={styles.container}> <View style={styles.container}>
<View style={styles.headerContainer}> <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> </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> </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> </ScrollView>
<Divider style={{ backgroundColor: "black" }} /> <Divider style={{ backgroundColor: "black" }} />
</View> </View>
@ -481,7 +470,8 @@ function mapStateToProps(state, props) {
user: state.apiReducer.user, user: state.apiReducer.user,
logged: state.apiReducer.logged, logged: state.apiReducer.logged,
events: state.apiReducer.events, 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 Separator from '../components/Separator';
import Tel from '../components/Telephone'; import Tel from '../components/Telephone';
const SCREEN_HEIGHT = Dimensions.get("window").height; const SCREEN_HEIGHT = Dimensions.get("window").height;
const SCREEN_WIDTH = Dimensions.get("window").width; const SCREEN_WIDTH = Dimensions.get("window").width;
import Icon from "react-native-vector-icons/Ionicons" import Icon from "react-native-vector-icons/Ionicons"
import Swiper from 'react-native-swiper'; import Swiper from 'react-native-swiper';
class editCalendar extends Component { class editCalendar extends Component {
static navigationOptions = ({ navigation }) => ({ static navigationOptions = ({navigation}) => ({
title: 'Editar Calendário', title: 'Editar Calendário',
headerTitleStyle : {textAlign: 'center',alignSelf:'center'}, headerTitleStyle: {textAlign: 'center', alignSelf: 'center'},
headerStyle:{ headerStyle: {
backgroundColor:'white', backgroundColor: 'white',
}, },
}); });
constructor(props) { constructor(props) {
super(props); super(props);
@ -55,89 +56,88 @@ class editCalendar extends Component {
loggedIn: false, loggedIn: false,
onHold: true, onHold: true,
user: {}, user: {},
cenas:{Name:'as'}, cenas: {Name: 'as'},
text:'', text: '',
}; };
} }
render() { render() {
return ( return (
<ScrollView> <ScrollView>
<View styles={styles.header}> <View styles={styles.header}>
<View style={styles.carreerPath}> <View style={styles.carreerPath}>
<Text style={styles.carreerPathText}>Carreer Paths</Text> <Text style={styles.carreerPathText}>Carreer Paths</Text>
</View> </View>
<View style={styles.carreerPathDescription}> <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> </View>
<TouchableOpacity style={{marginRight: 20}} onPress={() => navigation.navigate('Profile')}> <TouchableOpacity style={{marginRight: 20}} onPress={() => navigation.navigate('Profile')}>
<Text>Escolher path</Text> <Text>Escolher path</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
<View> <View>
</View> </View>
</ScrollView> </ScrollView>
) )
} }
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
header:{ header: {
flex:1, flex: 1,
height: SCREEN_HEIGHT*0.1, height: SCREEN_HEIGHT * 0.1,
backgroundColor:'red' backgroundColor: 'red'
}, },
carreerPath:{ carreerPath: {
flex:1, flex: 1,
backgroundColor:'#CC1A17', backgroundColor: '#CC1A17',
height:SCREEN_HEIGHT*0.1, height: SCREEN_HEIGHT * 0.1,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
}, },
carreerPathText:{ carreerPathText: {
fontSize:20, fontSize: 20,
fontWeight: 'bold', fontWeight: 'bold',
color:'white' color: 'white'
}, },
carreerPathDescription:{ carreerPathDescription: {
padding:10, padding: 10,
marginBottom:100 marginBottom: 100
},
wrapper: {
}, },
wrapper: {},
slide1: { slide1: {
flex: 1, flex: 1,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
backgroundColor: '#9DD6EB', backgroundColor: '#9DD6EB',
}, },
slide2: { slide2: {
flex: 1, flex: 1,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
backgroundColor: '#97CAE5', backgroundColor: '#97CAE5',
}, },
slide3: { slide3: {
flex: 1, flex: 1,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
backgroundColor: '#92BBD9', backgroundColor: '#92BBD9',
}, },
text: { text: {
color: '#fff', color: '#fff',
fontSize: 30, fontSize: 30,
fontWeight: 'bold', 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 //API BLUETREND
@ -12,7 +23,7 @@ export const GET_EVENTS='GET_EVENTS'
export const UPDATE_USER='UPDATE_USER' export const UPDATE_USER='UPDATE_USER'
export const RESET_PASSWORD='RESET_PASSWORD' export const RESET_PASSWORD='RESET_PASSWORD'
export const CHECK_AND_RENEW='CHECK_AND_RENEW' 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, waitLogin,
removeSession, removeSession,
changePassword, changePassword,
resetPassword resetPassword,
getSessionDetails,
getUserTeam,
addUserTeam,
removeUserTeam,
getAllEvents,
createTeam,
deleteTeam,
getCromos,
getEventLocsVisited,
scanQrCode,
changeTeamName
} from "./api" } from "./api"

View File

@ -18,7 +18,15 @@ import {
LOADINGLOGIN, LOADINGLOGIN,
REMOVE_SESSION, REMOVE_SESSION,
UPDATE_USER, 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 } from "../actions/actionTypes"; //Import the actions types constant we defined in our actions
import { REHYDRATE } from "redux-persist"; import { REHYDRATE } from "redux-persist";
@ -26,18 +34,19 @@ import { REHYDRATE } from "redux-persist";
let apiState = { let apiState = {
isConnected: false, isConnected: false,
logged: false, logged: false,
onHold: true, onHold: false,
user: {}, user: {},
events: [], events: [],
showAlert: true, showAlert: true,
failedAttempt: false, failedAttempt: false,
token:'',
userDetails: { userDetails: {
username: "", username: "",
password: "", password: "",
token: { token: {
expirationDateToken: 0, expirationDateToken: 0,
access_token: "", access_token: "",
refresh_token:"" refresh_token: ""
} }
}, },
calendar: {}, calendar: {},
@ -45,15 +54,21 @@ let apiState = {
sessions: {}, sessions: {},
Blocks: {}, Blocks: {},
onHoldBlocks: true, onHoldBlocks: true,
careerPath: { name: "Sem Career Path", color: "#eeeeee" }, careerPath: { name: "Sem Career Path", color: "#eeeeee" , code:''},
a: {}, a: {},
b: {}, b: {},
c: {}, c: {},
d: {}, d: {},
loadingLogin: false, loadingLogin: false,
alimentacao:[], alimentacao: [],
acesso:[], acesso: [],
alojamento:[] alojamento: [],
sessionDetail:{},
team:undefined,
internalToken:"",
eventsInternal:[],
cromos:[],
locais:[],
}; };
const apiReducer = (state = apiState, action) => { const apiReducer = (state = apiState, action) => {
@ -65,31 +80,21 @@ const apiReducer = (state = apiState, action) => {
var expirationDateTokenA = 0; var expirationDateTokenA = 0;
var access_tokenA = ""; var access_tokenA = "";
var refresh_tokenA= "puta"; var refresh_tokenA = "puta";
if (action.payload.apiReducer.token != undefined) { if (action.payload.apiReducer.token != undefined) {
if ( if (
action.payload.apiReducer.token.expirationDateToken != action.payload.apiReducer.token.expirationDateToken != undefined
undefined
) { ) {
expirationDateTokenA = expirationDateTokenA =
action.payload.apiReducer.token.expirationDateToken; action.payload.apiReducer.token.expirationDateToken;
} }
if ( if (action.payload.apiReducer.token.access_token != undefined) {
action.payload.apiReducer.token.access_token != access_tokenA = action.payload.apiReducer.token.access_token;
undefined
) {
access_tokenA =
action.payload.apiReducer.token.access_token;
} }
if ( if (action.payload.apiReducer.token.refresh_token != undefined) {
action.payload.apiReducer.token.refresh_token != refresh_tokenA = 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: { token: {
expirationDateToken: expirationDateTokenA, expirationDateToken: expirationDateTokenA,
access_token: access_tokenA, access_token: access_tokenA,
refresh_token:refresh_tokenA, refresh_token: refresh_tokenA
}, },
username: action.payload.apiReducer.userDetails.username, username: action.payload.apiReducer.userDetails.username,
password: action.payload.apiReducer.userDetails.password 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": case "CHANGE_CONNECTION_STATUS":
return Object.assign({}, state, { return Object.assign({}, state, {
isConnected: action.isConnected isConnected: action.isConnected
}); });
case SESSION_DETAIL:
state = Object.assign({}, state, {
token: action.token,
sessionDetail: action.sessionDetail
});
return state;
case UPDATE_USER: case UPDATE_USER:
state = Object.assign({}, state, { user:action.user}); state = Object.assign({}, state, { user: action.user , toke: action.token, onHold:false});
return state return state;
case LOADINGLOGIN: case LOADINGLOGIN:
state = Object.assign({}, state, { loadingLogin: true }); state = Object.assign({}, state, { loadingLogin: true });
return state;
case HOLD: case HOLD:
state = Object.assign({}, state, { onHold: true }); state = Object.assign({}, state, { onHold: true });
return state; return state;
@ -132,25 +172,32 @@ const apiReducer = (state = apiState, action) => {
//token:action.token, //token:action.token,
failedAttempt: action.failedAttempt, failedAttempt: action.failedAttempt,
user: action.user, user: action.user,
userDetails: {
token: action.token,
username: action.userDetails.username,
password: action.userDetails.password
},
loadingLogin: false, loadingLogin: false,
onHold: action.onHold, onHold: false,
token:action.token token: action.token
}); });
return state; 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, { state = Object.assign({}, state, {
logged: action.logged, logged: action.logged,
onHold: action.onHold, onHold: false,
// userDetails: u, // userDetails: u,
token:action.token token: action.token
}); });
return state; return state;
@ -159,25 +206,25 @@ const apiReducer = (state = apiState, action) => {
state = Object.assign({}, state, { state = Object.assign({}, state, {
user: {}, user: {},
userDetails: {}, userDetails: {},
token:{}, token: {},
logged: false logged: false
}); });
return state; return state;
case USER_INFO: case USER_INFO:
state = Object.assign({}, state, { state = Object.assign({}, state, {
user: action.user, user: action.user,
loggedIn: action.loggedIn, loggedIn: action.loggedIn,
onHold: action.onHold, onHold: action.onHold,
token: action.token token: action.token
}); });
return state; return state;
case GET_EVENTS: case GET_EVENTS:
console.log("aaaaaaqqquii")
console.log(action)
state = Object.assign({}, state, { state = Object.assign({}, state, {
events: action.events, events: action.events,
a: action.day1, a: action.day1,
@ -186,8 +233,7 @@ const apiReducer = (state = apiState, action) => {
d: action.day4, d: action.day4,
alimentacao: action.alimentacao, alimentacao: action.alimentacao,
alojamento: action.alojamento, alojamento: action.alojamento,
acesso:action.acesso acesso: action.acesso
}); });
return state; return state;
@ -198,7 +244,8 @@ const apiReducer = (state = apiState, action) => {
Blocks: action.Blocks, Blocks: action.Blocks,
careerPath: action.careerPath, careerPath: action.careerPath,
changingGuest: action.changingGuest, changingGuest: action.changingGuest,
user: action.user user: action.user,
token: action.token
}); });
return state; return state;
@ -220,30 +267,29 @@ const apiReducer = (state = apiState, action) => {
return state; return state;
case SIGN_SESSION: case SIGN_SESSION:
if (
if(action.sessions==undefined || action.Blocks==undefined || action.user==undefined){ action.sessions == undefined ||
action.Blocks == undefined ||
action.user == undefined
) {
state = Object.assign({}, state, { state = Object.assign({}, state, {
changingGuest: false
});
} else {
state = Object.assign({}, state, {
sessions: action.sessions,
Blocks: action.Blocks,
careerPath: action.careerPath,
changingGuest: false, 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; return state;
case SESSION_BLOCKS: case SESSION_BLOCKS:
@ -258,7 +304,7 @@ const apiReducer = (state = apiState, action) => {
var c = { var c = {
guests: action.guests guests: action.guests
}; };
state = Object.assign({}, state, { calendar: c }); state = Object.assign({}, state, { calendar: c, token: action.token });
return state; return state;
@ -267,7 +313,8 @@ const apiReducer = (state = apiState, action) => {
changingGuest: false, changingGuest: false,
sessions: action.sessions, sessions: action.sessions,
Blocks: action.Blocks, Blocks: action.Blocks,
careerPath: action.careerPath careerPath: action.careerPath,
token: action.token
}); });
return state; return state;
@ -278,15 +325,17 @@ const apiReducer = (state = apiState, action) => {
case TIMERWAIT_CHANGE: case TIMERWAIT_CHANGE:
state = Object.assign({}, state, { Blocks: true }); state = Object.assign({}, state, { Blocks: true });
return state; return state;
case GET_SESSIONS: case GET_SESSIONS:
state = Object.assign({}, state, { state = Object.assign({}, state, {
sessions: action.sessions, sessions: action.sessions,
Blocks: action.Blocks, Blocks: action.Blocks,
careerPath: action.careerPath careerPath: action.careerPath,
token: action.token
}); });
return state; return state;
default: default:
return state; 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; objectVersion = 46;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.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 */; }; 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
2DCD954D1E0B4F2C00145EB5 /* appTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appTests.m */; }; 2DCD954D1E0B4F2C00145EB5 /* appTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appTests.m */; };
2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 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 */; }; 514DB1DF2E3B452F9EF272E3 /* libRNVectorIcons-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */; };
69E1B84AE0DF486CB1B1D226 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */; }; 69E1B84AE0DF486CB1B1D226 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.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 */; }; ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
BE104176D74E47E9A369B15A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */; }; BE104176D74E47E9A369B15A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */; };
BE302B6D221B7875005626CF /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE302B6C221B7860005626CF /* libRNCamera.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 */; }; BE5EAB86221B7D5400E92E5B /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE5EAB77221B7D5400E92E5B /* Zocial.ttf */; };
BE5EAC3A221B83CF00E92E5B /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE302B75221B7C3B005626CF /* Ionicons.ttf */; }; BE5EAC3A221B83CF00E92E5B /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE302B75221B7C3B005626CF /* Ionicons.ttf */; };
BE5EAC41221B889900E92E5B /* libReactNativePermissions.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE5EAC40221B888C00E92E5B /* libReactNativePermissions.a */; }; 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 */; }; 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 */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -386,6 +387,27 @@
remoteGlobalIDString = 9D23B34F1C767B80008B4819; remoteGlobalIDString = 9D23B34F1C767B80008B4819;
remoteInfo = ReactNativePermissions; 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 */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 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; }; 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; }; 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -765,6 +787,9 @@
EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */, EB0A5A258CBE4EEFAD3C358E /* libRNVectorIcons.a */,
95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */, 95B0A42B6CD8441E904E6EB9 /* libRNVectorIcons-tvOS.a */,
C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */, C00CE8A4E3B747F9816B91CF /* libBVLinearGradient.a */,
0F42241E0235464C91B24049 /* libRNDeviceInfo.a */,
C0906CC582484A7393F9B1F6 /* libAirMaps.a */,
3C4D43A092A4408B91B32E76 /* libRNDeviceInfo-tvOS.a */,
); );
name = "Recovered References"; name = "Recovered References";
sourceTree = "<group>"; sourceTree = "<group>";
@ -795,6 +820,23 @@
name = Products; name = Products;
sourceTree = "<group>"; 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 */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -881,6 +923,7 @@
TargetAttributes = { TargetAttributes = {
00E356ED1AD99517003FC87E = { 00E356ED1AD99517003FC87E = {
CreatedOnToolsVersion = 6.2; CreatedOnToolsVersion = 6.2;
DevelopmentTeam = HLA62A6826;
TestTargetID = 13B07F861A680F5B00A75B9A; TestTargetID = 13B07F861A680F5B00A75B9A;
}; };
13B07F861A680F5B00A75B9A = { 13B07F861A680F5B00A75B9A = {
@ -888,6 +931,7 @@
}; };
2D02E47A1E0B4A5D006451C7 = { 2D02E47A1E0B4A5D006451C7 = {
CreatedOnToolsVersion = 8.2.1; CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = HLA62A6826;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
2D02E48F1E0B4A5D006451C7 = { 2D02E48F1E0B4A5D006451C7 = {
@ -902,6 +946,7 @@
developmentRegion = English; developmentRegion = English;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
English,
en, en,
Base, Base,
); );
@ -909,6 +954,10 @@
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = ""; projectDirPath = "";
projectReferences = ( projectReferences = (
{
ProductGroup = BE7C0E9E223D9A43009CAF95 /* Products */;
ProjectRef = A97F1617782E42EC83467F41 /* AirMaps.xcodeproj */;
},
{ {
ProductGroup = BE5EAC32221B835A00E92E5B /* Products */; ProductGroup = BE5EAC32221B835A00E92E5B /* Products */;
ProjectRef = 1908F5E093844AC5A143E888 /* BVLinearGradient.xcodeproj */; ProjectRef = 1908F5E093844AC5A143E888 /* BVLinearGradient.xcodeproj */;
@ -969,6 +1018,10 @@
ProductGroup = BE302B68221B7860005626CF /* Products */; ProductGroup = BE302B68221B7860005626CF /* Products */;
ProjectRef = BE302B67221B7860005626CF /* RNCamera.xcodeproj */; ProjectRef = BE302B67221B7860005626CF /* RNCamera.xcodeproj */;
}, },
{
ProductGroup = BE7C0E96223D9A42009CAF95 /* Products */;
ProjectRef = 5BA133418E6F4967BC5BC234 /* RNDeviceInfo.xcodeproj */;
},
{ {
ProductGroup = BE302B6F221B7AC7005626CF /* Products */; ProductGroup = BE302B6F221B7AC7005626CF /* Products */;
ProjectRef = BE302B6E221B7AC7005626CF /* RNGestureHandler.xcodeproj */; ProjectRef = BE302B6E221B7AC7005626CF /* RNGestureHandler.xcodeproj */;
@ -1297,6 +1350,27 @@
remoteRef = BE5EAC3F221B888C00E92E5B /* PBXContainerItemProxy */; remoteRef = BE5EAC3F221B888C00E92E5B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR; 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 */ /* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */ /* Begin PBXResourcesBuildPhase section */
@ -1446,6 +1520,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
DEVELOPMENT_TEAM = HLA62A6826;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1", "DEBUG=1",
"$(inherited)", "$(inherited)",
@ -1455,7 +1530,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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; INFOPLIST_FILE = appTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
@ -1484,12 +1559,13 @@
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = HLA62A6826;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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; INFOPLIST_FILE = appTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
@ -1525,7 +1601,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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; INFOPLIST_FILE = app/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 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-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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; INFOPLIST_FILE = app/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1576,6 +1652,7 @@
CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = HLA62A6826;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
@ -1583,7 +1660,7 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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"; INFOPLIST_FILE = "app-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@ -1619,13 +1696,14 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = HLA62A6826;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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"; INFOPLIST_FILE = "app-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 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-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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"; INFOPLIST_FILE = "app-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 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-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", "$(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"; INFOPLIST_FILE = "app-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 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"?> <?xml version="1.0" encoding="UTF-8"?>
<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"> <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> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <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"/> <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <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"/> <rect key="frame" x="20" y="439" width="441" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/> <fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </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"/> <rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/> <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
</subviews> </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> <constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/> <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"/> <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>

View File

@ -1,48 +1,57 @@
{ {
"images" : [ "images" : [
{ {
"idiom" : "iphone",
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "ios-marketing",
"size" : "1024x1024", "size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "ItunesArtwork@2x.png",
"scale" : "1x" "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"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <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> <key>CFBundleDisplayName</key>
<string>app</string> <string>ENEI 2019</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -27,11 +15,13 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0</string> <string>1.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>12</string>
<key>LSApplicationCategoryType</key>
<string></string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
@ -47,21 +37,47 @@
</dict> </dict>
</dict> </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> <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> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
<array> <array>
<string>armv7</string> <string>armv7</string>
</array> </array>
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera use</string>
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <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==", "integrity": "sha512-xo8wZ9/4F3P1xN9nKFSJM3Gb2m0p05aRncjgFF+jxM5XfvKkUrzW0a6FYOY/h/r2r1wyQI7OTBPTiTH/GxuwgA==",
"requires": { "requires": {
"@babel/runtime": "^7.1.2", "@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", "@expo/websql": "^1.0.1",
"@types/fbemitter": "^2.0.32", "@types/fbemitter": "^2.0.32",
"@types/invariant": "^2.2.29", "@types/invariant": "^2.2.29",
@ -3020,7 +3020,7 @@
"qs": "^6.5.0", "qs": "^6.5.0",
"react-native-branch": "2.2.5", "react-native-branch": "2.2.5",
"react-native-gesture-handler": "~1.0.14", "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-reanimated": "1.0.0-alpha.11",
"react-native-screens": "1.0.0-alpha.22", "react-native-screens": "1.0.0-alpha.22",
"react-native-svg": "8.0.10", "react-native-svg": "8.0.10",
@ -3746,7 +3746,8 @@
}, },
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"bundled": true "bundled": true,
"optional": true
}, },
"aproba": { "aproba": {
"version": "1.2.0", "version": "1.2.0",
@ -3764,11 +3765,13 @@
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true "bundled": true,
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -3781,15 +3784,18 @@
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true "bundled": true,
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true "bundled": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true "bundled": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -3892,7 +3898,8 @@
}, },
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true "bundled": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -3902,6 +3909,7 @@
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -3914,17 +3922,20 @@
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true "bundled": true,
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -3941,6 +3952,7 @@
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -4013,7 +4025,8 @@
}, },
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true "bundled": true,
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -4023,6 +4036,7 @@
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -4098,7 +4112,8 @@
}, },
"safe-buffer": { "safe-buffer": {
"version": "5.1.1", "version": "5.1.1",
"bundled": true "bundled": true,
"optional": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
@ -4128,6 +4143,7 @@
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@ -4145,6 +4161,7 @@
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
@ -4183,11 +4200,13 @@
}, },
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true "bundled": true,
"optional": true
}, },
"yallist": { "yallist": {
"version": "3.0.2", "version": "3.0.2",
"bundled": true "bundled": true,
"optional": true
} }
} }
}, },
@ -7942,6 +7961,7 @@
} }
} }
}, },
"react-native-image-overlay": { "react-native-image-overlay": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/react-native-image-overlay/-/react-native-image-overlay-0.1.2.tgz", "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" "prop-types": "^15.6.1"
} }
}, },
"react-native-ionicons": { "react-native-ionicons": {
"version": "4.5.5", "version": "4.5.5",
"resolved": "https://registry.npmjs.org/react-native-ionicons/-/react-native-ionicons-4.5.5.tgz", "resolved": "https://registry.npmjs.org/react-native-ionicons/-/react-native-ionicons-4.5.5.tgz",
@ -8170,6 +8191,14 @@
"prop-types": "^15.5.10" "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": { "react-native-tab-view": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-1.3.1.tgz", "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": { "tough-cookie": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "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-elements": "^1.0.0",
"react-native-fit-image": "^1.5.4", "react-native-fit-image": "^1.5.4",
"react-native-gesture-handler": "^1.0.15", "react-native-gesture-handler": "^1.0.15",
"react-native-image-overlay": "^0.1.2", "react-native-image-overlay": "^0.1.2",
"react-native-ionicons": "^4.5.5", "react-native-ionicons": "^4.5.5",
"react-native-linear-gradient": "^2.5.3", "react-native-linear-gradient": "^2.5.3",
"react-native-loader": "^1.2.1", "react-native-loader": "^1.2.1",
@ -44,6 +46,7 @@
"react-native-qrcode-scanner": "^1.1.2", "react-native-qrcode-scanner": "^1.1.2",
"react-native-shadow": "^1.2.2", "react-native-shadow": "^1.2.2",
"react-native-swiper": "^1.5.14", "react-native-swiper": "^1.5.14",
"react-native-switch": "^1.5.0",
"react-native-timeline-feed": "^1.0.1", "react-native-timeline-feed": "^1.0.1",
"react-native-timeline-listview": "^0.2.3", "react-native-timeline-listview": "^0.2.3",
"react-native-ui-kitten": "^3.1.2", "react-native-ui-kitten": "^3.1.2",
@ -54,7 +57,8 @@
"redux": "^4.0.1", "redux": "^4.0.1",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"redux-persist": "^5.10.0", "redux-persist": "^5.10.0",
"redux-thunk": "^2.3.0" "redux-thunk": "^2.3.0",
"toggle-switch-react-native": "^2.0.2"
}, },
"devDependencies": { "devDependencies": {
"babel-jest": "23.6.0", "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" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== 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: async@^2.1.4, async@^2.4.0, async@^2.5.0:
version "2.6.2" version "2.6.2"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 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-convert "^1.9.1"
color-string "^1.5.2" 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: combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.7" version "1.0.7"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
@ -1791,6 +1801,11 @@ cssstyle@^1.0.0:
dependencies: dependencies:
cssom "0.3.x" 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: dashdash@^1.12.0:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 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" resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= 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: deep-extend@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 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" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 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: emojis-list@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 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" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 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: fancy-log@^1.3.2:
version "1.3.3" version "1.3.3"
resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" 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" jsprim "^1.2.2"
sshpk "^1.7.0" 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: iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 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" node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0" whatwg-fetch ">=0.10.0"
isstream@~0.1.2: isstream@0.1.x, isstream@~0.1.2:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
@ -4679,7 +4714,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^1.0.1" 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" version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 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" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 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: nan@^2.9.2:
version "2.12.1" version "2.12.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" 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" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 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: needle@^2.2.1:
version "2.2.4" version "2.2.4"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
@ -5220,6 +5265,16 @@ pkg-up@^2.0.0:
dependencies: dependencies:
find-up "^2.1.0" 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: plist@2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b" resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b"
@ -5309,6 +5364,17 @@ promise@^7.1.1:
dependencies: dependencies:
asap "~2.0.3" 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: prompts@^0.1.9:
version "0.1.14" version "0.1.14"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
@ -5317,7 +5383,7 @@ prompts@^0.1.9:
kleur "^2.0.1" kleur "^2.0.1"
sisteransi "^0.1.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" version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 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" 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== 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: react-native-branch@2.2.5:
version "2.2.5" version "2.2.5"
resolved "https://registry.yarnpkg.com/react-native-branch/-/react-native-branch-2.2.5.tgz#4074dd63b4973e6397d9ce50e97b57c77a518e9d" 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: dependencies:
prop-types "^15.6.2" 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: react-native-confirmation-code-input@^1.0.4:
version "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" 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" lodash "^4.17.4"
prop-types "^15.5.10" 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: react-native-elements@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/react-native-elements/-/react-native-elements-1.0.0.tgz#95bc194f61ec4658d8dbd977524f8c4fd3ada136" 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: dependencies:
prop-types "^15.6.1" prop-types "^15.6.1"
react-native-ionicons@^4.5.5: react-native-ionicons@^4.5.5:
version "4.5.5" version "4.5.5"
resolved "https://registry.yarnpkg.com/react-native-ionicons/-/react-native-ionicons-4.5.5.tgz#4657ce742e39f0443b0960f20b946269fa0b90b5" 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" resolved "https://registry.yarnpkg.com/react-native-loader/-/react-native-loader-1.2.1.tgz#e08589a89cfcd076595b9301c1d618f54da73329"
integrity sha1-4IWJqJz80HZZW5MBwdYY9U2nMyk= 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" version "0.22.1"
resolved "https://codeload.github.com/expo/react-native-maps/tar.gz/e6f98ff7272e5d0a7fe974a41f28593af2d77bb2" 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: react-native-material-shadows@0.0.2:
version "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" resolved "https://registry.yarnpkg.com/react-native-material-shadows/-/react-native-material-shadows-0.0.2.tgz#024a50b097423325c6e51f93298c4ab1b226e7f5"
integrity sha512-igZWUvc9qCHk6vN0sR4bktBixrSHMwmy8n/sNQC9EqxoOcp0ChWF82hujPp9XqbVii7ZX0E3FGiYCWFtGfPHVA== 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: react-native-modal@^7.0.2:
version "7.0.2" version "7.0.2"
resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-7.0.2.tgz#6048217807e03cd585204dace2e1ca1726c0b647" 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" prop-types "^15.6.1"
react-native-animatable "^1.2.4" 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: react-native-offline@^4.3.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/react-native-offline/-/react-native-offline-4.3.0.tgz#6877e4a4b961e230e0a198bce2d0611ca8af9d89" 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" resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-1.1.1.tgz#4876004681ff8556454613d85249b01baff9b35b"
integrity sha512-t0Ujm177bagjUOSzhpmkSz+LqFW04HnY9TeZFavDCmV521fQvFz82aD+POXqWsAdsJVOK3umJYBNNqCjC3g0hQ== 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: react-native-progress@^3.5.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/react-native-progress/-/react-native-progress-3.5.0.tgz#d1ccc7f96dc17c609aedb43b2e6695d67deae0ec" 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: dependencies:
prop-types "^15.5.10" 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: react-native-tab-view@^1.0.0, react-native-tab-view@^1.2.0:
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.3.2.tgz#c4e43a538dcacce151938745cea09176beeccbc3" 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" react-is "^16.6.3"
scheduler "^0.11.2" 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" version "0.13.4"
resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" 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== integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==
@ -5864,6 +6030,13 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2" normalize-package-data "^2.3.2"
path-type "^2.0.0" 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: readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6:
version "2.3.6" version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 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" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 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" version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@ -6474,6 +6652,11 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2" safer-buffer "^2.0.2"
tweetnacl "~0.14.0" 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: stack-utils@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" 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" regex-not "^1.0.2"
safe-regex "^1.1.0" 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: tough-cookie@^2.3.3, tough-cookie@^2.3.4:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 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" define-properties "^1.1.2"
object.getownpropertydescriptors "^2.0.3" 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: utils-merge@1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
@ -7032,6 +7234,19 @@ wide-align@^1.1.0:
dependencies: dependencies:
string-width "^1.0.2 || 2" 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: wordwrap@^1.0.0, wordwrap@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 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 public class AuthController : ControllerBase
{ {
private readonly DataContext context;
private readonly IConfiguration config; private readonly IConfiguration config;
public UserManager<User> _userManager { get; } public UserManager<User> _userManager { get; }
public SignInManager<User> _signInManager { get; } public SignInManager<User> _signInManager { get; }
@ -34,7 +34,7 @@ namespace api.Controllers
private readonly RoleManager<Role> _roleManager; private readonly RoleManager<Role> _roleManager;
private readonly System.Net.Http.IHttpClientFactory clientFactory; 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; _mapper = mapper;
_roleManager = roleManager; _roleManager = roleManager;
@ -43,6 +43,7 @@ namespace api.Controllers
this.config = config; this.config = config;
_userManager = UserManager; _userManager = UserManager;
_signInManager = SignInManager; _signInManager = SignInManager;
this.context = context;
} }
@ -86,25 +87,32 @@ namespace api.Controllers
} }
[HttpPost("loginQR")] [HttpPost("loginQR")]
public async Task<IActionResult> loginQr(UserForLoginDto userLoginDTO){ public async Task<IActionResult> loginQr(loginQr a){
var token= "_A6q1cVGa12QutCrYCsYETfz9nPspnbcnPqjD-87kDaYPr99ArEfpdRTbkEzA4p-WEJzPFQhsMX7nG5BmUm0E6RTju8vQHnaTjGd80NIqUCr-jXefUtGwyl6I00fGD4sN6psW714JnCFuZRbtZbIXsdIRKmD3b8YUpPo2lvYP8SzjoEgACyabj13T3CLpHF43PI8Dvny6ylW6j0ka5qGNvw5MHVvYFURUPiTA7hlxoyQ35eOqHE8-eIiLNSTUJW7q-o8CxIGqGWSkltKPxbrY-Xo5iYagUucesqmj64VxYs"; var u = await _userManager.FindByNameAsync(a.QRcode);
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
try{ 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); var response = await client.GetStringAsync(url);
Console.WriteLine(response); // Console.WriteLine(response);
//var resource = JObject.Parse(response); //var resource = JObject.Parse(response);
var appUser = await _userManager.Users.FirstOrDefaultAsync(SU => SU.NormalizedUserName == a.QRcode.ToUpper());
return Ok(response);
return Ok(new
{
token = GenerateJwtToken(appUser).Result
});
}catch(Exception e){ }catch(Exception e){
@ -116,6 +124,7 @@ namespace api.Controllers
} }
return Unauthorized();
} }
@ -144,7 +153,7 @@ namespace api.Controllers
{ {
Subject = new ClaimsIdentity(claims), Subject = new ClaimsIdentity(claims),
//data de expiração (atual + 24 horas) //data de expiração (atual + 24 horas)
Expires = DateTime.Now.AddDays(1), Expires = DateTime.Now.AddDays(30),
//passa as signing credentials definidas em cima //passa as signing credentials definidas em cima
SigningCredentials = creds SigningCredentials = creds

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

@ -26,31 +26,51 @@ namespace api.Controllers
this.context = context; this.context = context;
_mapper = mapper; _mapper = mapper;
} }
// GET api/cromos/QR // GET api/cromos/QR
// GET cromos do user QR // GET cromos do user QR
[HttpGet("{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(","); string[] usrCromos = usr.cromos.Substring(1).Split(",");
Console.WriteLine(usrCromos[0]); Console.WriteLine(usrCromos[0]);
var allCromos = await context.Cromos.ToListAsync(); var allCromos = await context.Cromos.ToListAsync();
List<Cromos> rList = new List<Cromos>(); List<Cromos> rList = new List<Cromos>();
allCromos.ForEach(delegate(Cromos c){ allCromos.ForEach(delegate (Cromos c)
for(int i=0;i<usrCromos.Length;i++){ {
if(Int32.Parse(usrCromos[i])==c.Id){ Boolean found = false;
Cromos toAdd = new Cromos{Id = c.Id,Nome=c.Nome,DescMostrar=c.DescUnlocked,QRCode=c.QRCode,img=c.img}; for (int i = 0; i < usrCromos.Length; i++)
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};
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); 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 api/events
// GET all events // GET all events
[AllowAnonymous]
[HttpGet] [HttpGet]
public async Task<IActionResult> GetEvents() 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 // PSOT api/scan
// POST scan de QR code // POST scan de QR code
[HttpPost] [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); User usr = await context.Users.FirstOrDefaultAsync(b=>b.QRcode == ScanData.UserQR);
var allUsers = await context.Users.ToListAsync(); var allUsers = await context.Users.ToListAsync();
@ -45,7 +45,7 @@ namespace api.Controllers
_mapper.Map(userAProcurar,ru); _mapper.Map(userAProcurar,ru);
toReturn.user = ru; toReturn.user = ru;
toReturn.tipo=1; toReturn.tipo=1;
return toReturn; return Ok(toReturn);
}else{ }else{
allCromos.ForEach(delegate(Cromos c){ allCromos.ForEach(delegate(Cromos c){
if(c.QRCode == ScanData.ScanQR){ if(c.QRCode == ScanData.ScanQR){
@ -58,7 +58,7 @@ namespace api.Controllers
} }
}); });
return toReturn; return Ok(toReturn);
} }
//return toReturn; //return toReturn;

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

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using api.Data; using api.Data;
using api.Dtos; using api.Dtos;
@ -24,7 +25,7 @@ namespace api.Controllers
private readonly IMapper _mapper; private readonly IMapper _mapper;
private readonly RoleManager<Role> _roleManager; private readonly RoleManager<Role> _roleManager;
private readonly UserManager<User> _userManager; 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; this.context = context;
_mapper = mapper; _mapper = mapper;
@ -32,26 +33,27 @@ namespace api.Controllers
_userManager = UserManager; _userManager = UserManager;
_repo = repo; _repo = repo;
} }
// GET api/teams // GET api/teams
// GET all teams // GET all teams
[HttpGet] [HttpGet]
public async Task<List<TeamToReturn>> GetTeams() public async Task<List<TeamToReturn>> GetTeams()
{ {
List<Team> allTeams = await context.Teams.ToListAsync(); List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeams = new List<TeamToReturn>(); List<TeamToReturn> rTeams = new List<TeamToReturn>();
for(var i = 0; i < allTeams.Count;i++){ for (var i = 0; i < allTeams.Count; i++)
TeamToReturn tR = new TeamToReturn(); {
_mapper.Map(allTeams[i],tR); TeamToReturn tR = new TeamToReturn();
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR); _mapper.Map(allTeams[i], tR);
UserForListDto uT = new UserForListDto(); var usr = await context.Users.FirstOrDefaultAsync(a => a.QRcode == allTeams[i].CapQR);
_mapper.Map(usr,uT); UserForListDto uT = new UserForListDto();
tR.Cap = uT; _mapper.Map(usr, uT);
rTeams.Add(tR); tR.Cap = uT;
} rTeams.Add(tR);
}
return rTeams; return rTeams;
} }
// GET api/teams/e/[id] // GET api/teams/e/[id]
@ -59,44 +61,84 @@ namespace api.Controllers
[HttpGet("e/{id}")] [HttpGet("e/{id}")]
public async Task<List<TeamToReturn>> GetTeamsEvent(int id) public async Task<List<TeamToReturn>> GetTeamsEvent(int id)
{ {
List<Team> allTeams = await context.Teams.ToListAsync(); List<Team> allTeams = await context.Teams.ToListAsync();
List<TeamToReturn> rTeam = new List<TeamToReturn>(); List<TeamToReturn> rTeam = new List<TeamToReturn>();
TeamToReturn tR = new TeamToReturn(); TeamToReturn tR = new TeamToReturn();
for(var i = 0; i < allTeams.Count;i++){ for (var i = 0; i < allTeams.Count; i++)
if(allTeams[i].EventId == id){ {
_mapper.Map(allTeams[i],tR); if (allTeams[i].EventId == id)
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR); {
UserForListDto uT = new UserForListDto(); _mapper.Map(allTeams[i], tR);
_mapper.Map(usr,uT); var usr = await context.Users.FirstOrDefaultAsync(a => a.QRcode == allTeams[i].CapQR);
tR.Cap = uT; UserForListDto uT = new UserForListDto();
rTeam.Add(tR); _mapper.Map(usr, uT);
} tR.Cap = uT;
} rTeam.Add(tR);
}
return rTeam; }
return rTeam;
} }
// GET api/teams/u/[id] // GET api/teams/u/[id]
// GET all teams for user id // GET all teams for user id
[HttpGet("u/{QR}")] [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); 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();
for(var i = 0; i < allTeams.Count;i++){ if (rUsr == null)
if(allTeams[i].Id == rUsr.team.Id){ {
_mapper.Map(allTeams[i],rTeam); return NotFound("O utilizador não possui equipa");
var usr = await context.Users.FirstOrDefaultAsync(a=>a.QRcode == allTeams[i].CapQR); }
UserForListDto uT = new UserForListDto();
_mapper.Map(usr,uT); List<Team> allTeams = await context.Teams.ToListAsync();
rTeam.Cap = uT;
}
} 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 // POST api/teams/add
@ -105,27 +147,31 @@ namespace api.Controllers
public async Task<IActionResult> CreateTeam(TeamForAdd TeamAddDetails) public async Task<IActionResult> CreateTeam(TeamForAdd TeamAddDetails)
{ {
User tCap = await context.Users.Include(a=>a.team).FirstOrDefaultAsync(u=>u.QRcode == TeamAddDetails.capQR); 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};
tCap.team = tAdd; if (tCap.team == null)
{
await context.Teams.AddAsync(tAdd); Team tAdd = new Team { EventId = TeamAddDetails.EventId, Nome = TeamAddDetails.Nome, CapQR = tCap.QRcode, NMembros = 1, Pontos = 0 };
context.Users.Update(tCap);
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 // POST api/teams/add/member
@ -134,25 +180,29 @@ namespace api.Controllers
public async Task<IActionResult> AddTeamMember(TeamAddMember MemberToAdd) 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){ if (newMember.team == null)
tEdit.NMembros++; {
newMember.team = tEdit;
context.Teams.Update(tEdit); tEdit.NMembros++;
context.Users.Update(newMember); 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 // POST api/teams/ChangeName
@ -161,20 +211,21 @@ namespace api.Controllers
public async Task<IActionResult> ChangeName(TeamChangeName NameChange) 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){ if (cap.QRcode == tEdit.CapQR)
tEdit.Nome = NameChange.nome; {
} 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 // POST api/teams/delete
@ -183,19 +234,24 @@ namespace api.Controllers
public async Task<IActionResult> DeleteTeam(TeamDelete DeleteData) 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); if (tEdit != null && cap.QRcode == tEdit.CapQR)
cap.team = null; {
context.Users.Update(cap); context.Teams.Remove(tEdit);
var result = context.SaveChanges(); cap.team = null;
return StatusCode(201); context.Users.Update(cap);
}else{ var result = context.SaveChanges();
return StatusCode(403); return StatusCode(201);
} }
else
{
return StatusCode(403);
}
} }
// POST api/teams/remove/member // POST api/teams/remove/member
@ -204,28 +260,48 @@ namespace api.Controllers
public async Task<IActionResult> RemoveTeamMember(TeamRemoveMEmber MemberToRemove) 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){ Console.WriteLine(rmMember.QRcode);
return StatusCode(403);
} //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){ if (rmMember.QRcode == tEdit.CapQR)
tEdit.NMembros--; {
rmMember.team = null; return StatusCode(403);
}
context.Teams.Update(tEdit); if (rmMember.team == tEdit)
context.Users.Update(rmMember); {
tEdit.NMembros--;
rmMember.team = null;
var result = context.SaveChanges(); context.Teams.Update(tEdit);
context.Users.Update(rmMember);
return StatusCode(201);
}else{ var result = context.SaveChanges();
return StatusCode(403);
} 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.Collections.Generic;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -22,7 +23,7 @@ namespace api.Controllers
private readonly RoleManager<Role> _roleManager; private readonly RoleManager<Role> _roleManager;
private readonly UserManager<User> _userManager; 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; _mapper = mapper;
_roleManager = roleManager; _roleManager = roleManager;
@ -30,35 +31,87 @@ namespace api.Controllers
_repo = repo; _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}")] [HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id) public async Task<IActionResult> GetUser(int id)
{ {
var user = await _repo.GetUser(id); var user = await _repo.GetUser(id);
var userToReturn = _mapper.Map<UserForDetailedDto>(user); var userToReturn = _mapper.Map<UserForDetailedDto>(user);
return Ok(userToReturn); return Ok(userToReturn);
} }
[Authorize(Policy= "RequireAdminRole")] [Authorize(Policy = "RequireAdminRole")]
[HttpGet] [HttpGet]
public async Task<IActionResult> GetUsers() public async Task<IActionResult> GetUsers()
{ {
var users = await _repo.GetUsers(); var users = await _repo.GetUsers();
var usersToReturn = _mapper.Map<IEnumerable<UserForListDto>>(users); var usersToReturn = _mapper.Map<IEnumerable<UserForListDto>>(users);
return Ok(usersToReturn); 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}")] [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)) if (id != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized(); //garante que é o próprio pode aceder à sua informação return Unauthorized(); //garante que é o próprio pode aceder à sua informação
@ -66,36 +119,38 @@ namespace api.Controllers
_mapper.Map(userForUpdate, userFromRepo); _mapper.Map(userForUpdate, userFromRepo);
if(await _repo.SaveAll()) if (await _repo.SaveAll())
return NoContent(); return NoContent();
throw new System.Exception($"updating user {id} failed on save"); throw new System.Exception($"updating user {id} failed on save");
} }
[HttpPut("update/{id}")] [HttpPut("update/{id}")]
[Authorize(Policy= "RequireAdminRole")] [Authorize(Policy = "RequireAdminRole")]
public async Task<IActionResult> UpdateUserById(int id, UserForUpdateDto userForUpdate){ public async Task<IActionResult> UpdateUserById(int id, UserForUpdateDto userForUpdate)
{
var userFromRepo = await _repo.GetUser(id); var userFromRepo = await _repo.GetUser(id);
_mapper.Map(userForUpdate, userFromRepo); _mapper.Map(userForUpdate, userFromRepo);
if(await _repo.SaveAll()) if (await _repo.SaveAll())
return NoContent(); return NoContent();
throw new System.Exception($"updating user {id} failed on save"); throw new System.Exception($"updating user {id} failed on save");
} }
//adiciona uma nova role à base de dados //adiciona uma nova role à base de dados
[Authorize(Policy= "RequireAdminRole")] [Authorize(Policy = "RequireAdminRole")]
[HttpPost("addRole")] [HttpPost("addRole")]
public IActionResult addRole( Role role) { public IActionResult addRole(Role role)
{
_roleManager.CreateAsync(role).Wait(); _roleManager.CreateAsync(role).Wait();
return Ok(); 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() 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; return rEventLocsVisitedList;
} }
public async Task<List<EventLocVisited>> GetEventLocsVisitedTeam(int id) 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>(); List<EventLocVisited> rList = new List<EventLocVisited>();
for(var i=0;i<allLocs.Count;i++){
if(allLocs[i].Team.Id == id){ for (int j = 0; j < allPlaces.Count; j++)
rList.Add(allLocs[i]); {
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; 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>(); List<EventLocVisited> rList = new List<EventLocVisited>();
for(var i=0;i<allLocs.Count;i++){ for (var i = 0; i < allLocs.Count; i++)
if(allLocs[i].Location.EventId == id){ {
if (allLocs[i].Location.EventId == id)
{
rList.Add(allLocs[i]); 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