Fixed error handling
This commit is contained in:
@@ -155,22 +155,43 @@ const ToastCard: React.FC<{
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Display errors from ProblemDetails comma-delimited detail or errors list */}
|
||||
{toast.errorsList && toast.errorsList.length > 1 ? (
|
||||
<div className="mt-1.5 space-y-1">
|
||||
<ul className="space-y-1">
|
||||
{/* Display comma-separated error items from detail property one under another */}
|
||||
{toast.errorsList && toast.errorsList.length > 0 ? (
|
||||
<div className="mt-2 space-y-1.5">
|
||||
<ul className="space-y-1.5">
|
||||
{toast.errorsList.map((err, idx) => (
|
||||
<li key={idx} className="text-xs text-rose-200/90 flex items-start gap-1.5">
|
||||
<span className="text-rose-400 mt-0.5 font-bold">•</span>
|
||||
<span className="leading-snug break-words">{err}</span>
|
||||
<li
|
||||
key={idx}
|
||||
className="text-xs text-rose-200/95 flex items-start gap-2 bg-rose-950/40 px-2.5 py-1.5 rounded-lg border border-rose-900/40"
|
||||
>
|
||||
<span className="text-rose-400 font-bold mt-0.5 text-sm leading-none">•</span>
|
||||
<span className="leading-snug break-words font-medium">{err}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
) : toast.message ? (
|
||||
<p className="text-xs mt-1.5 text-slate-300 leading-relaxed whitespace-pre-line break-words">
|
||||
{toast.message}
|
||||
</p>
|
||||
<div className="text-xs mt-1.5 text-slate-300 leading-relaxed whitespace-pre-line break-words">
|
||||
{toast.message.includes('\n') ? (
|
||||
<ul className="space-y-1.5 mt-1">
|
||||
{toast.message
|
||||
.split('\n')
|
||||
.map((l) => l.trim())
|
||||
.filter(Boolean)
|
||||
.map((line, idx) => (
|
||||
<li
|
||||
key={idx}
|
||||
className="flex items-start gap-2 text-rose-200/95 bg-rose-950/40 px-2.5 py-1.5 rounded-lg border border-rose-900/40"
|
||||
>
|
||||
<span className="text-rose-400 font-bold mt-0.5 text-sm leading-none">•</span>
|
||||
<span className="leading-snug break-words font-medium">{line.replace(/^[•\-*]\s*/, '')}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
) : (
|
||||
<p>{toast.message}</p>
|
||||
)}
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{/* Optional collapsible technical reference */}
|
||||
@@ -310,14 +331,32 @@ export const ToastProvider: React.FC<{ children: ReactNode }> = ({ children }) =
|
||||
// Parse friendly non-technical error with ProblemDetails awareness
|
||||
const parsed = parseFriendlyError(rawError, actionTitle);
|
||||
|
||||
addToast('error', parsed.title, parsed.message, {
|
||||
let finalMessage = parsed.message;
|
||||
if (
|
||||
typeof messageOrError === 'string' &&
|
||||
messageOrError.trim() &&
|
||||
!messageOrError.includes('Request failed with status code') &&
|
||||
(!parsed.hasReturnObject || !parsed.errorsList?.length)
|
||||
) {
|
||||
finalMessage = messageOrError.trim();
|
||||
}
|
||||
|
||||
let finalErrorsList = parsed.errorsList || options?.errorsList;
|
||||
if (!finalErrorsList && typeof finalMessage === 'string' && finalMessage.includes(',')) {
|
||||
const parts = finalMessage.split(',').map((p) => p.trim()).filter(Boolean);
|
||||
if (parts.length > 1) {
|
||||
finalErrorsList = parts;
|
||||
}
|
||||
}
|
||||
|
||||
addToast('error', parsed.title, finalMessage, {
|
||||
duration: options?.duration || DEFAULT_DURATIONS.error,
|
||||
statusCode: parsed.statusCode || options?.statusCode,
|
||||
category: options?.category || parsed.category,
|
||||
categoryLabel: options?.categoryLabel || parsed.categoryLabel,
|
||||
technicalDetails: parsed.technicalDetails || options?.technicalDetails,
|
||||
fieldErrors: parsed.fieldErrors || options?.fieldErrors,
|
||||
errorsList: parsed.errorsList || options?.errorsList,
|
||||
errorsList: finalErrorsList,
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user