From 1e0931b5d1dceeee391816fe065c64ea92d9d173 Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 26 Mar 2026 00:49:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=99=BB=E5=BD=95=E5=90=8E=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E4=B8=8D=E6=9B=B4=E6=96=B0=20=E2=80=94=20=E5=B0=86=20?= =?UTF-8?q?getUserInfo=20=E5=90=88=E5=B9=B6=E8=BF=9B=20login()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 登录流程之前分两步:login() 只设 isLoggedIn,getUserInfo/setProfile 由 LoginModal 调用。网络抖动或 B站 session 传播延迟时 getUserInfo 抛错被静默吞掉,face 不更新,直到下次启动 restore() 才修复。 修复:login() 内部完成 getUserInfo + 持久化,LoginModal 只需 await login() 后关闭弹窗,不再重复获取头像。 --- components/LoginModal.tsx | 10 +++------- store/authStore.ts | 16 +++++++++++----- 2 files changed, 14 insertions(+), 12 deletions(-) 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 () => {