staff_data/apps/web/src/utils/general.ts

71 lines
2.7 KiB
TypeScript
Executable File

import { QueryClient } from "@tanstack/react-query";
import { getQueryKey } from "@trpc/react-query";
export const handleDownload = (url: string | undefined) => {
if (url) {
const link = document.createElement('a');
link.href = url;
link.download = url.split('/').pop() || '';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
/**
* 根据查询客户端缓存生成唯一数据列表的函数。
*
* @template T - 数据类型
* @param {QueryClient} client - 查询客户端实例
* @param {any} trpcQueryKey - 用于获取查询键的参数
* @param {string} uniqueField - 唯一字段的名称,默认为 'id'
* @returns {T[]} - 返回唯一的数据列表
*/
export function getCacheDataFromQuery<T>(client: QueryClient, trpcQueryKey: any, uniqueField: string = 'id'): T[] {
// 获取查询缓存数据
const cacheData = client.getQueriesData({ queryKey: getQueryKey(trpcQueryKey) });
// 提取并整理缓存数据
const data = cacheData
.flatMap(cache => cache.slice(1))
.flat()
.filter(item => item !== undefined) as T[];
// 使用 Map 进行去重
const uniqueDataMap = new Map<string, T>();
data.forEach((item: T) => {
if (item && item[uniqueField]) {
uniqueDataMap.set(item[uniqueField], item);
}
});
// 转换为数组返回唯一的数据列表
return Array.from(uniqueDataMap.values());
}
/**
* 查找唯一数据列表中的匹配对象。
*
* @template T - 数据类型
* @param {T[]} uniqueData - 唯一数据列表
* @param {string} key - 唯一字段的键值
* @param {string} uniqueField - 唯一字段的名称,默认为 'id'
* @returns {T | undefined} - 返回匹配的对象,如果没有找到则返回 undefined
*/
export function findDataByKey<T>(uniqueData: T[], key: string | number, uniqueField: string = 'id'): T | undefined {
return uniqueData.find(item => item[uniqueField] === key);
}
/**
* 综合使用生成唯一数据和查找数据的功能。
*
* @template T - 数据类型
* @param {QueryClient} client - 查询客户端实例
* @param {any} trpcQueryKey - 用于获取查询键的参数
* @param {string} key - 唯一字段的键值
* @param {string} uniqueField - 唯一字段的名称,默认为 'id'
* @returns {T | undefined} - 返回匹配的对象,如果没有找到则返回 undefined
*/
export function findQueryData<T>(client: QueryClient, trpcQueryKey: any, key: string | number, uniqueField: string = 'id'): T | undefined {
const uniqueData = getCacheDataFromQuery<T>(client, trpcQueryKey, uniqueField);
return findDataByKey<T>(uniqueData, key, uniqueField);
}