@@ -3,6 +3,80 @@ import { RRNLRequestError } from "react-relay-network-modern/es";
3
3
4
4
import { getMessage } from "../i18n" ;
5
5
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
+
6
80
/**
7
81
* RelayNetworkRequestError wraps Request errors thrown by Relay Network Layer.
8
82
*/
@@ -11,26 +85,7 @@ export default class RelayNetworkRequestError extends Error {
11
85
public origin : RRNLRequestError ;
12
86
13
87
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 ) ) ;
34
89
35
90
// Maintains proper stack trace for where our error was thrown.
36
91
if ( Error . captureStackTrace ) {
0 commit comments