Skip to content

Commit bd11d3e

Browse files
committedMar 19, 2022
auth with context api
1 parent 2645deb commit bd11d3e

File tree

11 files changed

+121
-48
lines changed

11 files changed

+121
-48
lines changed
 

‎apps/next/pages/home.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { HomeScreen } from 'app/features/home/screen'
2+
3+
export default HomeScreen
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
import type { FunctionComponent } from "react";
3+
import React, { createContext, useContext, useState } from "react";
4+
5+
interface AuthContextProps {
6+
user: boolean;
7+
setUser: (user: boolean) => void;
8+
}
9+
10+
const AuthContext = createContext<AuthContextProps>(
11+
{} as AuthContextProps
12+
);
13+
14+
export const AuthenticationProvider: FunctionComponent = ({ children }) => {
15+
const [user, setUser] = useState<boolean>(false);
16+
17+
return (
18+
<AuthContext.Provider value={{ user, setUser }}>
19+
{children}
20+
</AuthContext.Provider>
21+
);
22+
};
23+
24+
export const useAuthentication = () => useContext(AuthContext);

‎packages/app/features/auth/LoginScreen.tsx

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import React, { useState } from 'react'
2-
import { StyleSheet, TouchableOpacity, Text, View } from 'react-native'
2+
import { StyleSheet, TouchableOpacity, Text, View, Platform } from 'react-native'
33
import { Button, Colors, TextInput } from 'react-native-paper'
44
import { useRouter } from 'solito/router'
5-
6-
// import { Routes } from '../navigation/Routes'
7-
// import { useAuthentication } from '../context/Authentication'
5+
import { useAuthentication } from './AuthContext'
86

97
export const LoginScreen = () => {
108
const [email, setEmail] = useState('')
@@ -17,9 +15,12 @@ export const LoginScreen = () => {
1715
push('/terms/')
1816
}
1917

20-
// const { setUser } = useAuthentication()
18+
const { setUser } = useAuthentication()
2119
function handleLogin() {
22-
// setUser(true)
20+
setUser(true)
21+
if(Platform.OS ==='web'){
22+
push('/home')
23+
}
2324
}
2425

2526
function toggleSecureIcon() {

‎packages/app/features/auth/TermsScreen.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { View, Text, Image, ScrollView } from "react-native";
33
import { Appbar, Colors, Title } from "react-native-paper";
44
import { useRouter } from "solito/router";
55

6-
76
export function TermsScreen() {
87
const { back } = useRouter()
8+
99
function goBack() {
1010
back()
1111
}

‎packages/app/features/user/detail-screen.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function UserDetailScreen() {
1313
sx={{ textAlign: 'center', mb: 16, fontWeight: 'bold' }}
1414
>{`User ID: ${id}`}</Text>
1515

16-
<TextLink href="/">👈 Go Home</TextLink>
16+
<TextLink href="/home">👈 Go Home</TextLink>
1717
</View>
1818
)
1919
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { createNativeStackNavigator } from '@react-navigation/native-stack'
2+
import { LoginScreen } from 'app/features/auth/LoginScreen'
3+
import { TermsScreen } from 'app/features/auth/TermsScreen'
4+
5+
const Stack = createNativeStackNavigator<{
6+
login: undefined
7+
terms: undefined
8+
}>()
9+
10+
export function AuthNavigator() {
11+
return (
12+
<Stack.Navigator screenOptions={{ headerShown: false }}>
13+
<Stack.Screen
14+
name="login"
15+
component={LoginScreen}
16+
options={{
17+
title: 'Login',
18+
}}
19+
/>
20+
<Stack.Screen
21+
name="terms"
22+
component={TermsScreen}
23+
options={{
24+
title: 'Terms',
25+
}}
26+
/>
27+
</Stack.Navigator>
28+
)
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { createNativeStackNavigator } from '@react-navigation/native-stack'
2+
import { HomeScreen } from 'app/features/home/screen'
3+
import { UserDetailScreen } from 'app/features/user/detail-screen'
4+
5+
const Stack = createNativeStackNavigator<{
6+
home: undefined
7+
'user-detail': {
8+
id: string
9+
}
10+
}>()
11+
12+
export function HomeNavigator() {
13+
return (
14+
<Stack.Navigator screenOptions={{ headerShown: false }}>
15+
<Stack.Screen
16+
name="home"
17+
component={HomeScreen}
18+
options={{
19+
title: 'Home',
20+
}}
21+
/>
22+
<Stack.Screen
23+
name="user-detail"
24+
component={UserDetailScreen}
25+
options={{
26+
title: 'User',
27+
}}
28+
/>
29+
</Stack.Navigator>
30+
)
31+
}

‎packages/app/navigation/native/Routes.ts

Whitespace-only changes.
+12-34
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,28 @@
11
import { createNativeStackNavigator } from '@react-navigation/native-stack'
2+
import { useAuthentication } from 'app/features/auth/AuthContext'
23
import { LoginScreen } from 'app/features/auth/LoginScreen'
34
import { TermsScreen } from 'app/features/auth/TermsScreen'
45

56
import { HomeScreen } from '../../features/home/screen'
67
import { UserDetailScreen } from '../../features/user/detail-screen'
8+
import { AuthNavigator } from './AuthNavigator'
9+
import { HomeNavigator } from './HomeNavigator'
710

811
const Stack = createNativeStackNavigator<{
9-
home: undefined
10-
terms: undefined
11-
login: undefined
12-
'user-detail': {
13-
id: string
14-
}
12+
'auth-stack': undefined
13+
'home-stack': undefined
1514
}>()
1615

1716
export function NativeNavigation() {
17+
const { user } = useAuthentication();
18+
1819
return (
1920
<Stack.Navigator screenOptions={{ headerShown: false }}>
20-
<Stack.Screen
21-
name="login"
22-
component={LoginScreen}
23-
options={{
24-
title: 'Login',
25-
}}
26-
/>
27-
<Stack.Screen
28-
name="terms"
29-
component={TermsScreen}
30-
options={{
31-
title: 'Terms',
32-
}}
33-
/>
34-
<Stack.Screen
35-
name="home"
36-
component={HomeScreen}
37-
options={{
38-
title: 'Home',
39-
}}
40-
/>
41-
<Stack.Screen
42-
name="user-detail"
43-
component={UserDetailScreen}
44-
options={{
45-
title: 'User',
46-
}}
47-
/>
21+
{!user ? (
22+
<Stack.Screen name="auth-stack" component={AuthNavigator} />
23+
) : (
24+
<Stack.Screen name="home-stack" component={HomeNavigator} />
25+
)}
4826
</Stack.Navigator>
4927
)
5028
}

‎packages/app/provider/index.tsx

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import { AuthenticationProvider } from 'app/features/auth/AuthContext'
2+
import React from 'react'
13
import { Dripsy } from './dripsy'
24
import { NavigationProvider } from './navigation'
35

46
export function Provider({ children }: { children: React.ReactNode }) {
57
return (
6-
<NavigationProvider>
7-
<Dripsy>{children}</Dripsy>
8-
</NavigationProvider>
8+
<AuthenticationProvider>
9+
<NavigationProvider>
10+
<Dripsy>{children}</Dripsy>
11+
</NavigationProvider>
12+
</AuthenticationProvider>
913
)
1014
}

‎readme.md

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
## 🗂 Folder layout
1919

2020
- `apps` entry points for each app
21-
2221
- `expo`
2322
- `next`
2423

@@ -40,7 +39,8 @@ yarn native
4039

4140
## 🆕 Add new dependencies
4241

43-
### Pure JS dependencies
42+
<details>
43+
<summary>Pure JS dependencies</summary>
4444

4545
If you're installing a JavaScript-only dependency that will be used across platforms, install it in `packages/app`:
4646

@@ -50,8 +50,10 @@ yarn add date-fns
5050
cd ../..
5151
yarn
5252
```
53+
</details>
5354

54-
### Native dependencies
55+
<details>
56+
<summary>Native dependencies</summary>
5557

5658
If you're installing a library with any native code, you must install it in `apps/expo`:
5759

@@ -64,6 +66,7 @@ yarn
6466
```
6567

6668
You can also install the native library inside of `packages/app` if you want to get autoimport for that package inside of the `app` folder. However, you need to be careful and install the _exact_ same version in both packages. If the versions mismatch at all, you'll potentially get terrible bugs. This is a classic monorepo issue. I use `lerna-update-wizard` to help with this (you don't need to use Lerna to use that lib).
69+
</details>
6770

6871
## 👏 Kudos
6972

0 commit comments

Comments
 (0)
Please sign in to comment.