-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.js
More file actions
139 lines (126 loc) · 4.21 KB
/
App.js
File metadata and controls
139 lines (126 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import 'react-native-gesture-handler';
import React, { useEffect, useState, useMemo, useReducer } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import TabNavigator from './navigation/TabNavigator';
import * as NavigationBar from 'expo-navigation-bar';
import AuthStack from './navigation/AuthStack';
import { ActivityIndicator, View} from 'react-native';
import { AuthContext } from './context/AuthContext';
import AsyncStorage from '@react-native-async-storage/async-storage'
NavigationBar.setBehaviorAsync("overlay-swipe");
NavigationBar.setVisibilityAsync('hidden');
export default function App() {
const initialLoginState = {
isLoading: true,
userName: null,
userToken: null,
};
const loginReducer = (prevState, action) => {
switch(action.type) {
case 'RETRIEVE_TOKEN':
return {
...prevState,
userToken: action.token,
isLoading: false,
};
case 'LOGIN':
return {
...prevState,
userName: action.id,
userToken: action.token,
isLoading: false,
};
case 'LOGOUT':
return {
...prevState,
userName: null,
userToken: null,
isLoading: false,
};
case 'REGISTER':
return {
...prevState,
userName: action.id,
userToken: action.token,
isLoading: false,
};
}
}
const [loginState, dispatch] = useReducer(loginReducer, initialLoginState);
const authContext = useMemo(() => ({
signIn: async(userName, password) => {
let userToken = null;
//If the user has matched credentials, their token is set in local storage.
if( userName == 'User1' && password == 'Password'){
try{
userToken = 'temp'
await AsyncStorage.setItem('userToken', userToken);
} catch(e) {
console.log(e);
}
} else {
alert('These are not the accepted Login Details.')
}
dispatch({type:'LOGIN', id:userName, token:userToken})
},
signOut: async() => {
try{
await AsyncStorage.removeItem('userToken');
} catch(e) {
console.log(e);
}
dispatch({type:'LOGOUT'})
},
// signUp: () => {
// // setUserToken('temp');
// // setIsLoading(false);
// },
//Provides global access to the book Array by putting it in Context.
bookArray: ['9780008420383','9780140326710','9781409180074','9781784871444','9780007326792'],
addToBookArray:async (isbn) => {
//Adds a book to the book array via array destructuring
authContext.bookArray = [...authContext.bookArray, isbn];
console.log(authContext.bookArray);
},
removeFromBookArray: async(isbn) => {
//Removes an item from the array via ISBN using array destructuring and splicing.
let tempArray = authContext.bookArray;
const index = tempArray.indexOf(isbn);
tempArray.splice(index,1);
authContext.bookArray = tempArray;
},
clearBookArray: async() => {
authContext.bookArray = [];
}
}), []);
useEffect(() => {
//If there exists a token in local storage, load it into userToken.
setTimeout(async() => {
let userToken = null;
try{
userToken = await AsyncStorage.getItem('userToken', userToken);
} catch(e) {
console.log(e);
}
dispatch({type:'RETRIEVE_TOKEN', token:userToken})
}, 1000)
}, []);
if (loginState.isLoading) { //A loading screen whilst the system is verifying to see if a user's token exists locally.
return(
<View style={{flex:1, justifyContent:'center', alignItems:'center'}}>
<ActivityIndicator size="large" />
</View>
)
}
return (
// Allows authContext (Lowercase) to be the context provider for the app.
<AuthContext.Provider value={authContext}>
<NavigationContainer>
{
//Is there is a token loaded in loginState.userToken, the user can access the system (Tab Navigator), otherwise, they need to go through the Authentication stack (The login screens).
loginState.userToken == null ? <AuthStack /> : <TabNavigator />
}
</NavigationContainer>
</AuthContext.Provider>
);
}