import { createSocket, createStore, setupRedux, useAsync, userActions, loginWithToken, t, ReduxProvider, UserLoginInfo, } from 'tailchat-shared'; import React from 'react'; import { LoadingSpinner } from '@/components/LoadingSpinner'; import { getGlobalUserLoginInfo, tryAutoLogin } from '@/utils/user-helper'; import _isNil from 'lodash/isNil'; import { getUserJWT } from '@/utils/jwt-helper'; import { useHistory } from 'react-router'; import { SidebarContextProvider } from './SidebarContext'; import { PortalHost } from '@/components/Portal'; import { setGlobalSocket, setGlobalStore } from '@/utils/global-state-helper'; import { SocketContextProvider } from '@/context/SocketContext'; import { Problem } from '@/components/Problem'; /** * 应用状态管理hooks */ function useAppState() { const history = useHistory(); const { value, loading, error } = useAsync(async () => { let userLoginInfo: UserLoginInfo; try { userLoginInfo = await tryAutoLogin(); } catch (e) { // 当前 Token 不存在或已过期 history.replace( `/entry/login?redirect=${encodeURIComponent(location.pathname)}` ); return; } // 到这里 userLoginInfo 必定存在 // 创建Redux store const store = createStore(); store.dispatch(userActions.setUserInfo(userLoginInfo)); setGlobalStore(store); // 创建 websocket 连接 const socket = await createSocket(userLoginInfo.token); setGlobalSocket(socket); // 初始化Redux setupRedux(socket, store); return { store, socket }; }, [history]); const store = value?.store; const socket = value?.socket; return { loading, store, socket, error }; } /** * 主页面核心数据Provider * 在主页存在 */ export const MainProvider: React.FC = React.memo((props) => { const { loading, store, error, socket } = useAppState(); if (loading) { return (