首页只调用必须的接口
This commit is contained in:
@@ -7,6 +7,8 @@ import {
|
||||
NicknameChangeStatus,
|
||||
updateNickname as updateNicknameApi,
|
||||
} from "@/services/userService";
|
||||
import evaluateService, { LastTimeTestResult } from "@/services/evaluateService";
|
||||
import { useListStore } from "./listStore";
|
||||
|
||||
export interface UserState {
|
||||
user: UserInfoType | {};
|
||||
@@ -15,35 +17,11 @@ export interface UserState {
|
||||
nicknameChangeStatus: Partial<NicknameChangeStatus>;
|
||||
checkNicknameChangeStatus: () => void;
|
||||
updateNickname: (nickname: string) => void;
|
||||
// NTRP 测试结果缓存
|
||||
lastTestResult: LastTimeTestResult | null;
|
||||
fetchLastTestResult: () => Promise<LastTimeTestResult | null>;
|
||||
}
|
||||
|
||||
// 请求锁,防止重复请求
|
||||
let fetchingUserInfo = false;
|
||||
let fetchUserInfoPromise: Promise<UserInfoType | undefined> | null = null;
|
||||
|
||||
const fetchUserInfoWithLock = async (set) => {
|
||||
// 如果正在请求,直接返回现有的 Promise
|
||||
if (fetchingUserInfo && fetchUserInfoPromise) {
|
||||
return fetchUserInfoPromise;
|
||||
}
|
||||
|
||||
fetchingUserInfo = true;
|
||||
fetchUserInfoPromise = (async () => {
|
||||
try {
|
||||
const res = await fetchUserProfile();
|
||||
set({ user: res.data });
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
console.error("获取用户信息失败:", error);
|
||||
return undefined;
|
||||
} finally {
|
||||
fetchingUserInfo = false;
|
||||
fetchUserInfoPromise = null;
|
||||
}
|
||||
})();
|
||||
|
||||
return fetchUserInfoPromise;
|
||||
};
|
||||
|
||||
const getTimeNextDate = (time: string) => {
|
||||
const date = new Date(time);
|
||||
@@ -56,15 +34,50 @@ const getTimeNextDate = (time: string) => {
|
||||
|
||||
export const useUser = create<UserState>()((set) => ({
|
||||
user: {},
|
||||
fetchUserInfo: () => fetchUserInfoWithLock(set),
|
||||
fetchUserInfo: async () => {
|
||||
try {
|
||||
const res = await fetchUserProfile();
|
||||
const userData = res.data;
|
||||
set({ user: userData });
|
||||
|
||||
// 当 userLastLocationProvince 更新时,同步更新 area
|
||||
if (userData?.last_location_province) {
|
||||
const listStore = useListStore.getState();
|
||||
const currentArea = listStore.area;
|
||||
// 只有当 area 不存在或与 userLastLocationProvince 不一致时才更新
|
||||
if (!currentArea || currentArea[1] !== userData.last_location_province) {
|
||||
const newArea: [string, string] = ["中国", userData.last_location_province];
|
||||
listStore.updateArea(newArea);
|
||||
}
|
||||
}
|
||||
|
||||
return userData;
|
||||
} catch (error) {
|
||||
console.error("获取用户信息失败:", error);
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
updateUserInfo: async (userInfo: Partial<UserInfoType>) => {
|
||||
try {
|
||||
// 先更新后端
|
||||
await updateUserProfile(userInfo);
|
||||
// 然后立即更新本地状态(乐观更新)
|
||||
set((state) => ({
|
||||
user: { ...state.user, ...userInfo },
|
||||
}));
|
||||
set((state) => {
|
||||
const newUser = { ...state.user, ...userInfo };
|
||||
|
||||
// 当 userLastLocationProvince 更新时,同步更新 area
|
||||
if (userInfo.last_location_province) {
|
||||
const listStore = useListStore.getState();
|
||||
const currentArea = listStore.area;
|
||||
// 只有当 area 不存在或与 userLastLocationProvince 不一致时才更新
|
||||
if (!currentArea || currentArea[1] !== userInfo.last_location_province) {
|
||||
const newArea: [string, string] = ["中国", userInfo.last_location_province];
|
||||
listStore.updateArea(newArea);
|
||||
}
|
||||
}
|
||||
|
||||
return { user: newUser };
|
||||
});
|
||||
// 不再每次都重新获取完整用户信息,减少请求次数
|
||||
// 只有在更新头像等需要服务器返回新URL的字段时才需要重新获取
|
||||
// 如果需要确保数据一致性,可以在特定场景下手动调用 fetchUserInfo
|
||||
@@ -99,6 +112,21 @@ export const useUser = create<UserState>()((set) => ({
|
||||
console.error("更新用户昵称失败:", error);
|
||||
}
|
||||
},
|
||||
// NTRP 测试结果缓存
|
||||
lastTestResult: null,
|
||||
fetchLastTestResult: async () => {
|
||||
try {
|
||||
const res = await evaluateService.getLastResult();
|
||||
if (res.code === 0) {
|
||||
set({ lastTestResult: res.data });
|
||||
return res.data;
|
||||
}
|
||||
return null;
|
||||
} catch (error) {
|
||||
console.error("获取NTRP测试结果失败:", error);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
export const useUserInfo = () => useUser((state) => state.user);
|
||||
@@ -111,4 +139,7 @@ export const useUserActions = () =>
|
||||
updateUserInfo: state.updateUserInfo,
|
||||
checkNicknameChangeStatus: state.checkNicknameChangeStatus,
|
||||
updateNickname: state.updateNickname,
|
||||
fetchLastTestResult: state.fetchLastTestResult,
|
||||
}));
|
||||
|
||||
export const useLastTestResult = () => useUser((state) => state.lastTestResult);
|
||||
|
||||
Reference in New Issue
Block a user