定时任务: - 管理员可查看/编辑/删除/触发全部用户的定时任务(新增 /api/scheduled-tasks/admin/* 接口与管理页) - 卡死任务恢复:单次执行超 30 分钟超时重试(最多 3 次),耗尽后标记 failed;看门狗回收服务重启遗留的「执行中」任务 会话分享: - 新增「只读链接」分享模式,生成公开免登录的只读对话快照页(/share/:code) - 公开接口 /api/public/shares/* 提供对话快照与图片附件 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
import {
|
|
createShare,
|
|
importShare,
|
|
listShares,
|
|
previewShare,
|
|
revokeShare,
|
|
type ThreadShareMode,
|
|
} from "./api";
|
|
|
|
export function useShares(enabled = true) {
|
|
return useQuery({
|
|
queryKey: ["thread-shares"],
|
|
queryFn: listShares,
|
|
enabled,
|
|
});
|
|
}
|
|
|
|
export function useCreateShare() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({
|
|
threadId,
|
|
mode = "import",
|
|
}: {
|
|
threadId: string;
|
|
mode?: ThreadShareMode;
|
|
}) => createShare(threadId, mode),
|
|
onSuccess: () => {
|
|
void queryClient.invalidateQueries({ queryKey: ["thread-shares"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRevokeShare() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (shareCode: string) => revokeShare(shareCode),
|
|
onSuccess: () => {
|
|
void queryClient.invalidateQueries({ queryKey: ["thread-shares"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function usePreviewShare() {
|
|
return useMutation({
|
|
mutationFn: (shareCode: string) => previewShare(shareCode),
|
|
});
|
|
}
|
|
|
|
export function useImportShare() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (shareCode: string) => importShare(shareCode),
|
|
onSuccess: () => {
|
|
// Imported conversations show up in the user's own thread list.
|
|
void queryClient.invalidateQueries({ queryKey: ["threads"] });
|
|
},
|
|
});
|
|
}
|