Skip to content

Commit 797faa7

Browse files
committed
display duplicate email message from SSO in network error prompts
1 parent 8ff1dec commit 797faa7

File tree

2 files changed

+80
-21
lines changed

2 files changed

+80
-21
lines changed

client/src/core/client/framework/lib/errors/relayNetworkRequestError.ts

Lines changed: 75 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,80 @@ import { RRNLRequestError } from "react-relay-network-modern/es";
33

44
import { getMessage } from "../i18n";
55

6+
interface DupErrorObj {
7+
error?: {
8+
traceID: string;
9+
code: string;
10+
message: string;
11+
};
12+
}
13+
14+
const parseDuplicateEmailError = (
15+
error: RRNLRequestError
16+
): DupErrorObj | null => {
17+
if (!error.res || error.res.status !== 403 || !error.res.text) {
18+
return null;
19+
}
20+
21+
try {
22+
const json = JSON.parse(error.res.text) as DupErrorObj;
23+
if (!json || !json.error || json.error.code !== "DUPLICATE_EMAIL") {
24+
return null;
25+
}
26+
27+
return json;
28+
} catch {
29+
return null;
30+
}
31+
};
32+
33+
const computeCodeMessage = (
34+
error: RRNLRequestError,
35+
localeBundles: FluentBundle[]
36+
) => {
37+
if (!error.res) {
38+
return "";
39+
}
40+
41+
const codePrefix = getMessage(
42+
localeBundles,
43+
"framework-error-relayNetworkRequestError-code",
44+
"Code"
45+
);
46+
47+
let msg = `[${codePrefix}]`;
48+
if (error.res && error.res.status) {
49+
msg += ` ${error.res.status.toString()}`;
50+
}
51+
if (error.res && error.res.statusText) {
52+
msg += ` ${error.res.statusText}`;
53+
}
54+
55+
return msg;
56+
};
57+
58+
const computeMessage = (
59+
error: RRNLRequestError,
60+
localeBundles: FluentBundle[]
61+
): string => {
62+
const defaultMessage = getMessage(
63+
localeBundles,
64+
"framework-error-relayNetworkRequestError-anUnexpectedNetworkError",
65+
"An unexpected network error occured, please try again later."
66+
);
67+
68+
const dupeEmail = parseDuplicateEmailError(error);
69+
if (dupeEmail && dupeEmail.error) {
70+
return dupeEmail.error.message;
71+
}
72+
73+
if (error.res) {
74+
return `${defaultMessage} ${computeCodeMessage(error, localeBundles)}`;
75+
}
76+
77+
return defaultMessage;
78+
};
79+
680
/**
781
* RelayNetworkRequestError wraps Request errors thrown by Relay Network Layer.
882
*/
@@ -11,26 +85,7 @@ export default class RelayNetworkRequestError extends Error {
1185
public origin: RRNLRequestError;
1286

1387
constructor(error: RRNLRequestError, localeBundles: FluentBundle[]) {
14-
let msg = getMessage(
15-
localeBundles,
16-
"framework-error-relayNetworkRequestError-anUnexpectedNetworkError",
17-
"An unexpected network error occured, please try again later."
18-
);
19-
20-
if (error.res) {
21-
const codePrefix = getMessage(
22-
localeBundles,
23-
"framework-error-relayNetworkRequestError-code",
24-
"Code"
25-
);
26-
27-
msg += ` [${codePrefix}: ${error.res.status.toString()}`;
28-
if (error.res.statusText) {
29-
msg += " " + error.res.statusText;
30-
}
31-
msg += "]";
32-
}
33-
super(msg);
88+
super(computeMessage(error, localeBundles));
3489

3590
// Maintains proper stack trace for where our error was thrown.
3691
if (Error.captureStackTrace) {

server/src/core/server/errors/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,11 @@ export class DuplicateSiteAllowedOriginError extends CoralError {
318318

319319
export class DuplicateEmailError extends CoralError {
320320
constructor(email: string) {
321-
super({ code: ERROR_CODES.DUPLICATE_EMAIL, context: { pvt: { email } } });
321+
super({
322+
code: ERROR_CODES.DUPLICATE_EMAIL,
323+
context: { pvt: { email } },
324+
status: 403,
325+
});
322326
}
323327
}
324328

0 commit comments

Comments
 (0)