Skip to content

Commit d013efd

Browse files
authored
Merge pull request #491 from microsoft/macae-BS-UI-errorHandling
Feat: UI error handling
2 parents 41f2d9c + fc95382 commit d013efd

File tree

4 files changed

+59
-16
lines changed

4 files changed

+59
-16
lines changed

src/frontend/src/components/content/HomeInput.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,21 @@ const HomeInput: React.FC<HomeInputProps> = ({
126126
errorDetail = error?.response?.data?.detail;
127127
}
128128

129-
// Handle RAI validation errors with better UX
129+
// Handle RAI validation errors - just show description as toast
130130
if (errorDetail?.error_type === 'RAI_VALIDATION_FAILED') {
131-
setRAIError(errorDetail);
131+
const description = errorDetail.description ||
132+
"Your request contains content that doesn't meet our safety guidelines. Please try rephrasing.";
133+
showToast(description, "error");
132134
} else {
133135
// Handle other errors with toast messages
134136
const errorMessage = errorDetail?.description ||
135137
errorDetail?.message ||
136138
error?.response?.data?.message ||
137139
error?.message ||
138-
"Something went wrong";
140+
"Something went wrong. Please try again.";
141+
139142
showToast(errorMessage, "error");
140143
}
141-
142144
} finally {
143145
setInput("");
144146
setSubmitting(false);
@@ -195,7 +197,7 @@ const HomeInput: React.FC<HomeInputProps> = ({
195197
</div>
196198

197199
{/* Show RAI error if present */}
198-
{raiError && (
200+
{/* {raiError && (
199201
<RAIErrorCard
200202
error={raiError}
201203
onRetry={() => {
@@ -206,7 +208,7 @@ const HomeInput: React.FC<HomeInputProps> = ({
206208
}}
207209
onDismiss={() => setRAIError(null)}
208210
/>
209-
)}
211+
)} */}
210212

211213
<ChatInput
212214
ref={textareaRef} // forwarding

src/frontend/src/index.css

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,25 @@ body, html, :root {
66
}
77

88

9+
/* Hide raw JSON errors */
10+
body > div[style*="position: fixed"]:contains('"error_type"'),
11+
body > div[style*="bottom: 0"]:contains('RAI_VALIDATION_FAILED'),
12+
pre:contains('"message":'),
13+
.error-raw,
14+
.json-error {
15+
display: none !important;
16+
}
17+
18+
/* Hide any pre-formatted JSON that might contain error messages */
19+
pre {
20+
white-space: pre-wrap;
21+
}
22+
23+
pre:has-text('error_type'),
24+
pre:has-text('RAI_VALIDATION_FAILED') {
25+
display: none !important;
26+
}
27+
928
/* Global Custom Scrollbar */
1029
::-webkit-scrollbar {
1130
overflow-y: auto; /* Ensure scrollable content */

src/frontend/src/services/TaskService.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,27 @@ export class TaskService {
199199
return await apiService.createPlan(inputTask);
200200
} catch (error: any) {
201201
// You can customize this logic as needed
202-
let message = "Failed to create plan.";
202+
let message = "Unable to create plan. Please try again.";
203203
if (error?.response?.data?.detail) {
204-
message = error.response.data.detail;
204+
const detail = error.response.data.detail;
205+
if (typeof detail === 'string' && detail.includes('RAI_VALIDATION_FAILED')) {
206+
message = "Your request contains content that doesn't meet our safety guidelines. Please rephrase and try again.";
207+
} else if (detail.includes('quota') || detail.includes('limit')) {
208+
message = "Service is currently at capacity. Please try again in a few minutes.";
209+
} else if (detail.includes('unauthorized') || detail.includes('forbidden')) {
210+
message = "You don't have permission to create plans. Please contact your administrator.";
211+
} else {
212+
message = detail;
213+
}
205214
} else if (error?.response?.data?.message) {
206215
message = error.response.data.message;
207216
} else if (error?.message) {
208-
message = error.message;
217+
if (error.message.includes('Network Error') || error.message.includes('fetch')) {
218+
message = "Network error. Please check your connection and try again.";
219+
} else {
220+
message = error.message;
221+
}
209222
}
210-
// Throw a new error with a user-friendly message
211223
throw new Error(message);
212224
}
213225
}

src/frontend/src/utils/errorUtils.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,31 @@ export const getErrorMessage = (error: unknown): string => {
88
// Check error message patterns for different types of errors
99
const message = error.message.toLowerCase();
1010

11-
if (message.includes('400') || message.includes('bad request')) {
12-
return `Bad request: ${error.message}`;
11+
if (message.includes('400') || message.includes('bad request')) {
12+
return 'Invalid request. Please check your input and try again.';
1313
} else if (message.includes('401') || message.includes('unauthorized')) {
1414
return 'You are not authorized to perform this action. Please sign in again.';
1515
} else if (message.includes('404') || message.includes('not found')) {
16-
return `Resource not found: ${error.message}`;
16+
return 'The requested resource was not found.';
17+
} else if (message.includes('429') || message.includes('too many requests')) {
18+
return 'Too many requests. Please wait a moment and try again.';
1719
} else if (message.includes('500') || message.includes('server error')) {
18-
return `Server error: ${error.message}. Please try again later.`;
20+
return 'A server error occurred. Please try again later.';
1921
} else if (message.includes('network') || message.includes('fetch')) {
2022
return 'Network error. Please check your connection and try again.';
23+
} else if (message.includes('timeout')) {
24+
return 'Request timed out. Please try again.';
25+
} else if (message.includes('quota') || message.includes('limit')) {
26+
return 'Service limit reached. Please try again later.';
2127
}
2228

23-
return error.message;
29+
// Return original message if it's already user-friendly (doesn't contain technical terms)
30+
if (!message.includes('exception') && !message.includes('stack') &&
31+
!message.includes('undefined') && !message.includes('null')) {
32+
return error.message;
33+
}
2434
}
25-
return 'An unknown error occurred. Please try again.';
35+
return 'An unexpected error occurred. Please try again.';
2636
};
2737

2838
/**

0 commit comments

Comments
 (0)