Skip to content

Commit 2f0e0e3

Browse files
leogermanidkoo
andauthored
feat: listen to gforms events for newsletters (#4312)
* feat: listen to gforms events for newsletters * Apply suggestion from @dkoo Co-authored-by: Derrick Koo <[email protected]> --------- Co-authored-by: Derrick Koo <[email protected]>
1 parent 9da18dc commit 2f0e0e3

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

src/reader-activation/index.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* globals newspack_ras_config, newspack_reader_data */
1+
/* globals newspack_ras_config, newspack_reader_data, gform */
22

33
window.newspack_ras_config = window.newspack_ras_config || {};
44

@@ -384,8 +384,10 @@ function attachAuthCookiesListener() {
384384
* Set the reader as newsletter subscriber once a newsletter form is submitted.
385385
*/
386386
function attachNewsletterFormListener() {
387-
const newspackForms = [ '.newspack-newsletters-subscribe', '.newspack-subscribe-form' ];
388-
const thirdPartyForms = [ '.mc4wp-form' ];
387+
const newspackForms = [ '.newspack-newsletters-subscribe' ];
388+
389+
// newspack-subscribe-form is a generic class that can be added to any 3rd party form. Once it's submitted, we consider the reader a newsletter subscriber.
390+
const thirdPartyForms = [ '.mc4wp-form', '.newspack-subscribe-form' ];
389391

390392
const attachHandler = ( el, eventToListenTo = 'submit' ) => {
391393
const form = 'FORM' === el.tagName ? el : el.querySelector( 'form' );
@@ -397,9 +399,32 @@ function attachNewsletterFormListener() {
397399
} );
398400
};
399401

400-
// For third-party forms, set reader data on form submit. For first-party forms, listen for the custom event upon successful signup response.
401-
document.querySelectorAll( thirdPartyForms.join( ',' ) ).forEach( el => attachHandler( el ) );
402+
const gformIds = [];
403+
404+
// For third-party forms, set reader data on form submit. Also detect Gravity Forms.
405+
document.querySelectorAll( thirdPartyForms.join( ',' ) ).forEach( el => {
406+
// If the form id stats with gform_ and it has a data-formid prop, it's a gravity form.
407+
const isGravityForm = el.id.startsWith( 'gform_' ) && el.hasAttribute( 'data-formid' );
408+
if ( isGravityForm ) {
409+
gformIds.push( parseInt( el.getAttribute( 'data-formid' ) ) );
410+
return;
411+
}
412+
// If not a gravity form, just attach the handler.
413+
attachHandler( el );
414+
} );
415+
416+
// First-party forms success event listener.
402417
document.querySelectorAll( newspackForms.join( ',' ) ).forEach( el => attachHandler( el, 'newspack-newsletters-subscribe-success' ) );
418+
419+
// Gravity forms handlers.
420+
document.addEventListener( 'gform/post_render', event => {
421+
if ( window.gform?.utils?.addAsyncFilter && gformIds.includes( event.detail?.formId ) ) {
422+
gform.utils.addAsyncFilter( 'gform/submission/pre_submission', async data => {
423+
store.set( 'is_newsletter_subscriber', true );
424+
return data;
425+
} );
426+
}
427+
} );
403428
}
404429

405430
const readerActivation = {

0 commit comments

Comments
 (0)