//@ts-nocheck import {SyncCallback, SyncObjectCallback} from '@/shared/foundation'; import {UserSession} from '@/shared/model-user'; import {isNilOrEmpty} from '@u/funcs'; import dayjs, {Dayjs} from 'dayjs'; import {head, is, isNil, toUpper} from 'ramda'; import {useCallback, useMemo} from 'react'; import {useLocalStorage} from './useLocalStorage'; type SessionOperation = [T | undefined, SyncObjectCallback, SyncCallback]; /** * 提供用于操作用户Token的一系列方法。 * @returns 返回用于操作用户操作的获取、设置、删除的方法,按顺序以数组的方式返回。 */ export function useToken(): SessionOperation { const [value, set, remove] = useLocalStorage('token', null, { raw: true }); return [value, set, remove]; } /** * 提供用于操作用户登录会话有效时间的一系列方法。 * @returns 返回用于操作用户登录会话的获取、设置、删除方法,按顺序以数组方式返回。 */ export function useExpiresAt(): SessionOperation { const [value, set, remove] = useLocalStorage('expires', dayjs('2000-01-01 00:00:00'), { serializer: value => value.toISOString(), deserializer: value => dayjs(value) }); const unifiedSet = useCallback((value: string | Dayjs) => { if (is(String, value)) { set(dayjs(value)); } else if (dayjs.isDayjs(value)) { set(value); } else { set(null); } }, []); return [value, unifiedSet, remove]; } /** * 用于获取和记录当前应用中已经登录的用户信息,用户信息直接保存在LocalStorage中。 * @returns 返回保存在LocalStorage中的用户信息的一系列操作方法。 */ export function useSession(): SessionOperation { const [uid, setUserId, removeUserId] = useLocalStorage('uid', null, { raw: true }); const [userName, setUserName, removeUserName] = useLocalStorage('name', null, { raw: true }); const [userType, setUserType, removeUserType] = useLocalStorage('type', -1); const [userMenu, setUserMenu, removeUserMenu] = useLocalStorage('menu', []) const sessionInfo = useMemo((): UserSession | null => { const info: UserSession = { uid: uid, name: userName, type: userType, menu: userMenu }; return isNilOrEmpty(uid) ? null : info; }, [uid, userName, userType, userMenu]); const updateSession = useCallback((value: UserSession) => { setUserId(value.code); setUserName(value.name); setUserType(value.type); setUserMenu(value.menu); }, []); const removeSession = useCallback(() => { removeUserId(); removeUserName(); removeUserType(); removeUserMenu() }, []); return [sessionInfo, updateSession, removeSession]; } /** * 生成当前已经登录的用户的名称的第一个字母或者汉字。 * @returns 代表当前用户的第一个字母或者汉字。 */ export function useFirstLetterOfUserName(): string { const [user] = useSession(); return useMemo(() => { if (isNil(user)) { return 'A'; } else { return toUpper(head(user.name)); } }, [user]); }