2024-12-30 08:26:40 +08:00
|
|
|
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();
|
2024-12-30 09:22:38 +08:00
|
|
|
// utils.trouble.invalidate();
|
2024-12-30 08:26:40 +08:00
|
|
|
},
|
|
|
|
});
|
|
|
|
/**
|
|
|
|
* 通用的乐观更新mutation工厂函数
|
|
|
|
* @param updateFn 更新数据的具体逻辑函数
|
|
|
|
* @returns 封装后的mutation配置对象
|
|
|
|
*/
|
|
|
|
const createOptimisticMutation = (
|
|
|
|
updateFn: (item: any, variables: any) => any
|
|
|
|
) => ({
|
|
|
|
// 在请求发送前执行本地数据预更新
|
2024-12-30 09:22:38 +08:00
|
|
|
// onMutate: async (variables: any) => {
|
|
|
|
// const previousDataList: any[] = [];
|
|
|
|
// // 动态生成参数列表,包括星标和其他参数
|
2024-12-30 08:26:40 +08:00
|
|
|
|
2024-12-30 09:22:38 +08:00
|
|
|
// 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
|
|
|
|
// ),
|
|
|
|
// })),
|
|
|
|
// };
|
|
|
|
// }
|
|
|
|
// );
|
|
|
|
// }
|
2024-12-30 08:26:40 +08:00
|
|
|
|
2024-12-30 09:22:38 +08:00
|
|
|
// 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,
|
|
|
|
// },
|
|
|
|
// });
|
|
|
|
// },
|
2024-12-30 08:26:40 +08:00
|
|
|
});
|
|
|
|
// 定义具体的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,
|
|
|
|
};
|
|
|
|
}
|