fix(UME): 改用HTTPTransport并增强token失败提示

UME 客户端改为显式 HTTPTransport 以匹配现网可用链路,前端在手动登录/续期或断开 token 失败时优先展示后端返回的错误信息,便于快速定位问题。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-05-08 19:15:10 +08:00
parent 267eddb273
commit 2c0b52d972
2 changed files with 25 additions and 8 deletions

View file

@ -18,6 +18,7 @@ function toIsoNoMs(d: Date): string {
export function UmePage() {
const queryClient = useQueryClient();
const [tokenOpError, setTokenOpError] = useState("");
const [syncPage, setSyncPage] = useState(1);
const [syncPageSize, setSyncPageSize] = useState(20);
const [neKeyword, setNeKeyword] = useState("");
@ -71,15 +72,31 @@ export function UmePage() {
});
const tokenRefreshMutation = useMutation({
mutationFn: refreshUmeToken,
onSuccess: async () => {
onSuccess: async (res) => {
if (!res?.ok) {
setTokenOpError(String(res.error || res.error_kind || "token_refresh_failed"));
} else {
setTokenOpError("");
}
await queryClient.invalidateQueries({ queryKey: ["umeTokenStatus"] });
},
onError: (err) => {
setTokenOpError(String(err));
},
});
const tokenDisconnectMutation = useMutation({
mutationFn: disconnectUmeToken,
onSuccess: async () => {
onSuccess: async (res) => {
if (!res?.ok) {
setTokenOpError(String(res.error || res.error_kind || "token_disconnect_failed"));
} else {
setTokenOpError("");
}
await queryClient.invalidateQueries({ queryKey: ["umeTokenStatus"] });
},
onError: (err) => {
setTokenOpError(String(err));
},
});
const tokenExpiresIn = Number(tokenStatusQuery.data?.expires_in_s || 0);
@ -151,9 +168,9 @@ export function UmePage() {
断开 token
</button>
</div>
{(tokenRefreshMutation.error || tokenDisconnectMutation.error) && (
{(tokenOpError || tokenRefreshMutation.error || tokenDisconnectMutation.error) && (
<div className="pill pill--high">
操作失败: {String(tokenRefreshMutation.error || tokenDisconnectMutation.error)}
操作失败: {tokenOpError || String(tokenRefreshMutation.error || tokenDisconnectMutation.error)}
</div>
)}
</article>