Displays all error messages now, not just Javascript

This commit is contained in:
Andrew Zambazos
2026-05-13 21:04:05 +12:00
parent 397714f34e
commit 6c23871833
+40 -24
View File
@@ -121,6 +121,21 @@ const EMPTY_DIFF_ICON = lucideIcon("FileDiff", { size: 44, strokeWidth: 1.6 });
const EMPTY_FILE_ICON = lucideIcon("File", { size: 44, strokeWidth: 1.6 }); const EMPTY_FILE_ICON = lucideIcon("File", { size: 44, strokeWidth: 1.6 });
const EMPTY_REPO_ICON = lucideIcon("FolderGit2", { size: 44, strokeWidth: 1.6 }); const EMPTY_REPO_ICON = lucideIcon("FolderGit2", { size: 44, strokeWidth: 1.6 });
function errorMessage(error, fallback = "Unknown error.") {
if (typeof error === "string" && error.trim()) return error;
if (error instanceof Error && error.message) return error.message;
if (error && typeof error === "object") {
if (typeof error.message === "string" && error.message.trim()) return error.message;
try {
const serialized = JSON.stringify(error);
if (serialized && serialized !== "{}") return serialized;
} catch {
// Fall through to the generic fallback.
}
}
return fallback;
}
function currentPlatform() { function currentPlatform() {
const platform = navigator.userAgentData?.platform || navigator.platform || ""; const platform = navigator.userAgentData?.platform || navigator.platform || "";
const userAgent = navigator.userAgent || ""; const userAgent = navigator.userAgent || "";
@@ -1670,7 +1685,7 @@ function bindServerFormEvents(existingServer = null) {
render(); render();
openServerForm(existingServer?.id || null); openServerForm(existingServer?.id || null);
} catch (error) { } catch (error) {
serverTestResult = `Connection test failed: ${error.message}`; serverTestResult = `Connection test failed: ${errorMessage(error)}`;
render(); render();
openServerForm(existingServer?.id || null); openServerForm(existingServer?.id || null);
} }
@@ -1733,7 +1748,7 @@ async function loadRepositories() {
currentUserLogin = user.login || ""; currentUserLogin = user.login || "";
repositories = repos; repositories = repos;
} catch (error) { } catch (error) {
settingsNotice = `Using mock repositories. API fetch failed: ${error.message}`; settingsNotice = `Using mock repositories. API fetch failed: ${errorMessage(error)}`;
currentUserLogin = "alice"; currentUserLogin = "alice";
repositories = [...mockRepos]; repositories = [...mockRepos];
} }
@@ -1811,7 +1826,7 @@ async function refreshBranches() {
try { try {
state.branches.items = await listLocalRepoBranches(state.selectedRepoPath, selectedGitPath()); state.branches.items = await listLocalRepoBranches(state.selectedRepoPath, selectedGitPath());
} catch (error) { } catch (error) {
state.branches.error = `Unable to load branches: ${error.message}`; state.branches.error = `Unable to load branches: ${errorMessage(error)}`;
} finally { } finally {
state.branches.loading = false; state.branches.loading = false;
render(); render();
@@ -1851,7 +1866,7 @@ async function refreshWorkingTree() {
await loadSelectedDiff(tree.selectedPath, false); await loadSelectedDiff(tree.selectedPath, false);
} }
} catch (error) { } catch (error) {
tree.error = `Unable to load changes: ${error.message}`; tree.error = `Unable to load changes: ${errorMessage(error)}`;
} finally { } finally {
tree.loading = false; tree.loading = false;
render(); render();
@@ -1905,7 +1920,7 @@ async function refreshSyncState({ silent = false } = {}) {
state.workingTree.behind = sync.behind; state.workingTree.behind = sync.behind;
} catch (error) { } catch (error) {
if (getState().selectedRepoPath !== repoPath) return; if (getState().selectedRepoPath !== repoPath) return;
sync.error = error.message; sync.error = errorMessage(error);
} finally { } finally {
if (getState().selectedRepoPath === repoPath) { if (getState().selectedRepoPath === repoPath) {
sync.loading = false; sync.loading = false;
@@ -1927,7 +1942,7 @@ async function loadSelectedDiff(path, shouldRender = true) {
tree.selectedDiff = await getFileDiff(state.selectedRepoPath, file.path, file.status, selectedGitPath()); tree.selectedDiff = await getFileDiff(state.selectedRepoPath, file.path, file.status, selectedGitPath());
} catch (error) { } catch (error) {
tree.selectedDiff = null; tree.selectedDiff = null;
tree.diffError = `Unable to load diff: ${error.message}`; tree.diffError = `Unable to load diff: ${errorMessage(error)}`;
} finally { } finally {
tree.diffLoading = false; tree.diffLoading = false;
if (shouldRender) render(); if (shouldRender) render();
@@ -1956,7 +1971,7 @@ async function refreshHistory() {
await loadCommitDetail(history.selectedHash, false); await loadCommitDetail(history.selectedHash, false);
} }
} catch (error) { } catch (error) {
history.error = `Unable to load history: ${error.message}`; history.error = `Unable to load history: ${errorMessage(error)}`;
} finally { } finally {
history.loading = false; history.loading = false;
render(); render();
@@ -1972,7 +1987,7 @@ async function loadCommitDetail(hash, shouldRender = true) {
try { try {
state.history.selectedCommit = await getCommitDetail(state.selectedRepoPath, hash, selectedGitPath()); state.history.selectedCommit = await getCommitDetail(state.selectedRepoPath, hash, selectedGitPath());
} catch (error) { } catch (error) {
state.history.error = `Unable to load commit: ${error.message}`; state.history.error = `Unable to load commit: ${errorMessage(error)}`;
} finally { } finally {
if (shouldRender) render(); if (shouldRender) render();
} }
@@ -2020,7 +2035,7 @@ async function scanForLocalRepos() {
} }
} catch (error) { } catch (error) {
state.localRepoScanResults = []; state.localRepoScanResults = [];
state.localRepoScanError = `Repo scan failed: ${error.message}`; state.localRepoScanError = `Repo scan failed: ${errorMessage(error)}`;
} finally { } finally {
state.localRepoScanLoading = false; state.localRepoScanLoading = false;
render(); render();
@@ -2059,7 +2074,7 @@ async function loadViewerPath(path = "") {
render(); render();
await autoLoadReadme(); await autoLoadReadme();
} catch (error) { } catch (error) {
viewer.error = `Unable to load repository contents: ${error.message}`; viewer.error = `Unable to load repository contents: ${errorMessage(error)}`;
viewer.loading = false; viewer.loading = false;
render(); render();
} }
@@ -2108,7 +2123,7 @@ async function openViewerFile(path) {
}; };
} }
} catch (error) { } catch (error) {
viewer.error = `Unable to preview file: ${error.message}`; viewer.error = `Unable to preview file: ${errorMessage(error)}`;
} finally { } finally {
viewer.loading = false; viewer.loading = false;
render(); render();
@@ -2146,7 +2161,7 @@ async function openRemoteViewer(repo) {
await loadViewerPath(""); await loadViewerPath("");
} catch (error) { } catch (error) {
viewer.loading = false; viewer.loading = false;
viewer.error = `Unable to open repository viewer: ${error.message}`; viewer.error = `Unable to open repository viewer: ${errorMessage(error)}`;
render(); render();
} }
} }
@@ -2186,7 +2201,7 @@ async function openLocalViewer() {
await loadViewerPath(""); await loadViewerPath("");
} catch (error) { } catch (error) {
viewer.loading = false; viewer.loading = false;
viewer.error = `Unable to open local viewer: ${error.message}`; viewer.error = `Unable to open local viewer: ${errorMessage(error)}`;
render(); render();
} }
} }
@@ -2201,7 +2216,7 @@ async function refreshInstalledIdes() {
state.installedIdes = await scanInstalledIdes(); state.installedIdes = await scanInstalledIdes();
} catch (error) { } catch (error) {
state.installedIdes = []; state.installedIdes = [];
state.installedIdeScanError = `Unable to scan installed IDEs: ${error.message}`; state.installedIdeScanError = `Unable to scan installed IDEs: ${errorMessage(error)}`;
} finally { } finally {
state.installedIdeScanLoading = false; state.installedIdeScanLoading = false;
render(); render();
@@ -2220,7 +2235,7 @@ async function openSelectedRepoInFileExplorer() {
await openInFileExplorer(state.selectedRepoPath); await openInFileExplorer(state.selectedRepoPath);
gitOutput = `Opened in File Explorer:\n${state.selectedRepoPath}`; gitOutput = `Opened in File Explorer:\n${state.selectedRepoPath}`;
} catch (error) { } catch (error) {
gitOutput = `Open in File Explorer failed: ${error.message}`; gitOutput = `Open in File Explorer failed: ${errorMessage(error)}`;
} finally { } finally {
utilityMenuOpen = false; utilityMenuOpen = false;
render(); render();
@@ -2240,7 +2255,7 @@ async function openSelectedRepoInCodeEditor() {
await openInExternalEditor(state.selectedRepoPath, editorCommand); await openInExternalEditor(state.selectedRepoPath, editorCommand);
gitOutput = `Opened in Code Editor with "${editorCommand}":\n${state.selectedRepoPath}`; gitOutput = `Opened in Code Editor with "${editorCommand}":\n${state.selectedRepoPath}`;
} catch (error) { } catch (error) {
gitOutput = `Open in Code Editor failed: ${error.message}`; gitOutput = `Open in Code Editor failed: ${errorMessage(error)}`;
} finally { } finally {
utilityMenuOpen = false; utilityMenuOpen = false;
render(); render();
@@ -2262,8 +2277,9 @@ async function runRepoCommand(actionName, runner, operation = "") {
const result = await runner(); const result = await runner();
gitOutput = `${actionName}: ${result.command}\n\n${result.stdout || "(no stdout)"}\n${result.stderr ? `\n${result.stderr}` : ""}`; gitOutput = `${actionName}: ${result.command}\n\n${result.stdout || "(no stdout)"}\n${result.stderr ? `\n${result.stderr}` : ""}`;
} catch (error) { } catch (error) {
gitOutput = `${actionName} failed: ${error.message}`; const message = errorMessage(error);
state.sync.error = error.message; gitOutput = `${actionName} failed: ${message}`;
state.sync.error = message;
} finally { } finally {
state.sync.operation = ""; state.sync.operation = "";
} }
@@ -2550,7 +2566,7 @@ function bindDashboardEvents() {
state.commitDescription = ""; state.commitDescription = "";
await refreshRepoData(); await refreshRepoData();
} catch (error) { } catch (error) {
gitOutput = `Commit failed: ${error.message}`; gitOutput = `Commit failed: ${errorMessage(error)}`;
render(); render();
} }
}); });
@@ -2576,7 +2592,7 @@ function bindDashboardEvents() {
state.branches.menuOpen = false; state.branches.menuOpen = false;
await refreshRepoData(); await refreshRepoData();
} catch (error) { } catch (error) {
gitOutput = `Branch switch failed: ${error.message}`; gitOutput = `Branch switch failed: ${errorMessage(error)}`;
state.branches.menuOpen = false; state.branches.menuOpen = false;
render(); render();
} }
@@ -2616,7 +2632,7 @@ function bindDashboardEvents() {
Object.assign(dialog, { mode: "", target: "", value: "", error: "" }); Object.assign(dialog, { mode: "", target: "", value: "", error: "" });
await refreshRepoData(); await refreshRepoData();
} catch (error) { } catch (error) {
dialog.error = error.message; dialog.error = errorMessage(error);
render(); render();
} }
}); });
@@ -2649,7 +2665,7 @@ function bindDashboardEvents() {
try { try {
selectedDirectory = await browseDirectory(state.settings.defaultCloneDirectory || ""); selectedDirectory = await browseDirectory(state.settings.defaultCloneDirectory || "");
} catch (error) { } catch (error) {
gitOutput = `Could not open folder picker: ${error.message}`; gitOutput = `Could not open folder picker: ${errorMessage(error)}`;
render(); render();
return; return;
} }
@@ -2682,7 +2698,7 @@ function bindDashboardEvents() {
activeView = "changes"; activeView = "changes";
await refreshRepoData(); await refreshRepoData();
} catch (error) { } catch (error) {
gitOutput = `Clone failed: ${error.message}`; gitOutput = `Clone failed: ${errorMessage(error)}`;
} }
render(); render();
}); });
@@ -2698,7 +2714,7 @@ function bindDashboardEvents() {
try { try {
selectedApplication = await browseApplication(currentValue); selectedApplication = await browseApplication(currentValue);
} catch (error) { } catch (error) {
settingsNotice = `Could not open application picker: ${error.message}`; settingsNotice = `Could not open application picker: ${errorMessage(error)}`;
render(); render();
return; return;
} }