diff --git a/libs/blocks/global-navigation/global-navigation.js b/libs/blocks/global-navigation/global-navigation.js index bc76e60afb..c3c3f92f50 100644 --- a/libs/blocks/global-navigation/global-navigation.js +++ b/libs/blocks/global-navigation/global-navigation.js @@ -42,6 +42,8 @@ import { import { replaceKey, replaceKeyArray } from '../../features/placeholders.js'; +const SIGNIN_CONTEXT = getConfig()?.signInContext; + function getHelpChildren() { const { unav } = getConfig(); return unav?.unavHelpChildren || [ @@ -94,8 +96,8 @@ export const CONFIG = { }, }, callbacks: { - onSignIn: () => { window.adobeIMS?.signIn(); }, - onSignUp: () => { window.adobeIMS?.signIn(); }, + onSignIn: () => { window.adobeIMS?.signIn(SIGNIN_CONTEXT); }, + onSignUp: () => { window.adobeIMS?.signIn(SIGNIN_CONTEXT); }, }, }, }, @@ -147,13 +149,12 @@ export const LANGMAP = { }; // signIn, decorateSignIn and decorateProfileTrigger can be removed if IMS takes over the profile -const signIn = () => { +const signIn = (options = {}) => { if (typeof window.adobeIMS?.signIn !== 'function') { lanaLog({ message: 'IMS signIn method not available', tags: 'errorType=warn,module=gnav' }); return; } - - window.adobeIMS.signIn(); + window.adobeIMS.signIn(options); }; const decorateSignIn = async ({ rawElem, decoratedElem }) => { @@ -166,7 +167,7 @@ const decorateSignIn = async ({ rawElem, decoratedElem }) => { signInElem.addEventListener('click', (e) => { e.preventDefault(); - signIn(); + signIn(SIGNIN_CONTEXT); }); } else { signInElem = toFragment``; @@ -183,7 +184,7 @@ const decorateSignIn = async ({ rawElem, decoratedElem }) => { dropdownSignInAnchor.replaceWith(dropdownSignInButton); dropdownSignInButton.addEventListener('click', (e) => { e.preventDefault(); - signIn(); + signIn(SIGNIN_CONTEXT); }); } else { lanaLog({ message: 'Sign in link not found in dropdown.', tags: 'errorType=warn,module=gnav' }); diff --git a/libs/blocks/gnav/gnav.js b/libs/blocks/gnav/gnav.js index 9822d83f69..00e15144ab 100644 --- a/libs/blocks/gnav/gnav.js +++ b/libs/blocks/gnav/gnav.js @@ -510,7 +510,8 @@ class Gnav { } signInEl.addEventListener('click', (e) => { e.preventDefault(); - window.adobeIMS.signIn(); + const { signInContext } = getConfig(); + window.adobeIMS.signIn(signInContext); }); profileEl.append(signIn); }; diff --git a/libs/features/jarvis-chat.js b/libs/features/jarvis-chat.js index 03e516ba21..45edf16eee 100644 --- a/libs/features/jarvis-chat.js +++ b/libs/features/jarvis-chat.js @@ -246,7 +246,7 @@ const startInitialization = async (config, event, onDemand) => { initErrorCallback: () => {}, chatStateCallback: () => {}, getContextCallback: () => {}, - signInProvider: window.adobeIMS?.signIn, + signInProvider: () => window.adobeIMS?.signIn(config.signInContext), analyticsCallback: (eventData) => { if (!window.alloy_all || !window.digitalData) return; const data = eventData?.events?.[0]?.data; diff --git a/libs/utils/utils.js b/libs/utils/utils.js index 11e4548bd5..6376ecbdda 100644 --- a/libs/utils/utils.js +++ b/libs/utils/utils.js @@ -229,6 +229,7 @@ export const [setConfig, updateConfig, getConfig] = (() => { config.base = config.miloLibs || config.codeRoot; config.locale = pathname ? getLocale(conf.locales, pathname) : getLocale(conf.locales); config.autoBlocks = conf.autoBlocks ? [...AUTO_BLOCKS, ...conf.autoBlocks] : AUTO_BLOCKS; + config.signInContext = conf.signInContext || {}; config.doNotInline = conf.doNotInline ? [...DO_NOT_INLINE, ...conf.doNotInline] : DO_NOT_INLINE; @@ -691,7 +692,8 @@ export function decorateLinks(el) { a.href = a.href.replace(loginEvent, ''); a.addEventListener('click', (e) => { e.preventDefault(); - window.adobeIMS?.signIn(); + const { signInContext } = config; + window.adobeIMS?.signIn(signInContext); }); } const copyEvent = '#_evt-copy'; diff --git a/test/blocks/global-navigation/global-navigation.test.js b/test/blocks/global-navigation/global-navigation.test.js index d28284a70f..6369824680 100644 --- a/test/blocks/global-navigation/global-navigation.test.js +++ b/test/blocks/global-navigation/global-navigation.test.js @@ -20,6 +20,7 @@ import longNav from './mocks/global-navigation-long.plain.js'; import darkNav from './mocks/dark-global-navigation.plain.js'; import navigationWithCustomLinks from './mocks/navigation-with-custom-links.plain.js'; import globalNavigationMock from './mocks/global-navigation.plain.js'; +import noDropdownNav from './mocks/global-navigation-no-dropdown.plain.js'; import { getConfig } from '../../../tools/send-to-caas/send-utils.js'; // TODO @@ -73,6 +74,23 @@ describe('global navigation', () => { expect(window.lana.log.getCalls().find((c) => c.args[0].includes('Sign in link not found in dropdown.'))).to.exist; }); + it('should render backup signInElem if no dropdown div is found', async () => { + const ogIms = window.adobeIMS; + const gnav = await createFullGlobalNavigation({ + signedIn: false, + globalNavigation: noDropdownNav, + }); + const signInElem = document.querySelector(selectors.imsSignIn); + expect(isElementVisible(signInElem)).to.equal(true); + + let signInClicked = false; + window.adobeIMS = { signIn: () => { signInClicked = true; }, isSignedInUser: () => false }; + await gnav.imsReady(); + signInElem.click(); + expect(signInClicked).to.be.true; + window.adobeIMS = ogIms; + }); + it("should log when there's issues within onReady", async () => { const ogIms = window.adobeIMS; const gnav = await createFullGlobalNavigation({}); diff --git a/test/blocks/global-navigation/mocks/global-navigation-no-dropdown.plain.js b/test/blocks/global-navigation/mocks/global-navigation-no-dropdown.plain.js new file mode 100644 index 0000000000..1f1404ed4b --- /dev/null +++ b/test/blocks/global-navigation/mocks/global-navigation-no-dropdown.plain.js @@ -0,0 +1,277 @@ +// Uses the franklin structure without any customizations +export default `
Business Resilience: Leading Through Change
++ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas + porttitor congue massa. +
+ +Creative apps and services for everyone
++ Events +
++ Primary +
++ Secondary +
+