Skip to content

Commit 2e948dd

Browse files
committed
Initial commit
1 parent 7de8d3a commit 2e948dd

File tree

12 files changed

+408
-17
lines changed

12 files changed

+408
-17
lines changed

App.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
import { StatusBar } from 'expo-status-bar';
22
import React from 'react';
3-
import { StyleSheet, Text, View } from 'react-native';
3+
import { Provider } from 'react-redux';
4+
import AppRoute from './src/navigations/navigator';
5+
import { store } from './src/redux/store';
46

57
export default function App() {
68
return (
7-
<View style={styles.container}>
8-
<Text>Open up App.js to start working on your app!</Text>
9-
<StatusBar style="auto" />
10-
</View>
9+
<>
10+
<Provider store={store}>
11+
<AppRoute />
12+
<StatusBar style="auto" />
13+
</Provider>
14+
</>
1115
);
1216
}
1317

14-
const styles = StyleSheet.create({
15-
container: {
16-
flex: 1,
17-
backgroundColor: '#fff',
18-
alignItems: 'center',
19-
justifyContent: 'center',
20-
},
21-
});
18+

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@
88
"eject": "expo eject"
99
},
1010
"dependencies": {
11+
"@react-navigation/native": "^6.0.6",
12+
"@react-navigation/native-stack": "^6.2.5",
13+
"@reduxjs/toolkit": "^1.6.2",
1114
"expo": "~43.0.2",
1215
"expo-status-bar": "~1.1.0",
1316
"react": "17.0.1",
1417
"react-dom": "17.0.1",
1518
"react-native": "0.64.3",
16-
"react-native-web": "0.17.1"
19+
"react-native-safe-area-context": "3.3.2",
20+
"react-native-screens": "~3.8.0",
21+
"react-native-web": "0.17.1",
22+
"react-redux": "^7.2.6"
1723
},
1824
"devDependencies": {
1925
"@babel/core": "^7.12.9"

src/navigations/app-navigator.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as React from 'react';
2+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
3+
import DashboardScreen from '../screens/DashboardScreen';
4+
import AccountScreen from '../screens/AccountScreen';
5+
6+
7+
const Stack = createNativeStackNavigator();
8+
9+
const AppNavigator = () => {
10+
return (
11+
<Stack.Navigator initialRouteName='Dashboard'>
12+
<Stack.Screen name="Dashboard" component={DashboardScreen} />
13+
<Stack.Screen name="Account" component={AccountScreen} />
14+
</Stack.Navigator>
15+
)
16+
}
17+
18+
export default AppNavigator

src/navigations/auth-navigator.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import * as React from 'react';
2+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
3+
import LoginScreen from '../screens/LoginScreen';
4+
import RegisterScreen from '../screens/RegisterScreen';
5+
6+
const Stack = createNativeStackNavigator();
7+
8+
const AuthNavigator = () => {
9+
return (
10+
<Stack.Navigator initialRouteName='Login'>
11+
<Stack.Screen name="Login" component={LoginScreen} />
12+
<Stack.Screen name="Register" component={RegisterScreen} />
13+
</Stack.Navigator>
14+
)
15+
}
16+
17+
export default AuthNavigator

src/navigations/navigator.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
import * as React from 'react';
3+
import { NavigationContainer } from '@react-navigation/native';
4+
import AppNavigator from './app-navigator';
5+
import AuthNavigator from './auth-navigator';
6+
import { useSelector } from 'react-redux';
7+
import { selectIsLoggedIn } from '../redux/slices/authSlice';
8+
9+
const AppRoute = () => {
10+
const isLoggedIn = useSelector(selectIsLoggedIn);
11+
return (
12+
<NavigationContainer>
13+
{/* Conditional stack navigator rendering based on login state */}
14+
15+
{
16+
isLoggedIn ? <AppNavigator /> : <AuthNavigator />
17+
}
18+
</NavigationContainer>
19+
)
20+
}
21+
22+
export default AppRoute

src/redux/slices/authSlice.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { createSlice } from "@reduxjs/toolkit"
2+
3+
4+
const initialState = {
5+
isLoggedIn: false,
6+
email: null,
7+
userName: null
8+
}
9+
10+
const authSlice = createSlice({
11+
name: 'userAuth',
12+
initialState,
13+
reducers: {
14+
setSignIn: (state, action) => {
15+
16+
state.email = action.payload.email;
17+
state.isLoggedIn = action.payload.isLoggedIn;
18+
state.userName = action.payload.userName;
19+
20+
},
21+
setSignOut: (state) => {
22+
state.email = null;
23+
state.userName = null;
24+
state.isLoggedIn = false;
25+
}
26+
}
27+
});
28+
29+
30+
export const { setSignIn, setSignOut } = authSlice.actions;
31+
32+
export const selectIsLoggedIn = (state) => state.userAuth.isLoggedIn;
33+
export const selectEmail = (state) => state.userAuth.email;
34+
export const selectUserName = (state) => state.userAuth.userName;
35+
36+
export default authSlice.reducer;

src/redux/store.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { configureStore } from '@reduxjs/toolkit'
2+
import authSlice from './slices/authSlice'
3+
4+
export const store = configureStore({
5+
reducer: {
6+
userAuth: authSlice
7+
},
8+
})

src/screens/AccountScreen.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react'
2+
import { View, Text } from 'react-native'
3+
4+
const AccountScreen = () => {
5+
return (
6+
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
7+
<Text>
8+
Wellcome to Dashboard
9+
</Text>
10+
</View>
11+
)
12+
}
13+
14+
export default AccountScreen

src/screens/DashboardScreen.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import React from 'react'
2+
import { View, Text, TouchableOpacity } from 'react-native';
3+
import { useSelector, useDispatch } from 'react-redux';
4+
import { selectIsLoggedIn, selectEmail, selectUserName, setSignOut } from '../redux/slices/authSlice';
5+
6+
7+
const DashboardScreen = () => {
8+
const dispatch = useDispatch();
9+
const username = useSelector(selectUserName);
10+
return (
11+
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF' }}>
12+
<Text>
13+
Wellcome to Dashboard, {username}
14+
</Text>
15+
<TouchableOpacity
16+
style={{ backgroundColor: 'red', paddingHorizontal: 50, paddingVertical: 15, margin: 10 }}
17+
onPress={() => dispatch(setSignOut())}
18+
>
19+
<Text style={{ color: 'white' }}>Sign out</Text>
20+
</TouchableOpacity>
21+
</View>
22+
)
23+
}
24+
25+
export default DashboardScreen

src/screens/LoginScreen.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import React from 'react'
2+
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
3+
import { useDispatch } from 'react-redux'
4+
import { setSignIn } from '../redux/slices/authSlice';
5+
6+
7+
const LoginScreen = () => {
8+
const dispatch = useDispatch();
9+
10+
const handleLogin = () => {
11+
const user = {
12+
isLoggedIn: true,
13+
14+
userName: 'johnDoe'
15+
};
16+
17+
dispatch(setSignIn(user));
18+
}
19+
20+
return (
21+
<View style={styles.container}>
22+
<Text style={{ marginBottom: 20, fontSize: 15 }}>Login Screen</Text>
23+
<TouchableOpacity onPress={handleLogin} style={styles.btn}>
24+
<Text style={styles.text}>Sign In</Text>
25+
</TouchableOpacity>
26+
</View>
27+
)
28+
}
29+
30+
export default LoginScreen
31+
32+
const styles = StyleSheet.create({
33+
container: {
34+
flex: 1,
35+
justifyContent: 'center',
36+
alignItems: 'center',
37+
backgroundColor: '#F5FCFF',
38+
},
39+
btn: {
40+
backgroundColor: 'blue',
41+
paddingHorizontal: 50,
42+
paddingVertical: 10,
43+
borderRadius: 10
44+
},
45+
text: {
46+
color: 'white',
47+
fontSize: 20
48+
}
49+
})

src/screens/RegisterScreen.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react'
2+
import { View, Text } from 'react-native'
3+
4+
const RegisterScreen = () => {
5+
return (
6+
<View style={{
7+
flex: 1,
8+
justifyContent: 'center',
9+
alignItems: 'center',
10+
backgroundColor: '#F5FCFF',
11+
}}>
12+
<Text style={{ marginBottom: 20, fontSize: 15 }}>Login Screen</Text>
13+
14+
</View>
15+
)
16+
}
17+
18+
export default RegisterScreen
19+

0 commit comments

Comments
 (0)