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/cache/cache.ts

141 lines
3.3 KiB
TypeScript

import { ChatConverseInfo, fetchConverseInfo } from '../model/converse';
import {
findGroupInviteByCode,
getGroupBasicInfo,
GroupBasicInfo,
GroupInvite,
} from '../model/group';
import {
fetchLocalStaticRegistryPlugins,
fetchRegistryPlugins,
fetchServiceRegistryPlugins,
PluginManifest,
} from '../model/plugin';
import { fetchUserInfo, getUserSettings, UserBaseInfo } from '../model/user';
import { parseUrlStr } from '../utils/url-helper';
import { queryClient } from './index';
export enum CacheKey {
user = 'user',
converse = 'converse',
baseGroupInfo = 'baseGroupInfo',
groupInvite = 'groupInvite',
pluginRegistry = 'pluginRegistry',
userSettings = 'userSettings',
}
/**
* 获取缓存的用户信息
*/
export async function getCachedUserInfo(
userId: string,
refetch = false
): Promise<UserBaseInfo> {
const data = await queryClient.fetchQuery(
[CacheKey.user, userId],
() => fetchUserInfo(userId),
{
staleTime: refetch ? 0 : 2 * 60 * 60 * 1000, // 缓存2小时
}
);
return data;
}
/**
* 获取缓存的会话信息
*/
export async function getCachedConverseInfo(
converseId: string
): Promise<ChatConverseInfo> {
const data = await queryClient.fetchQuery(
[CacheKey.converse, converseId],
() => fetchConverseInfo(converseId)
);
return data;
}
/**
* 获取缓存的邀请码信息
*/
export async function getCachedBaseGroupInfo(
groupId: string
): Promise<GroupBasicInfo | null> {
const data = await queryClient.fetchQuery(
[CacheKey.baseGroupInfo, groupId],
() => getGroupBasicInfo(groupId)
);
return data;
}
/**
* 获取缓存的邀请码信息
*/
export async function getCachedGroupInviteInfo(
inviteCode: string
): Promise<GroupInvite | null> {
const data = await queryClient.fetchQuery(
[CacheKey.groupInvite, inviteCode],
() => findGroupInviteByCode(inviteCode)
);
return data;
}
/**
* 获取缓存的插件列表
*/
export async function getCachedRegistryPlugins(): Promise<PluginManifest[]> {
const data = await queryClient.fetchQuery(
[CacheKey.pluginRegistry],
() =>
Promise.all([
fetchRegistryPlugins().catch(() => []),
fetchServiceRegistryPlugins()
.then((list) =>
list.map((manifest) => {
const serviceManifest = {
...manifest,
// 后端url策略。根据前端的url在获取时自动变更为当前链接的后端地址
url: parseUrlStr(manifest.url),
};
if (manifest.icon) {
serviceManifest.icon = parseUrlStr(manifest.icon);
}
if (manifest.documentUrl) {
serviceManifest.documentUrl = parseUrlStr(manifest.documentUrl);
}
return serviceManifest;
})
)
.catch(() => []),
fetchLocalStaticRegistryPlugins().catch(() => []),
]).then(([a, b, c]) => [...a, ...b, ...c]),
{
staleTime: 2 * 60 * 60 * 1000, // 缓存2小时
}
);
return data;
}
/**
* 获取用户配置
*/
export async function getCachedUserSettings() {
const data = await queryClient.fetchQuery(
[CacheKey.userSettings],
() => getUserSettings(),
{
staleTime: 10 * 60 * 1000, // 缓存10分钟
}
);
return data;
}