diff --git a/libs/blocks/email-collection/email-collection.js b/libs/blocks/email-collection/email-collection.js index d529c702b9a..53adaa2dc4f 100644 --- a/libs/blocks/email-collection/email-collection.js +++ b/libs/blocks/email-collection/email-collection.js @@ -14,6 +14,7 @@ import { runtimePost, redirectToSignIn, isUserGuest, + validateImsToken, FORM_FIELDS, } from './utils.js'; @@ -206,6 +207,7 @@ async function decorateInput(key, value) { } async function submitForm(form) { + await validateImsToken(); const isGuest = await isUserGuest(); if (signIn && isGuest) { await redirectToSignIn(dialog); @@ -509,6 +511,7 @@ async function checkIsSubscribed() { } async function decorate(el, blockChildren) { + await validateImsToken(); const isGuest = await isUserGuest(); if (signIn && isGuest) { await redirectToSignIn(dialog); diff --git a/libs/blocks/email-collection/utils.js b/libs/blocks/email-collection/utils.js index 36fdc4399c0..13cc1223ba2 100644 --- a/libs/blocks/email-collection/utils.js +++ b/libs/blocks/email-collection/utils.js @@ -79,11 +79,31 @@ export const FORM_FIELDS = { export async function getIMS() { if (window.adobeIMS) return window.adobeIMS; - - await loadIms(); + try { + await loadIms(); + } catch (e) { + return null; + } return window.adobeIMS; } +async function refreshIMSToken(ims) { + try { + await ims?.refreshToken(); + } catch (e) { + window.lana?.log('Refreshing IMS token failed'); + } +} + +export async function validateImsToken() { + const ims = await getIMS(); + try { + await ims?.validateToken(); + } catch (e) { + await refreshIMSToken(ims); + } +} + export async function getIMSAccessToken() { try { const ims = await getIMS(); @@ -330,7 +350,7 @@ function waitForModal() { export async function redirectToSignIn(dialog) { const ims = await getIMS(); if (!document.body.contains(dialog)) await waitForModal(); - await ims.signIn(); + await ims?.signIn(); if (dialog) closeModal(dialog); } @@ -359,5 +379,5 @@ export async function runtimePost(url, data) { export async function isUserGuest() { const ims = await getIMS(); - return !ims.isSignedInUser(); + return !ims?.isSignedInUser(); }