80 lines
1.9 KiB
TypeScript
80 lines
1.9 KiB
TypeScript
/**
|
|
* Error handling utilities with Request ID extraction
|
|
* Helps users report errors with traceable IDs for support
|
|
*/
|
|
|
|
import { getLastRequestId } from './requestId'
|
|
|
|
interface ApiErrorResponse {
|
|
error?: {
|
|
code?: string
|
|
message?: string
|
|
details?: unknown
|
|
request_id?: string
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Extract request ID from error response or use last known request ID
|
|
*/
|
|
export function getRequestIdFromError(errorData?: ApiErrorResponse): string | null {
|
|
// * Try to get from error response body
|
|
if (errorData?.error?.request_id) {
|
|
return errorData.error.request_id
|
|
}
|
|
|
|
// * Fallback to last request ID stored during API call
|
|
return getLastRequestId()
|
|
}
|
|
|
|
/**
|
|
* Format error message for display with optional request ID
|
|
* Shows request ID in development or for specific error types
|
|
*/
|
|
export function formatErrorMessage(
|
|
message: string,
|
|
errorData?: ApiErrorResponse,
|
|
options: { showRequestId?: boolean } = {}
|
|
): string {
|
|
const requestId = getRequestIdFromError(errorData)
|
|
|
|
// * Always show request ID in development
|
|
const isDev = process.env.NODE_ENV === 'development'
|
|
|
|
if (requestId && (isDev || options.showRequestId)) {
|
|
return `${message}\n\nRequest ID: ${requestId}`
|
|
}
|
|
|
|
return message
|
|
}
|
|
|
|
/**
|
|
* Log error with request ID for debugging
|
|
*/
|
|
export function logErrorWithRequestId(
|
|
context: string,
|
|
error: unknown,
|
|
errorData?: ApiErrorResponse
|
|
): void {
|
|
const requestId = getRequestIdFromError(errorData)
|
|
|
|
if (requestId) {
|
|
console.error(`[${context}] Request ID: ${requestId}`, error)
|
|
} else {
|
|
console.error(`[${context}]`, error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get support message with request ID for user reports
|
|
*/
|
|
export function getSupportMessage(errorData?: ApiErrorResponse): string {
|
|
const requestId = getRequestIdFromError(errorData)
|
|
|
|
if (requestId) {
|
|
return `If this persists, contact support with Request ID: ${requestId}`
|
|
}
|
|
|
|
return 'If this persists, please contact support.'
|
|
}
|