import {DefinitionList} from '@gravity-ui/uikit'; import type {ErrorDetails} from '../../../utils/errors/extractErrorDetails'; import i18n from '../i18n'; function formatUrlLine(method?: string, requestUrl?: string): string | undefined { if (!requestUrl) { return undefined; } if (method) { return `${method} ${requestUrl}`; } return requestUrl; } function formatProxyTargetLine( proxyTarget?: string, proxyRewrittenPath?: string, ): string | undefined { if (proxyTarget && proxyRewrittenPath) { const normalizedTarget = proxyTarget.endsWith('/') ? proxyTarget.slice(0, -1) : proxyTarget; const normalizedPath = proxyRewrittenPath.startsWith('/') ? proxyRewrittenPath : `/${proxyRewrittenPath}`; return `${normalizedTarget}${normalizedPath}`; } return proxyTarget || proxyRewrittenPath; } function isUniqueMessage( message: string | undefined, details: ErrorDetails, renderedTitle?: string, ): message is string { if (!message) { return false; } return ( message !== details.title && message !== details.dataMessage && message !== renderedTitle ); } interface ErrorFieldsListProps { details: ErrorDetails; renderedTitle?: string; className?: string; valueClassName?: string; } export function ErrorFieldsList({ details, renderedTitle, className, valueClassName, }: ErrorFieldsListProps) { const { requestUrl, method, errorCode, grpcCode, message, errorOrigin, errorStage, traceId, requestId, proxyTraceId, proxyRequestId, proxyRewrittenPath, proxyTarget, proxyName, workerName, errorPhase, networkEffectiveType, } = details; const urlLine = formatUrlLine(method, requestUrl); const proxyTargetLine = formatProxyTargetLine(proxyTarget, proxyRewrittenPath); const showMessage = isUniqueMessage(message, details, renderedTitle); return ( {urlLine && ( {urlLine} )} {errorCode && ( {errorCode} )} {grpcCode !== undefined && ( {grpcCode} )} {showMessage && ( {message} )} {errorOrigin && ( {errorOrigin} )} {errorStage && ( {errorStage} )} {errorPhase && ( {i18n(`error-details.phase_${errorPhase}`)} )} {networkEffectiveType && ( {networkEffectiveType} )} {traceId && ( {traceId} )} {requestId && ( {requestId} )} {proxyTraceId && ( {proxyTraceId} )} {proxyRequestId && ( {proxyRequestId} )} {proxyTargetLine && ( {proxyTargetLine} )} {proxyName && ( {proxyName} )} {workerName && ( {workerName} )} ); } export function hasVisibleFields(details: ErrorDetails, renderedTitle?: string): boolean { const { requestUrl, errorCode, grpcCode, errorOrigin, errorStage, traceId, requestId, proxyTraceId, proxyRequestId, proxyRewrittenPath, proxyTarget, proxyName, workerName, errorPhase, networkEffectiveType, } = details; const proxyTargetLine = formatProxyTargetLine(proxyTarget, proxyRewrittenPath); const showMessage = isUniqueMessage(details.message, details, renderedTitle); return Boolean( requestUrl || errorCode || grpcCode !== undefined || showMessage || errorOrigin || errorStage || errorPhase || networkEffectiveType || traceId || requestId || proxyTraceId || proxyRequestId || proxyTargetLine || proxyName || workerName, ); }