Skip to content

Commit 03f68e6

Browse files
committed
chore: improve authentication stack in example app
1 parent 3a4e1b1 commit 03f68e6

File tree

7 files changed

+71
-42
lines changed

7 files changed

+71
-42
lines changed

example/app/(app)/_layout.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'react-native-reanimated'
2+
3+
import { Stack } from 'expo-router'
4+
5+
import { useListenLocalStorage } from '@/common/localStorage'
6+
7+
export default function () {
8+
const [accessToken] = useListenLocalStorage('accessToken')
9+
10+
const isLoggedIn = Boolean(accessToken)
11+
12+
return (
13+
<Stack screenOptions={{ headerShown: false }}>
14+
<Stack.Protected guard={isLoggedIn}>
15+
<Stack.Screen name="index" />
16+
</Stack.Protected>
17+
<Stack.Protected guard={!isLoggedIn}>
18+
<Stack.Screen name="login" />
19+
</Stack.Protected>
20+
</Stack>
21+
)
22+
}

example/app/(app)/home.tsx renamed to example/app/(app)/index.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useRouter } from 'expo-router'
66
import { Fragment, useEffect, useState } from 'react'
77
import { Alert, Dimensions, Image, StyleSheet } from 'react-native'
88

9+
import { LineError } from '@/common/errors'
910
import {
1011
removeLocalStorageItem,
1112
setLocalStorageItem,
@@ -15,8 +16,11 @@ import { Bullet } from '@/components/Bullet'
1516
import { Button } from '@/components/Button'
1617
import { ThemedView } from '@/components/ThemedView'
1718

18-
function handleError(error: Error) {
19-
return Alert.alert(strings.errorTitle, error?.message ?? strings.errorMessage)
19+
function handleError(error: LineError) {
20+
const userInfo = JSON.parse(error.userInfo?.message ?? '')
21+
const title = strings.errorTitle + userInfo.statusCode
22+
const message = userInfo.message ?? strings.errorMessage
23+
return Alert.alert(title, message)
2024
}
2125

2226
export default function () {
@@ -41,7 +45,7 @@ export default function () {
4145
return Line.logout()
4246
.then(() => {
4347
removeLocalStorageItem('accessToken')
44-
router.replace('/login')
48+
router.replace('/')
4549
})
4650
.finally(() => setLoading(false))
4751
}
@@ -96,8 +100,8 @@ export default function () {
96100

97101
const strings = {
98102
accessToken: 'Access Token',
99-
errorMessage: 'Failed to get information',
100-
errorTitle: 'Error',
103+
errorMessage: 'The operation could not be completed',
104+
errorTitle: 'Error ',
101105
isFriend: 'Is Friend?',
102106
logOut: 'Logout',
103107
name: 'Name',

example/app/(app)/login.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default function () {
2121
.then(result => {
2222
if (!result.accessToken.accessToken) return
2323
setLocalStorageItem('accessToken', result.accessToken.accessToken)
24-
router.replace('/home')
24+
router.replace('/')
2525
})
2626
.catch(() => {
2727
Alert.alert(strings.errorTitle, strings.errorMessage)

example/app/_layout.tsx

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,24 @@ import {
66
ThemeProvider,
77
} from '@react-navigation/native'
88
import Line from '@xmartlabs/react-native-line'
9-
import { useFonts } from 'expo-font'
10-
import { Stack } from 'expo-router'
11-
import * as SplashScreen from 'expo-splash-screen'
9+
import { Slot } from 'expo-router'
1210
import { StatusBar } from 'expo-status-bar'
13-
import { useEffect } from 'react'
11+
import { useLayoutEffect } from 'react'
1412

15-
import SpaceMono from '@/assets/fonts/SpaceMono-Regular.ttf'
13+
import { SplashScreen } from '@/components/SplashScreen'
1614
import { useColorScheme } from '@/hooks/useColorScheme'
1715

18-
SplashScreen.preventAutoHideAsync()
19-
2016
export default function () {
2117
const colorScheme = useColorScheme()
22-
const [loaded] = useFonts({ SpaceMono })
23-
24-
useEffect(() => {
25-
if (loaded) {
26-
Line.setup({ channelId: '2006826760' })
27-
SplashScreen.hideAsync()
28-
}
29-
}, [loaded])
3018

31-
if (!loaded) {
32-
return null
33-
}
19+
useLayoutEffect(() => {
20+
Line.setup({ channelId: '2006826760' })
21+
}, [])
3422

3523
return (
3624
<ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
37-
<Stack screenOptions={{ headerShown: false }}>
38-
<Stack.Screen name="(app)/login" />
39-
<Stack.Screen name="(app)/home" />
40-
<Stack.Screen name="+not-found" />
41-
</Stack>
25+
<SplashScreen />
26+
<Slot />
4227
<StatusBar style="auto" />
4328
</ThemeProvider>
4429
)

example/app/index.tsx

Lines changed: 0 additions & 13 deletions
This file was deleted.

example/common/errors.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export class LineError extends Error {
2+
public userInfo?: {
3+
message: string
4+
statusCode: number
5+
}
6+
7+
constructor(message: string) {
8+
super(message)
9+
}
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'react-native-reanimated'
2+
3+
import { useFonts } from 'expo-font'
4+
import * as ExpoSplashScreen from 'expo-splash-screen'
5+
import { FunctionComponent, useEffect } from 'react'
6+
7+
import SpaceMono from '@/assets/fonts/SpaceMono-Regular.ttf'
8+
9+
ExpoSplashScreen.preventAutoHideAsync()
10+
11+
export const SplashScreen: FunctionComponent = () => {
12+
const [loaded] = useFonts({ SpaceMono })
13+
14+
useEffect(() => {
15+
if (loaded) {
16+
ExpoSplashScreen.hideAsync()
17+
}
18+
}, [loaded])
19+
20+
return null
21+
}

0 commit comments

Comments
 (0)