fix: display tauri error messages instead of object dumps
This commit is contained in:
parent
0c0d8e1caa
commit
abaf86a6ec
5 changed files with 55 additions and 12 deletions
|
|
@ -2,6 +2,7 @@ import { useState, useEffect } from "react";
|
||||||
import { useNavigate, useParams } from "react-router-dom";
|
import { useNavigate, useParams } from "react-router-dom";
|
||||||
import { open } from "@tauri-apps/plugin-dialog";
|
import { open } from "@tauri-apps/plugin-dialog";
|
||||||
import { createProject, getProject, updateProject } from "../../lib/api";
|
import { createProject, getProject, updateProject } from "../../lib/api";
|
||||||
|
import { getErrorMessage } from "../../lib/errors";
|
||||||
|
|
||||||
export default function ProjectForm() {
|
export default function ProjectForm() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
@ -49,8 +50,7 @@ export default function ProjectForm() {
|
||||||
window.dispatchEvent(new Event("orchai:refresh-projects"));
|
window.dispatchEvent(new Event("orchai:refresh-projects"));
|
||||||
navigate("/");
|
navigate("/");
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
const message = err instanceof Error ? err.message : String(err);
|
setError(getErrorMessage(err));
|
||||||
setError(message);
|
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import {
|
||||||
deleteTuleapCredentials,
|
deleteTuleapCredentials,
|
||||||
testTuleapConnection,
|
testTuleapConnection,
|
||||||
} from "../../lib/api";
|
} from "../../lib/api";
|
||||||
|
import { getErrorMessage } from "../../lib/errors";
|
||||||
import type { TuleapCredentialsSafe } from "../../lib/types";
|
import type { TuleapCredentialsSafe } from "../../lib/types";
|
||||||
|
|
||||||
export default function SettingsPage() {
|
export default function SettingsPage() {
|
||||||
|
|
@ -43,7 +44,7 @@ export default function SettingsPage() {
|
||||||
setPassword("");
|
setPassword("");
|
||||||
setSuccess("Credentials saved.");
|
setSuccess("Credentials saved.");
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
} finally {
|
} finally {
|
||||||
setSaving(false);
|
setSaving(false);
|
||||||
}
|
}
|
||||||
|
|
@ -56,7 +57,7 @@ export default function SettingsPage() {
|
||||||
const msg = await testTuleapConnection();
|
const msg = await testTuleapConnection();
|
||||||
setSuccess(msg);
|
setSuccess(msg);
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
} finally {
|
} finally {
|
||||||
setTesting(false);
|
setTesting(false);
|
||||||
}
|
}
|
||||||
|
|
@ -74,7 +75,7 @@ export default function SettingsPage() {
|
||||||
setPassword("");
|
setPassword("");
|
||||||
setSuccess("Credentials deleted.");
|
setSuccess("Credentials deleted.");
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
} finally {
|
} finally {
|
||||||
setDeleting(false);
|
setDeleting(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import {
|
||||||
getWorktreeDiff,
|
getWorktreeDiff,
|
||||||
retryTicket,
|
retryTicket,
|
||||||
} from "../../lib/api";
|
} from "../../lib/api";
|
||||||
|
import { getErrorMessage } from "../../lib/errors";
|
||||||
import type { ProcessedTicket, Worktree } from "../../lib/types";
|
import type { ProcessedTicket, Worktree } from "../../lib/types";
|
||||||
|
|
||||||
function statusBadgeClass(status: string): string {
|
function statusBadgeClass(status: string): string {
|
||||||
|
|
@ -88,7 +89,7 @@ export default function TicketDetail() {
|
||||||
setDiff(null);
|
setDiff(null);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +104,7 @@ export default function TicketDetail() {
|
||||||
await retryTicket(ticketId);
|
await retryTicket(ticketId);
|
||||||
await loadData();
|
await loadData();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
@ -115,7 +116,7 @@ export default function TicketDetail() {
|
||||||
await cancelTicket(ticketId);
|
await cancelTicket(ticketId);
|
||||||
await loadData();
|
await loadData();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
@ -128,7 +129,7 @@ export default function TicketDetail() {
|
||||||
await applyFixToBranch(worktree.id, targetBranch);
|
await applyFixToBranch(worktree.id, targetBranch);
|
||||||
await loadData();
|
await loadData();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
@ -142,7 +143,7 @@ export default function TicketDetail() {
|
||||||
setWorktree(null);
|
setWorktree(null);
|
||||||
setDiff(null);
|
setDiff(null);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useParams, useNavigate } from "react-router-dom";
|
import { useParams, useNavigate } from "react-router-dom";
|
||||||
import { addTracker, getTrackerFields } from "../../lib/api";
|
import { addTracker, getTrackerFields } from "../../lib/api";
|
||||||
|
import { getErrorMessage } from "../../lib/errors";
|
||||||
import type { FilterGroup, TrackerField, AgentConfig } from "../../lib/types";
|
import type { FilterGroup, TrackerField, AgentConfig } from "../../lib/types";
|
||||||
import FilterBuilder from "./FilterBuilder";
|
import FilterBuilder from "./FilterBuilder";
|
||||||
|
|
||||||
|
|
@ -29,7 +30,7 @@ export default function TrackerConfig() {
|
||||||
setFields(result);
|
setFields(result);
|
||||||
setFieldsLoaded(true);
|
setFieldsLoaded(true);
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
} finally {
|
} finally {
|
||||||
setFieldsLoading(false);
|
setFieldsLoading(false);
|
||||||
}
|
}
|
||||||
|
|
@ -52,7 +53,7 @@ export default function TrackerConfig() {
|
||||||
await addTracker(projectId, Number(trackerId), trackerLabel, pollingInterval, agentConfig, filters);
|
await addTracker(projectId, Number(trackerId), trackerLabel, pollingInterval, agentConfig, filters);
|
||||||
navigate(`/projects/${projectId}`);
|
navigate(`/projects/${projectId}`);
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
setError(err instanceof Error ? err.message : String(err));
|
setError(getErrorMessage(err));
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
40
src/lib/errors.ts
Normal file
40
src/lib/errors.ts
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
export function getErrorMessage(err: unknown): string {
|
||||||
|
if (err instanceof Error) {
|
||||||
|
return err.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof err === "string") {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err && typeof err === "object") {
|
||||||
|
const withMessage = err as { message?: unknown; error?: unknown };
|
||||||
|
|
||||||
|
if (typeof withMessage.message === "string") {
|
||||||
|
return withMessage.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof withMessage.error === "string") {
|
||||||
|
return withMessage.error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
withMessage.message &&
|
||||||
|
typeof withMessage.message === "object" &&
|
||||||
|
"message" in withMessage.message
|
||||||
|
) {
|
||||||
|
const nested = withMessage.message as { message?: unknown };
|
||||||
|
if (typeof nested.message === "string") {
|
||||||
|
return nested.message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return JSON.stringify(err);
|
||||||
|
} catch {
|
||||||
|
// fallthrough to String below
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(err);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue