@@ -9,6 +9,7 @@ import { ENGrid, EngridLogger } from ".";
99import { EnForm } from "./events" ;
1010export class FreshAddress {
1111 constructor ( ) {
12+ var _a ;
1213 this . form = EnForm . getInstance ( ) ;
1314 this . emailField = null ;
1415 this . emailWrapper = document . querySelector ( ".en__field--emailAddress" ) ;
@@ -18,8 +19,10 @@ export class FreshAddress {
1819 this . logger = new EngridLogger ( "FreshAddress" , "#039bc4" , "#dfdfdf" , "📧" ) ;
1920 this . shouldRun = true ;
2021 this . options = ENGrid . getOption ( "FreshAddress" ) ;
21- if ( this . options === false || ! window . FreshAddress )
22+ if ( this . options === false ||
23+ ( ! window . FreshAddress && ! ( ( _a = this . options ) === null || _a === void 0 ? void 0 : _a . proxyUrl ) ) ) {
2224 return ;
25+ }
2326 this . emailField = document . getElementById ( "en__field_supporter_emailAddress" ) ;
2427 if ( this . emailField ) {
2528 this . createFields ( ) ;
@@ -89,7 +92,12 @@ export class FreshAddress {
8992 return ;
9093 }
9194 this . logger . log ( "Validating " + ( ( _b = this . emailField ) === null || _b === void 0 ? void 0 : _b . value ) ) ;
92- this . callAPI ( ) ;
95+ if ( this . options && this . options . proxyUrl ) {
96+ this . callProxy ( ) ;
97+ }
98+ else {
99+ this . callAPI ( ) ;
100+ }
93101 } ) ;
94102 // Add event listener to submit
95103 this . form . onValidate . subscribe ( this . validate . bind ( this ) ) ;
@@ -192,7 +200,7 @@ export class FreshAddress {
192200 else if ( this . faStatus . value === "Invalid" ) {
193201 this . form . validate = false ;
194202 window . setTimeout ( ( ) => {
195- ENGrid . setError ( this . emailWrapper , this . faMessage . value ) ;
203+ ENGrid . setError ( this . emailWrapper , "This email address is not valid." ) ;
196204 } , 100 ) ;
197205 ( _a = this . emailField ) === null || _a === void 0 ? void 0 : _a . focus ( ) ;
198206 ENGrid . enableSubmit ( ) ;
@@ -201,4 +209,71 @@ export class FreshAddress {
201209 this . form . validate = true ;
202210 return true ;
203211 }
212+ callProxy ( ) {
213+ var _a ;
214+ if ( ! this . options || ! this . shouldRun )
215+ return ;
216+ window . FreshAddressStatus = "validating" ;
217+ ENGrid . disableSubmit ( "Validating Email Address..." ) ;
218+ fetch ( this . options . proxyUrl , {
219+ method : "POST" ,
220+ headers : {
221+ "Content-Type" : "application/json" ,
222+ } ,
223+ body : JSON . stringify ( { email : ( _a = this . emailField ) === null || _a === void 0 ? void 0 : _a . value } ) ,
224+ signal : AbortSignal . timeout ( 5000 ) ,
225+ } )
226+ . then ( ( response ) => {
227+ if ( ! response . ok ) {
228+ throw new Error ( `HTTP error ${ response . status } ` ) ;
229+ }
230+ return response . json ( ) ;
231+ } )
232+ . then ( ( data ) => {
233+ this . logger . log ( "Proxy API Response" , data ) ;
234+ this . validateProxyResponse ( data ) ;
235+ } )
236+ . catch ( ( error ) => {
237+ if ( error . name === "AbortError" ) {
238+ this . logger . log ( "Proxy API request timed out" ) ;
239+ this . writeToFields ( "Request Timeout" , "The request took too long." ) ;
240+ }
241+ else {
242+ this . logger . log ( "Proxy API Error" , error ) ;
243+ this . writeToFields ( "Service Error" , error . toString ( ) ) ;
244+ }
245+ } )
246+ . finally ( ( ) => {
247+ window . FreshAddressStatus = "idle" ;
248+ ENGrid . enableSubmit ( ) ;
249+ } ) ;
250+ }
251+ /*
252+ * Validate a request proxied to AtData's Safe To Send API.
253+ * https://docs.atdata.com/reference/safe-to-send
254+ * https://docs.atdata.com/reference/email-status
255+ * https://docs.atdata.com/reference/status-codes-safe-to-send
256+ */
257+ validateProxyResponse ( data ) {
258+ var _a ;
259+ // If response is not in expected format, log error and let through.
260+ if ( ! data . safe_to_send ) {
261+ this . logger . log ( "Invalid Proxy Response" ) ;
262+ this . writeToFields ( "Service Error" , "Invalid Proxy Response" ) ;
263+ return true ;
264+ }
265+ const res = data . safe_to_send ;
266+ ENGrid . removeError ( this . emailWrapper ) ;
267+ this . writeToFields ( res . status , res . status_code ) ;
268+ if ( [ "invalid" , "trap" ] . includes ( res . status ) ) {
269+ this . writeToFields ( "Invalid" , res . status_code ) ; // Must be "Invalid" to trigger validation error on submit
270+ ENGrid . setError ( this . emailWrapper , "This email address is not valid." ) ;
271+ ( _a = this . emailField ) === null || _a === void 0 ? void 0 : _a . focus ( ) ;
272+ if ( res . email_corrections && res . email_corrections . length > 0 ) {
273+ ENGrid . setError ( this . emailWrapper , `This email address is not valid. Did you mean ${ res . email_corrections [ 0 ] } ?` ) ;
274+ }
275+ }
276+ window . FreshAddressStatus = "idle" ;
277+ ENGrid . enableSubmit ( ) ;
278+ }
204279}
0 commit comments