diff --git a/components/LoginModal.tsx b/components/LoginModal.tsx index 079dbfd..115e021 100644 --- a/components/LoginModal.tsx +++ b/components/LoginModal.tsx @@ -14,7 +14,7 @@ import * as FileSystem from "expo-file-system/legacy"; import * as MediaLibrary from "expo-media-library"; import QRCode from "react-native-qrcode-svg"; import { Ionicons } from "@expo/vector-icons"; -import { generateQRCode, pollQRCode, getUserInfo } from "../services/bilibili"; +import { generateQRCode, pollQRCode } from "../services/bilibili"; import { useAuthStore } from "../store/authStore"; import { useTheme } from "../utils/theme"; @@ -33,7 +33,6 @@ export function LoginModal({ visible, onClose }: Props) { >("loading"); const pollRef = useRef | null>(null); const login = useAuthStore((s) => s.login); - const setProfile = useAuthStore((s) => s.setProfile); const theme = useTheme(); // sheet 滑入动画 @@ -86,14 +85,11 @@ export function LoginModal({ visible, onClose }: Props) { clearInterval(pollRef.current!); try { await login(result.cookie, "", ""); - if (cancelled) return; - setStatus("done"); - const info = await getUserInfo(); - if (!cancelled) setProfile(info.face, info.uname, String(info.mid)); } catch { if (!cancelled) setStatus("error"); + return; } - onClose(); + if (!cancelled) onClose(); } } catch { // Network error during poll — ignore, will retry next interval diff --git a/store/authStore.ts b/store/authStore.ts index 27fae61..1ee4e95 100644 --- a/store/authStore.ts +++ b/store/authStore.ts @@ -24,13 +24,19 @@ export const useAuthStore = create((set) => ({ login: async (sessdata, uid, username) => { await setSecure('SESSDATA', sessdata); - await AsyncStorage.multiSet([ - ['UID', uid], - ['USERNAME', username ?? ''], - ]); // Migrate: remove SESSDATA from AsyncStorage if it was there before await AsyncStorage.removeItem('SESSDATA').catch(() => {}); - set({ sessdata, uid, username: username ?? null, isLoggedIn: true }); + set({ sessdata, uid: uid || null, username: username || null, isLoggedIn: true }); + // 登录后立即拉取用户信息,确保当前 session 头像可用(不依赖调用方 setProfile) + try { + const info = await getUserInfo(); + await AsyncStorage.multiSet([ + ['UID', String(info.mid)], + ['USERNAME', info.uname], + ['FACE', info.face], + ]); + set({ face: info.face, username: info.uname, uid: String(info.mid) }); + } catch {} }, logout: async () => {