import { api } from "../trpc"; import { TroubleParams } from "../../singleton/DataHolder"; export function useVisitor() { const utils = api.useUtils(); const troubleParams = TroubleParams.getInstance(); const create = api.visitor.create.useMutation({ onSuccess() { utils.visitor.invalidate(); // utils.trouble.invalidate(); }, }); /** * 通用的乐观更新mutation工厂函数 * @param updateFn 更新数据的具体逻辑函数 * @returns 封装后的mutation配置对象 */ const createOptimisticMutation = ( updateFn: (item: any, variables: any) => any ) => ({ // 在请求发送前执行本地数据预更新 // onMutate: async (variables: any) => { // const previousDataList: any[] = []; // // 动态生成参数列表,包括星标和其他参数 // const paramsList = troubleParams.getItems(); // console.log(paramsList.length); // // 遍历所有参数列表,执行乐观更新 // for (const params of paramsList) { // // 取消可能的并发请求 // await utils.trouble.findManyWithCursor.cancel(); // // 获取并保存当前数据 // const previousData = // utils.trouble.findManyWithCursor.getInfiniteData({ // ...params, // }); // previousDataList.push(previousData); // // 执行乐观更新 // utils.trouble.findManyWithCursor.setInfiniteData( // { // ...params, // }, // (oldData) => { // if (!oldData) return oldData; // return { // ...oldData, // pages: oldData.pages.map((page) => ({ // ...page, // items: page.items.map((item) => // item.id === variables?.troubleId // ? updateFn(item, variables) // : item // ), // })), // }; // } // ); // } // return { previousDataList }; // }, // // 错误处理:数据回滚 // onError: (_err: any, _variables: any, context: any) => { // const paramsList = troubleParams.getItems(); // paramsList.forEach((params, index) => { // if (context?.previousDataList?.[index]) { // utils.trouble.findManyWithCursor.setInfiniteData( // { ...params }, // context.previousDataList[index] // ); // } // }); // }, // // 成功后的缓存失效 // onSuccess: (_: any, variables: any) => { // utils.visitor.invalidate(); // utils.trouble.findFirst.invalidate({ // where: { // id: (variables as any)?.troubleId, // }, // }); // }, }); // 定义具体的mutation const read = api.visitor.create.useMutation( createOptimisticMutation((item) => ({ ...item, views: (item.views || 0) + 1, readed: true, })) ); const addStar = api.visitor.create.useMutation( createOptimisticMutation((item) => ({ ...item, star: true, })) ); const deleteStar = api.visitor.deleteMany.useMutation( createOptimisticMutation((item) => ({ ...item, star: false, })) ); const deleteMany = api.visitor.deleteMany.useMutation({ onSuccess() { utils.visitor.invalidate(); }, }); const createMany = api.visitor.createMany.useMutation({ onSuccess() { utils.visitor.invalidate(); utils.message.invalidate(); utils.post.invalidate(); }, }); return { troubleParams, create, createMany, deleteMany, read, addStar, deleteStar, }; }