You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/client/shared/hooks/model/useUserSettings.ts

106 lines
2.4 KiB
TypeScript

import { CacheKey } from '../../cache/cache';
import { useQuery, useQueryClient } from '../../cache/useCache';
import { sharedEvent } from '../../event';
import {
getUserSettings,
setUserSettings,
UserSettings,
} from '../../model/user';
import { useAsyncRequest } from '../useAsyncRequest';
import { useMemoizedFn } from '../useMemoizedFn';
import _without from 'lodash/without';
/**
* 用户设置hooks
*/
export function useUserSettings() {
const client = useQueryClient();
const { data: settings, isLoading } = useQuery(
[CacheKey],
() => getUserSettings(),
{
staleTime: 10 * 60 * 1000, // 缓存10分钟
}
);
const [{ loading: saveLoading }, setSettings] = useAsyncRequest(
async (settings: UserSettings) => {
const newSettings = await setUserSettings(settings);
client.setQueryData([CacheKey], () => newSettings);
sharedEvent.emit('userSettingsUpdate', newSettings);
},
[client]
);
return {
settings: settings ?? {},
setSettings,
loading: isLoading || saveLoading,
};
}
/**
* 单个用户设置
*/
export function useSingleUserSetting<K extends keyof UserSettings>(
name: K,
defaultValue?: UserSettings[K]
) {
const { settings, setSettings, loading } = useUserSettings();
return {
value: settings[name] ?? defaultValue,
setValue: async (newVal: UserSettings[K]) =>
setSettings({
[name]: newVal,
}),
loading,
};
}
/**
* 用户消息通知免打扰设置
*/
export function useUserNotifyMute() {
const { value: list = [], setValue: setList } = useSingleUserSetting(
'messageNotificationMuteList',
[]
);
const mute = useMemoizedFn((converseOrGroupId: string) => {
setList([...list, converseOrGroupId]);
});
const unmute = useMemoizedFn((converseOrGroupId: string) => {
setList(_without(list, converseOrGroupId));
});
const toggleMute = useMemoizedFn((converseOrGroupId) => {
if (list.includes(converseOrGroupId)) {
unmute(converseOrGroupId);
} else {
mute(converseOrGroupId);
}
});
/**
* 检查是否被静音
*/
const checkIsMuted = useMemoizedFn((panelId: string, groupId?: string) => {
if (groupId) {
return list.includes(panelId) || list.includes(groupId);
}
return list.includes(panelId);
});
return {
mutedList: list,
mute,
unmute,
toggleMute,
checkIsMuted,
};
}