100 lines
3.2 KiB
TypeScript
100 lines
3.2 KiB
TypeScript
//@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, O = T> = [T | undefined, SyncObjectCallback<O>, SyncCallback];
|
||
|
||
/**
|
||
* 提供用于操作用户Token的一系列方法。
|
||
* @returns 返回用于操作用户操作的获取、设置、删除的方法,按顺序以数组的方式返回。
|
||
*/
|
||
export function useToken(): SessionOperation<string | null> {
|
||
const [value, set, remove] = useLocalStorage<string | null>('token', null, { raw: true });
|
||
|
||
return [value, set, remove];
|
||
}
|
||
|
||
/**
|
||
* 提供用于操作用户登录会话有效时间的一系列方法。
|
||
* @returns 返回用于操作用户登录会话的获取、设置、删除方法,按顺序以数组方式返回。
|
||
*/
|
||
export function useExpiresAt(): SessionOperation<Dayjs, string | Dayjs> {
|
||
const [value, set, remove] = useLocalStorage<Dayjs>('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<UserSession | null> {
|
||
const [uid, setUserId, removeUserId] = useLocalStorage<number | null>('uid', null, {
|
||
raw: true
|
||
});
|
||
const [userName, setUserName, removeUserName] = useLocalStorage<string | null>('name', null, {
|
||
raw: true
|
||
});
|
||
const [userType, setUserType, removeUserType] = useLocalStorage<boolean>('type', -1);
|
||
const [userMenu, setUserMenu, removeUserMenu] = useLocalStorage<string[]>('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]);
|
||
}
|