Files
JKVideo/store/authStore.ts

52 lines
1.5 KiB
TypeScript
Raw Normal View History

import { create } from 'zustand';
import AsyncStorage from '@react-native-async-storage/async-storage';
2026-03-10 19:04:18 +08:00
import { getUserInfo } from '../services/bilibili';
interface AuthState {
sessdata: string | null;
uid: string | null;
username: string | null;
2026-03-10 19:04:18 +08:00
face: string | null;
isLoggedIn: boolean;
login: (sessdata: string, uid: string, username?: string) => Promise<void>;
logout: () => Promise<void>;
restore: () => Promise<void>;
2026-03-10 19:04:18 +08:00
setProfile: (face: string, username: string, uid: string) => void;
}
export const useAuthStore = create<AuthState>((set) => ({
sessdata: null,
uid: null,
username: null,
2026-03-10 19:04:18 +08:00
face: null,
isLoggedIn: false,
login: async (sessdata, uid, username) => {
await AsyncStorage.multiSet([
['SESSDATA', sessdata],
['UID', uid],
['USERNAME', username ?? ''],
]);
set({ sessdata, uid, username: username ?? null, isLoggedIn: true });
},
logout: async () => {
2026-03-10 19:04:18 +08:00
await AsyncStorage.multiRemove(['SESSDATA', 'UID', 'USERNAME', 'FACE']);
set({ sessdata: null, uid: null, username: null, face: null, isLoggedIn: false });
},
restore: async () => {
const sessdata = await AsyncStorage.getItem('SESSDATA');
if (sessdata) {
2026-03-10 19:04:18 +08:00
set({ sessdata, isLoggedIn: true });
try {
const info = await getUserInfo();
await AsyncStorage.setItem('FACE', info.face);
set({ face: info.face, username: info.uname, uid: String(info.mid) });
} catch {}
}
},
2026-03-10 19:04:18 +08:00
setProfile: (face, username, uid) => set({ face, username, uid }),
}));