electricity_bill_calc_userR.../src/hooks/useSession.ts

100 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//@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]);
}