0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-25 02:31:59 -05:00

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.
This commit is contained in:
Rishabh 2022-05-05 12:04:18 +05:30
parent 7e4ec97c0a
commit 160c61e66f
3 changed files with 39 additions and 8 deletions

View file

@ -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')
}
};
}

View file

@ -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) {

View file

@ -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;