95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
import { useEffect } from "react";
|
|
import dayjs from "dayjs";
|
|
import initCache, { useRehydrate } from "../../app/cache";
|
|
import { useLazyGetFavoritesQuery } from "../../app/services/message";
|
|
import { useLazyGetUsersQuery } from "../../app/services/user";
|
|
import { useLazyGetServerQuery } from "../../app/services/server";
|
|
import useStreaming from "./useStreaming";
|
|
import { useAppSelector } from "../../app/store";
|
|
import { useLazyGetHistoryMessagesQuery } from "../../app/services/channel";
|
|
// type Props={
|
|
// guest?:boolean
|
|
// }
|
|
let preloadChannelMsgs = false;
|
|
export default function usePreload() {
|
|
const [preloadChannelMessages] = useLazyGetHistoryMessagesQuery();
|
|
const { rehydrate, rehydrated } = useRehydrate();
|
|
const {
|
|
loginUid,
|
|
token,
|
|
isGuest,
|
|
expireTime = +new Date(),
|
|
channelMessageData,
|
|
channelIds
|
|
} = useAppSelector((store) => {
|
|
return {
|
|
channelIds: store.channels.ids,
|
|
channelMessageData: store.channelMessage,
|
|
loginUid: store.authData.user?.uid,
|
|
isGuest: store.authData.guest,
|
|
token: store.authData.token,
|
|
expireTime: store.authData.expireTime
|
|
};
|
|
});
|
|
const { setStreamingReady } = useStreaming();
|
|
const [
|
|
getFavorites,
|
|
{
|
|
isLoading: favoritesLoading,
|
|
isSuccess: favoritesSuccess,
|
|
isError: favoritesError,
|
|
data: favorites
|
|
}
|
|
] = useLazyGetFavoritesQuery();
|
|
const [
|
|
getUsers,
|
|
{ isLoading: usersLoading, isSuccess: usersSuccess, isError: usersError, data: users }
|
|
] = useLazyGetUsersQuery();
|
|
const [
|
|
getServer,
|
|
{ isLoading: serverLoading, isSuccess: serverSuccess, isError: serverError, data: server }
|
|
] = useLazyGetServerQuery();
|
|
useEffect(() => {
|
|
initCache();
|
|
rehydrate();
|
|
return () => {
|
|
setStreamingReady(false);
|
|
};
|
|
}, []);
|
|
// 在guest的时候 预取channel数据
|
|
useEffect(() => {
|
|
if (isGuest && channelIds.length > 0 && !preloadChannelMsgs) {
|
|
const tmps = channelIds.filter((cid) => !channelMessageData[cid]);
|
|
tmps.forEach((id) => {
|
|
preloadChannelMessages({ id, limit: 50 });
|
|
});
|
|
preloadChannelMsgs = true;
|
|
}
|
|
}, [channelIds, channelMessageData, isGuest]);
|
|
useEffect(() => {
|
|
if (rehydrated) {
|
|
getUsers();
|
|
getServer();
|
|
getFavorites();
|
|
}
|
|
}, [rehydrated]);
|
|
const tokenAlmostExpire = dayjs().isAfter(new Date(expireTime - 20 * 1000));
|
|
const canStreaming = !!loginUid && rehydrated && !!token && !tokenAlmostExpire;
|
|
// console.log("ttt", loginUid, rehydrated, token);
|
|
|
|
useEffect(() => {
|
|
setStreamingReady(canStreaming);
|
|
}, [canStreaming]);
|
|
|
|
return {
|
|
loading: usersLoading || serverLoading || favoritesLoading || !rehydrated,
|
|
error: usersError && serverError && favoritesError,
|
|
success: usersSuccess && serverSuccess && favoritesSuccess,
|
|
data: {
|
|
users,
|
|
server,
|
|
favorites
|
|
}
|
|
};
|
|
}
|