Skip to content

Commit 51207c2

Browse files
committed
fix(pages): fix guide page and privacy popup
1 parent 2cfa3c5 commit 51207c2

3 files changed

Lines changed: 39 additions & 46 deletions

File tree

src/app/auth/guide.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const GuidePage: FC = () => {
4646
const [toVisible, setToVisible] = useState<boolean>(true);
4747
const currentStyle = useVisualScheme(state => state.currentStyle);
4848
const [reachedLastPage, setReachedLastPage] = useState<boolean>(false);
49-
const { agreement, setAgreement } = usePrivacy();
49+
const { hydrated, agreement, setAgreement } = usePrivacy();
5050
const gradientValue = useSharedValue(0);
5151
// eslint-disable-next-line unused-imports/no-unused-vars
5252
const timeoutFn = (activeIndex: number, timeout: number) => {
@@ -59,7 +59,7 @@ const GuidePage: FC = () => {
5959

6060
useFocusEffect(
6161
useCallback(() => {
62-
if (!agreement) {
62+
if (hydrated && !agreement) {
6363
Modal.show({
6464
children: <AgreementModal />,
6565
mode: 'middle',
@@ -86,7 +86,7 @@ const GuidePage: FC = () => {
8686
});
8787
}
8888
return () => {};
89-
}, [])
89+
}, [hydrated, agreement])
9090
);
9191

9292
useEffect(() => {

src/app/index.tsx

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Href, Redirect, SplashScreen } from 'expo-router';
1+
import { router, SplashScreen } from 'expo-router';
22
import { getItem, setItem } from 'expo-secure-store';
33
import * as React from 'react';
44
import { Platform } from 'react-native';
@@ -8,61 +8,45 @@ import useCourse from '@/store/course';
88
import { setupGlobalErrorHandler } from '@/utils/errorHandler';
99
import { updateCourseData } from '@/utils/updateWidget';
1010

11-
// 由于 expo 没有 initialRoutes
12-
// 重定向到 tabs
13-
// 详情见 issue: https://github.com/expo/router/issues/763#issuecomment-1635316964
1411
const Index = () => {
15-
const [initialRoute, setInitialRoute] = React.useState<string | null>(null);
1612
const hydrated = useCourse(state => state.hydrated);
13+
const initialized = React.useRef(false);
1714

1815
React.useEffect(() => {
19-
// if (__DEV__) {
20-
// //console.log('mock server setup');
21-
// setupMockServer();
22-
// }
16+
if (!hydrated || initialized.current) return;
17+
initialized.current = true;
2318

2419
const init = async () => {
25-
const firstLaunch = await getItem('firstLaunch');
26-
27-
const token = await getItem('longToken');
28-
29-
// 设置全局错误处理器
30-
setupGlobalErrorHandler();
31-
// 等待 AsyncStorage 加载
32-
if (hydrated) await SplashScreen.hideAsync();
33-
if (!token) {
34-
if (firstLaunch === null) {
35-
// 是首次启动,设置标记并跳转到guide
36-
setItem('firstLaunch', 'false');
37-
setInitialRoute('/auth/guide');
38-
} else {
39-
if (Platform.OS === 'android') {
40-
updateCourseData()
41-
.then(() => {
42-
console.log('updateWidget');
43-
})
44-
.catch(error => {
45-
console.error('更新小组件失败:', error);
46-
});
20+
try {
21+
const firstLaunch = await getItem('firstLaunch');
22+
const token = await getItem('longToken');
23+
24+
setupGlobalErrorHandler();
25+
await SplashScreen.hideAsync();
26+
27+
if (!token) {
28+
if (firstLaunch === null) {
29+
setItem('firstLaunch', 'false');
30+
console.log('首次启动,跳转到引导页');
31+
router.replace('/auth/guide');
32+
} else if (Platform.OS === 'android') {
33+
updateCourseData().catch(error =>
34+
console.error('更新小组件失败:', error)
35+
);
36+
} else {
37+
router.replace('/auth/login');
4738
}
48-
49-
// 不是首次启动但没有token,去登录
50-
setInitialRoute('/auth/guide');
39+
} else {
40+
router.replace('/(tabs)');
5141
}
52-
} else {
53-
// 有token直接进入主页
54-
setInitialRoute('/(tabs)');
42+
} catch (error) {
43+
console.error('初始化失败:', error);
5544
}
5645
};
5746

58-
SplashScreen.preventAutoHideAsync();
5947
init();
6048
}, [hydrated]);
6149

62-
if (!initialRoute) {
63-
return null;
64-
}
65-
66-
return <Redirect href={initialRoute as Href}></Redirect>;
50+
return null;
6751
};
6852
export default Index;

src/store/privacy.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { create } from 'zustand';
33
import { createJSONStorage, persist } from 'zustand/middleware';
44

55
interface PrivacyState {
6+
hydrated: boolean;
7+
setHydrated: (hydrated: boolean) => void;
68
agreement: boolean;
79
setAgreement: (_agreement: boolean) => void;
810
}
@@ -11,13 +13,20 @@ const usePrivacy = create<PrivacyState>()(
1113
persist(
1214
set => {
1315
return {
16+
hydrated: false,
17+
setHydrated: (hydrated: boolean) => set({ hydrated }),
1418
agreement: false,
1519
setAgreement: (agreement: boolean) => set({ agreement }),
1620
};
1721
},
1822
{
1923
name: 'agreement',
2024
storage: createJSONStorage(() => AsyncStorage),
25+
onRehydrateStorage: state => {
26+
return () => {
27+
state?.setHydrated(true);
28+
};
29+
},
2130
}
2231
)
2332
);

0 commit comments

Comments
 (0)