From 160c61e66f4189206e30874621d9259aae36574a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 5 May 2022 12:04:18 +0530 Subject: [PATCH] Handled auto unsubscribe email newsletter refs TryGhost/Team#1495 For single newsletters, the unsubscribe link on emails auto unsubscribed member from the newsletter. In case of multiple newsletters, we were missing the newsletter information on unsubscribe URL that will allow us to auto unsubscribe member from that specific newsletter as they intended, while allowing them option to manage other newsletter preferences. This change handles the newsletter param in unsubscribe link and auto unsubscribes the member from that newsletter. --- ghost/portal/src/App.js | 3 +- .../src/components/pages/UnsubscribePage.js | 33 +++++++++++++++---- ghost/portal/src/utils/helpers.js | 11 +++++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/ghost/portal/src/App.js b/ghost/portal/src/App.js index 247eca8451..2128d53ac6 100644 --- a/ghost/portal/src/App.js +++ b/ghost/portal/src/App.js @@ -399,7 +399,8 @@ export default class App extends React.Component { showPopup: true, page: 'unsubscribe', pageData: { - uuid: qParams.get('uuid') + uuid: qParams.get('uuid'), + newsletterUuid: qParams.get('newsletter') } }; } diff --git a/ghost/portal/src/components/pages/UnsubscribePage.js b/ghost/portal/src/components/pages/UnsubscribePage.js index cf0d86402c..c7926d9302 100644 --- a/ghost/portal/src/components/pages/UnsubscribePage.js +++ b/ghost/portal/src/components/pages/UnsubscribePage.js @@ -31,6 +31,14 @@ function AccountHeader() { ); } +async function updateMemberNewsletters({api, memberUuid, newsletters}) { + try { + return await api.member.updateNewsletters({uuid: memberUuid, newsletters}); + } catch (e) { + // ignore auto unsubscribe error + } +} + export default function UnsubscribePage() { const {site, pageData, onAction} = useContext(AppContext); const api = setupGhostApi({siteUrl: site.url}); @@ -48,16 +56,27 @@ export default function UnsubscribePage() { const memberData = await ghostApi.member.newsletters({uuid: pageData.uuid}); setMember(memberData); - setSubscribedNewsletters(memberData?.newsletters || []); + const memberNewsletters = memberData?.newsletters || []; + setSubscribedNewsletters(memberNewsletters); if (siteNewsletters?.length === 1) { - try { - await ghostApi.member.updateNewsletters({uuid: pageData.uuid, newsletters: []}); - } catch (e) { - // ignore auto unsubscribe error - } + const updatedData = await updateMemberNewsletters({ + api: ghostApi, + memberUuid: pageData.uuid, + newsletters: [] + }); + setSubscribedNewsletters(updatedData.newsletters); + } else if (pageData.newsletterUuid) { + const updatedData = await updateMemberNewsletters({ + api: ghostApi, + memberUuid: pageData.uuid, + newsletters: memberNewsletters?.filter((d) => { + return d.uuid !== pageData.newsletterUuid; + }) + }); + setSubscribedNewsletters(updatedData.newsletters); } })(); - }, [pageData.uuid, site.url, siteNewsletters?.length]); + }, [pageData.uuid, pageData.newsletterUuid, site.url, siteNewsletters?.length]); // Case: Email not found if (member === null) { diff --git a/ghost/portal/src/utils/helpers.js b/ghost/portal/src/utils/helpers.js index 2bf2309902..f70bdb5cca 100644 --- a/ghost/portal/src/utils/helpers.js +++ b/ghost/portal/src/utils/helpers.js @@ -73,6 +73,17 @@ export function getProductCurrency({product}) { return product.monthlyPrice.currency; } +export function getNewsletterFromUuid({site, uuid}) { + if (!uuid) { + return null; + } + + const newsletters = getSiteNewsletters({site}); + return newsletters?.find((newsletter) => { + return newsletter.uuid = uuid; + }); +} + export function getUpgradeProducts({site, member}) { const activePrice = getMemberActivePrice({member}); const activePriceCurrency = activePrice?.currency;