Skip to content

feat(esp-sync): add constant contact support#3832

Merged
dkoo merged 6 commits into
trunkfrom
feat/esp-sync-constant-contact-support
Apr 3, 2025
Merged

feat(esp-sync): add constant contact support#3832
dkoo merged 6 commits into
trunkfrom
feat/esp-sync-constant-contact-support

Conversation

@chickenn00dle

@chickenn00dle chickenn00dle commented Mar 14, 2025

Copy link
Copy Markdown
Contributor

All Submissions:

Changes proposed in this Pull Request:

Closes https://app.asana.com/1/26890605006346/project/1206274567818686/task/1209600501830288?focus=true

This PR adds ESP sync support for Constant Contact. We also take advantage of the ESP sync method when changing emails now that CC will be supported by our ESP Sync class.

Screenshot 2025-03-14 at 12 35 52

How to test the changes in this Pull Request:

  1. As admin, navigate to Newspack > Engagement > Newsletters, and set the site ESP to Contact Contact (with valid creds)
  2. Navigate to Newspack > Engagment > Show Advanced Settings > Email Service Provider (ESP) Advanced Settings
  3. Confirm you are able to set a Master List for Constant Contact
  4. As a new reader, register for a new account via the auth modal
  5. Either check the site logs for the contact sync, or go to constant contact dashboard and verify the contact was added
  6. As the reader again, purchase a recurring donation
  7. Again, either check the site logs for the contact sync, or go to constant contact dashboard and verify the contact was updated accordingly

Testing Email Change

  1. As the same reader, navigate to My Account > Account details
  2. Update the email address, and verify via the verification email
  3. One final time, check the site logs or contact contact dashboard for update

Other information:

  • Have you added an explanation of what your changes do and why you'd like us to include them?
  • Have you written new tests for your changes, as applicable?
  • Have you successfully ran tests with your changes locally?

@chickenn00dle chickenn00dle marked this pull request as ready for review March 14, 2025 20:19
@chickenn00dle chickenn00dle requested a review from a team as a code owner March 14, 2025 20:19
@chickenn00dle chickenn00dle added the [Status] Needs Review The issue or pull request needs to be reviewed label Mar 14, 2025
@github-actions github-actions Bot added [Status] Approved The pull request has been reviewed and is ready to merge and removed [Status] Needs Review The issue or pull request needs to be reviewed labels Apr 3, 2025
@dkoo dkoo merged commit 8198956 into trunk Apr 3, 2025
@dkoo dkoo deleted the feat/esp-sync-constant-contact-support branch April 3, 2025 23:11
@github-actions

github-actions Bot commented Apr 3, 2025

Copy link
Copy Markdown

Hey @chickenn00dle, good job getting this PR merged! 🎉

Now, the needs-changelog label has been added to it.

Please check if this PR needs to be included in the "Upcoming Changes" and "Release Notes" doc. If it doesn't, simply remove the label.

If it does, please add an entry to our shared document, with screenshots and testing instructions if applicable, then remove the label.

Thank you! ❤️

miguelpeixe added a commit that referenced this pull request Apr 4, 2025
* fix: path to autoload (#3808)

* fix(ia): render all emails on reset (#3867)

This fixes an issue where resetting an email template in Newspack > Settings > Emails would only render Woo templates on success.

* refactor(corrections): remove feature flag (#3866)

* feat: custom byline interface (#3746)

* feat: modify textarea to RichText and add TagInlineBlock with dummy authors

* feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel

* chore: improve inline documentation

* feat: [WIP] add author tokens on click

* feat: append users to the end of the byline

* feat: add author tokens to custom byline

* feat: handling tokens with vanilla JS (WIP)

* feat: useRef to manage tokens in use

* chore: improve inline docs

* feat: check custom byline after DOM ready

* chore: addEventListener trough ref instead of DOM directly

Also adds the return of a function on useEffect to allow React cleanup on unmount

* feat: display icons on tokens (plus to insert and close to remove)

* feat: add mutation observer to remove tokens on erasing with backspace/delete

* chore: enhance inline documentation

* fix: stylize tokens according to FormTokenField

* fix: remove token when characterData changes

* fix: improved mutation observer callback logic to update data correctly

* fix: initilize only on DOM ready and main byline element ready

* fix: properly add the mutation observer after child component is ready

* fix: implement setTokensInUse function to better reuse code

* fix: split byline "textarea" and tokens to avoid unwanted re-rendering

* feat: parse meta with <Author> before rendering byline

* feat: store byline meta according to the expected format

* chore: refacot bylineParser function

* feat: make custom bylines to work without co-author plus activated

* feat: make custom byline field to be displayed on a modal

* fix: mystype newspackByline.is_co_authors_plus_active

* fix: adding space after token insertion at the end of byline

* fix: improve byline innerHTML assignment

* fix: typo isTokensdReady

* docs: update docs

* fix: remove non used authors query

* fix: cubic-bezier transition typo

* fix: remove updateBylineMeta from click on x/removal callback event

* fix: remove unnecessary "backwards" compatibility since it's new feature

* refactor: replace MutationObserver with event listeners

Replaced the MutationObserver with an event listener, replaced some of
the DOM interaction with a useRef element, and tried to refactor some of
the data getters and setters.

* fix: update effect registration so it only runs on mounting

* refactor: remove unneded "remove token" handler

* fix: look up the byline meta on mount, not just on initial render

* fix: set contenteditable="false" on token spans

Prevents editing the content in these spans, and makes it so that
deleting (with backspace) will remove the whole span at once rather than
editing within the span.

* chore: add some missing docblocks and fix some lint issues

* fix: set default insert location to end of editable field

Updates the "cursorPos" variable logic to use the end of the line if
there's no cursor position set yet, and to add a non-breaking space at
the end of the text if necessary. Also updates the white-space styling
of the editable area, to ensure that users can select any point in the
text they may need to.

* fix: remove margin from last token to prevent confusion with whitespace

* feat: add preview to sidebar interface

* fix: rename panel to Byline

* fix: make modal width fixed

* feat: add function to parse meta for preview

* feat: default custom byline on first toggle

* feat: set default custom byline meta on toggle

* feat: update styles to match new designs

* feat: update styles to match designs

* chore: cleanup, comments, organization

---------

Co-authored-by: Leo Germani <leogermani@automattic.com>
Co-authored-by: goldenapples <goldenapplesdesign@gmail.com>
Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com>

* feat: frontend display of bylines (#3856)

* feat: modify textarea to RichText and add TagInlineBlock with dummy authors

* feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel

* chore: improve inline documentation

* feat: [WIP] add author tokens on click

* feat: append users to the end of the byline

* feat: add author tokens to custom byline

* feat: handling tokens with vanilla JS (WIP)

* feat: useRef to manage tokens in use

* chore: improve inline docs

* feat: check custom byline after DOM ready

* chore: addEventListener trough ref instead of DOM directly

Also adds the return of a function on useEffect to allow React cleanup on unmount

* feat: display icons on tokens (plus to insert and close to remove)

* feat: add mutation observer to remove tokens on erasing with backspace/delete

* chore: enhance inline documentation

* fix: stylize tokens according to FormTokenField

* fix: remove token when characterData changes

* fix: improved mutation observer callback logic to update data correctly

* fix: initilize only on DOM ready and main byline element ready

* fix: properly add the mutation observer after child component is ready

* fix: implement setTokensInUse function to better reuse code

* fix: split byline "textarea" and tokens to avoid unwanted re-rendering

* feat: parse meta with <Author> before rendering byline

* feat: store byline meta according to the expected format

* chore: refacot bylineParser function

* feat: make custom bylines to work without co-author plus activated

* feat: make custom byline field to be displayed on a modal

* fix: mystype newspackByline.is_co_authors_plus_active

* fix: adding space after token insertion at the end of byline

* fix: improve byline innerHTML assignment

* docs: update docs

* fix: typo isTokensdReady

* fix: remove non used authors query

* fix: cubic-bezier transition typo

* fix: remove updateBylineMeta from click on x/removal callback event

* fix: remove unnecessary "backwards" compatibility since it's new feature

* feat: add byline output to pre_newspack_posted_by hook

* Tried to simplify some things

Replaced the MutationObserver with an event listener, replaced some of
the DOM interaction with a useRef element, and tried to refactor some of
the data getters and setters.

* Update effects on mounting

* Remove unneded remove handler.

* Look up the byline on mount, not just on initial render.

* feat: modify textarea to RichText and add TagInlineBlock with dummy authors

* feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel

* chore: improve inline documentation

* feat: [WIP] add author tokens on click

* feat: append users to the end of the byline

* feat: add author tokens to custom byline

* feat: handling tokens with vanilla JS (WIP)

* feat: useRef to manage tokens in use

* chore: improve inline docs

* feat: check custom byline after DOM ready

* chore: addEventListener trough ref instead of DOM directly

Also adds the return of a function on useEffect to allow React cleanup on unmount

* feat: display icons on tokens (plus to insert and close to remove)

* feat: add mutation observer to remove tokens on erasing with backspace/delete

* chore: enhance inline documentation

* fix: stylize tokens according to FormTokenField

* fix: remove token when characterData changes

* fix: improved mutation observer callback logic to update data correctly

* fix: initilize only on DOM ready and main byline element ready

* fix: properly add the mutation observer after child component is ready

* fix: implement setTokensInUse function to better reuse code

* fix: split byline "textarea" and tokens to avoid unwanted re-rendering

* feat: parse meta with <Author> before rendering byline

* feat: store byline meta according to the expected format

* chore: refacot bylineParser function

* feat: make custom bylines to work without co-author plus activated

* feat: make custom byline field to be displayed on a modal

* fix: mystype newspackByline.is_co_authors_plus_active

* fix: adding space after token insertion at the end of byline

* fix: improve byline innerHTML assignment

* fix: typo isTokensdReady

* docs: update docs

* fix: remove non used authors query

* fix: cubic-bezier transition typo

* fix: remove updateBylineMeta from click on x/removal callback event

* fix: remove unnecessary "backwards" compatibility since it's new feature

* refactor: replace MutationObserver with event listeners

Replaced the MutationObserver with an event listener, replaced some of
the DOM interaction with a useRef element, and tried to refactor some of
the data getters and setters.

* fix: update effect registration so it only runs on mounting

* refactor: remove unneded "remove token" handler

* fix: look up the byline meta on mount, not just on initial render

* fix: set contenteditable="false" on token spans

Prevents editing the content in these spans, and makes it so that
deleting (with backspace) will remove the whole span at once rather than
editing within the span.

* chore: add some missing docblocks and fix some lint issues

* fix: set default insert location to end of editable field

Updates the "cursorPos" variable logic to use the end of the line if
there's no cursor position set yet, and to add a non-breaking space at
the end of the text if necessary. Also updates the white-space styling
of the editable area, to ensure that users can select any point in the
text they may need to.

* fix: remove margin from last token to prevent confusion with whitespace

* feat: add preview to sidebar interface

* fix: rename panel to Byline

* fix: make modal width fixed

* feat: add function to parse meta for preview

* feat: default custom byline on first toggle

* feat: set default custom byline meta on toggle

* feat: replace author shortcodes on output

* feat: update styles to match new designs

* feat: update styles to match designs

* chore: cleanup, comments, organization

* feat: return an array of coauthors plus authors object, for authors in use in the byline

* chore: few tweaks and linting

---------

Co-authored-by: Leo Germani <leogermani@automattic.com>
Co-authored-by: goldenapples <goldenapplesdesign@gmail.com>
Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com>

* fix: handle missing Mailchimp API key in auth status (#3873)

* fix: remove Mailchimp for WooCommerce from wizard (#3876)

* fix(notices): fix PHP notice (#3872)

* chore: remove unused `react-daterange-picker` package (#3879)

* chore: prevent PHP notice with is_singular (#3874)

* fix(guest-contributors): return them in authors query

* fix: remove the Design link from the Appearance menu (#3878)

* feat(esp-sync): add constant contact support (#3832)

* fix: add constant contact list id setting

* fix: add constant contact to Sync settings

* fix: add constant contact to reader activation settings

* chore: refactor esp settings component

* fix: regressions

---------

Co-authored-by: dkoo <derrick.koo@automattic.com>

* ci: build distributable after release

---------

Co-authored-by: Ron Chambers <116242607+ronchambers@users.noreply.github.com>
Co-authored-by: Rasmy Nguyen <raz@automattic.com>
Co-authored-by: Takshil Kunadia <71006004+Takshil-Kunadia@users.noreply.github.com>
Co-authored-by: Allyson <2000638+allysonsouza@users.noreply.github.com>
Co-authored-by: Leo Germani <leogermani@automattic.com>
Co-authored-by: goldenapples <goldenapplesdesign@gmail.com>
Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com>
Co-authored-by: Camilla Krag Jensen <naxoc@users.noreply.github.com>
Co-authored-by: matticbot <sysops+ghmatticbot@automattic.com>
Co-authored-by: Adam Cassis <adam@adamcassis.com>
Co-authored-by: Adam Cassis <adam.cassis@automattic.com>
Co-authored-by: Laurel <laurel.fulford@automattic.com>
Co-authored-by: dkoo <derrick.koo@automattic.com>
matticbot pushed a commit that referenced this pull request Apr 4, 2025
# [6.3.0-alpha.1](v6.2.2...v6.3.0-alpha.1) (2025-04-04)

### Bug Fixes

* **guest-contributors:** return them in authors query ([3703559](3703559))
* handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda))
* **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0))
* **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2))
* path to autoload ([#3808](#3808)) ([97fa24a](97fa24a))
* remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484))
* remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147))

### Features

* custom byline interface ([#3746](#3746)) ([289f55e](289f55e))
* **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956))
* frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
@matticbot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 6.3.0-alpha.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

matticbot pushed a commit that referenced this pull request Apr 9, 2025
# [6.4.0-alpha.1](v6.3.0...v6.4.0-alpha.1) (2025-04-09)

### Bug Fixes

* **guest-contributors:** return them in authors query ([3703559](3703559))
* handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda))
* **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0))
* **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2))
* path to autoload ([#3808](#3808)) ([97fa24a](97fa24a))
* remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484))
* remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147))

### Features

* custom byline interface ([#3746](#3746)) ([289f55e](289f55e))
* **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956))
* frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
@matticbot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 6.4.0-alpha.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

matticbot pushed a commit that referenced this pull request Apr 14, 2025
# [6.4.0](v6.3.1...v6.4.0) (2025-04-14)

### Bug Fixes

* **guest-contributors:** return them in authors query ([3703559](3703559))
* handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda))
* **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0))
* **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2))
* path to autoload ([#3808](#3808)) ([97fa24a](97fa24a))
* remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484))
* remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147))

### Features

* custom byline interface ([#3746](#3746)) ([289f55e](289f55e))
* **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956))
* frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
@matticbot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 6.4.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released on @alpha released [Status] Approved The pull request has been reviewed and is ready to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants