Files
tkmind_go/ui/desktop/src/utils/extensionErrorUtils.ts
T

74 lines
2.5 KiB
TypeScript

/**
* Shared constants and utilities for extension error handling
*/
import { ExtensionLoadResult } from '../api/types.gen';
import { toastService, ExtensionLoadingStatus } from '../toasts';
export const MAX_ERROR_MESSAGE_LENGTH = 70;
/**
* Creates recovery hints for the "Ask goose" feature when extension loading fails
*/
export function createExtensionRecoverHints(errorMsg: string): string {
return (
`Explain the following error: ${errorMsg}. ` +
'This happened while trying to install an extension. Look out for issues where the ' +
"extension attempted to execute something incorrectly, didn't exist, or there was trouble with " +
'the network configuration - VPNs like WARP often cause issues.'
);
}
/**
* Formats an error message for display, truncating long messages with a fallback
* @param errorMsg - The full error message
* @param fallback - The fallback message to show if the error is too long
* @returns The formatted error message
*/
export function formatExtensionErrorMessage(
errorMsg: string,
fallback: string = 'Failed to add extension'
): string {
return errorMsg.length < MAX_ERROR_MESSAGE_LENGTH ? errorMsg : fallback;
}
/**
* Shows toast notifications for extension load results.
* Uses grouped toast for multiple extensions, individual error toast for single failed extension.
* @param results - Array of extension load results from the backend
*/
export function showExtensionLoadResults(results: ExtensionLoadResult[] | null | undefined): void {
if (!results || results.length === 0) {
return;
}
const failedExtensions = results.filter((r) => !r.success);
if (results.length === 1 && failedExtensions.length === 1) {
const failed = failedExtensions[0];
const errorMsg = failed.error || 'Unknown error';
const recoverHints = createExtensionRecoverHints(errorMsg);
const displayMsg = formatExtensionErrorMessage(errorMsg, 'Failed to load extension');
toastService.error({
title: failed.name,
msg: displayMsg,
traceback: errorMsg,
recoverHints,
});
return;
}
const extensionStatuses: ExtensionLoadingStatus[] = results.map((r) => {
const errorMsg = r.error || 'Unknown error';
return {
name: r.name,
status: r.success ? 'success' : 'error',
error: r.success ? undefined : errorMsg,
recoverHints: r.success ? undefined : createExtensionRecoverHints(errorMsg),
};
});
toastService.extensionLoading(extensionStatuses, results.length, true);
}