UNPKG

@flagship.io/js-sdk

Version:
316 lines (307 loc) 12.7 kB
import { F as FS_QA_ASSISTANT_SCRIPT_TAG_ID, Q as QA_ASSISTANT_LOCAL_URL, T as TAG_QA_URL, a as FS_QA_URL, b as FS_VARIATIONS_FORCED_UNALLOCATION, c as FS_VARIATIONS_FORCED_ALLOCATION, S as SDK_INFO, d as FS_FORCED_VARIATIONS, e as FS_IS_QA_MODE_ENABLED, i as isBrowser, l as logInfoSprintf, f as TRUSTED_QA_ORIGINS, g as QA_ASSISTANT_PROD_URL, o as onDomReady, h as QA_ASSISTANT_STAGING_URL, j as TAG_QA_ASSISTANT_LOCAL, k as FS_QA_ASSISTANT_LOCAL, m as TAG_QA_ASSISTANT_STAGING, n as FS_QA_ASSISTANT_STAGING, p as TAG_QA_ASSISTANT, q as FS_QA_ASSISTANT } from './CTepUjTU.js'; import { s as sendVisitorAllocatedVariations, a as sendVisitorExposedVariations, I as INTERNAL_EVENTS, M as MSG_NAME_FROM_IFRAME } from './VuR6QkrD.js'; import 'events'; const getScriptElement = (src) => document.querySelector(`script[src*="${src}"]`); /** * * @param bundleFileUrl */ function appendScript(bundleFileUrl) { if (getScriptElement(TAG_QA_URL) || getScriptElement(FS_QA_URL)) { return; } const script = document.createElement('script'); script.src = bundleFileUrl; script.id = FS_QA_ASSISTANT_SCRIPT_TAG_ID; if (bundleFileUrl === QA_ASSISTANT_LOCAL_URL) { script.crossOrigin = 'anonymous'; } document.body.append(script); } function onQaAssistantReady(visitorVariationState) { if (visitorVariationState.visitorVariations) { sendVisitorAllocatedVariations(visitorVariationState); } if (visitorVariationState.exposedVariations) { sendVisitorExposedVariations(visitorVariationState); } } function render(forcedReFetchFlags = false) { if (SDK_INFO.name === 'TypeScript') { window.location.reload(); } const triggerRenderEvent = new CustomEvent(INTERNAL_EVENTS.FsTriggerRendering, { detail: { forcedReFetchFlags } }); window.dispatchEvent(triggerRenderEvent); } function onQaAssistantClose({ config, func, visitorVariationState }) { config.isQAModeEnabled = false; sessionStorage.removeItem(FS_IS_QA_MODE_ENABLED); if (func) { window.removeEventListener('message', func); } document.getElementById(FS_QA_ASSISTANT_SCRIPT_TAG_ID)?.remove(); visitorVariationState.forcedVariations = {}; render(); } function onApplyForcedVariations({ value, visitorVariationState }) { const sessionForcedVariations = sessionStorage.getItem(FS_FORCED_VARIATIONS); let forcedVariations = {}; try { forcedVariations = JSON.parse(sessionForcedVariations || '{}'); } catch (error) { // eslint-disable-next-line no-console console.error('Error parsing sessionForcedVariations', error); } forcedVariations = { ...forcedVariations, ...value }; sessionStorage.setItem(FS_FORCED_VARIATIONS, JSON.stringify(forcedVariations)); visitorVariationState.forcedVariations = forcedVariations; render(); } function onResetForcedVariations(visitorVariationState) { sessionStorage.removeItem(FS_FORCED_VARIATIONS); visitorVariationState.forcedVariations = {}; render(); } function removeForcedVariation(keys, visitorVariationState) { const sessionForcedVariations = sessionStorage.getItem(FS_FORCED_VARIATIONS); let forcedVariations = {}; try { forcedVariations = JSON.parse(sessionForcedVariations || '{}'); } catch (error) { // eslint-disable-next-line no-console console.error('Error parsing sessionForcedVariations', error); } keys.forEach((key) => { delete forcedVariations[key]; }); sessionStorage.setItem(FS_FORCED_VARIATIONS, JSON.stringify(forcedVariations)); visitorVariationState.forcedVariations = forcedVariations; } function onRemoveForcedVariation({ keys, visitorVariationState }) { removeForcedVariation(keys, visitorVariationState); visitorVariationState.shouldForceRender = true; render(true); } function onVariationsForcedAllocation({ value, visitorVariationState }) { sessionStorage.setItem(FS_VARIATIONS_FORCED_ALLOCATION, JSON.stringify(value)); const variationsForcedAllocation = visitorVariationState.variationsForcedAllocation || {}; const diffVariationKeys = Object.keys(variationsForcedAllocation).filter((key) => !(key in value)); if (diffVariationKeys.length > 0) { removeForcedVariation(diffVariationKeys, visitorVariationState); } visitorVariationState.variationsForcedAllocation = value; visitorVariationState.shouldForceRender = true; render(true); } function onVariationsForcedUnallocation({ value, visitorVariationState }) { sessionStorage.setItem(FS_VARIATIONS_FORCED_UNALLOCATION, JSON.stringify(value)); visitorVariationState.variationsForcedUnallocation = value; visitorVariationState.shouldForceRender = true; render(true); } function handleIframeMessage({ event, config, func, visitorVariationState }) { if (!config.isQAModeEnabled || !isBrowser()) { return; } switch (event.data.name) { case MSG_NAME_FROM_IFRAME.FsQaAssistantReady: onQaAssistantReady(visitorVariationState); break; case MSG_NAME_FROM_IFRAME.MinimizeQaAssistantClose: case MSG_NAME_FROM_IFRAME.QaAssistantClose: onQaAssistantClose({ config, func, visitorVariationState }); break; case MSG_NAME_FROM_IFRAME.FsApplyForcedVariations: onApplyForcedVariations({ value: event.data.value, visitorVariationState }); break; case MSG_NAME_FROM_IFRAME.FsResetForcedVariations: onResetForcedVariations(visitorVariationState); break; case MSG_NAME_FROM_IFRAME.FsTriggerRender: render(true); break; case MSG_NAME_FROM_IFRAME.FsVariationsForcedAllocation: onVariationsForcedAllocation({ value: event.data.value, visitorVariationState }); break; case MSG_NAME_FROM_IFRAME.FsVariationsForcedUnallocation: onVariationsForcedUnallocation({ value: event.data.value, visitorVariationState }); break; case MSG_NAME_FROM_IFRAME.FsRemoveForcedVariation: onRemoveForcedVariation({ keys: event.data.value, visitorVariationState }); break; } } function loadSessionVariations(key) { const sessionData = sessionStorage.getItem(key); let variations = {}; try { variations = JSON.parse(sessionData || '{}'); } catch (error) { // eslint-disable-next-line no-console console.error(`Error parsing ${key}`, error); } return variations; } /** * * @param config * @returns */ function loadQaAssistant(config, bundleUrl = null, visitorVariationState) { if (!window?.frames?.ABTastyQaAssistant) { logInfoSprintf(config, 'QA assistant', 'Loading QA Assistant'); appendScript(bundleUrl || QA_ASSISTANT_PROD_URL); } visitorVariationState.forcedVariations = loadSessionVariations(FS_FORCED_VARIATIONS); visitorVariationState.variationsForcedAllocation = loadSessionVariations(FS_VARIATIONS_FORCED_ALLOCATION); visitorVariationState.variationsForcedUnallocation = loadSessionVariations(FS_VARIATIONS_FORCED_UNALLOCATION); if (window.__flagshipSdkQaAssistantMessageHandler) { window.removeEventListener('message', window.__flagshipSdkQaAssistantMessageHandler); } const eventListenerMessage = (event) => { if (!TRUSTED_QA_ORIGINS.includes(event?.origin)) { return; } handleIframeMessage({ visitorVariationState, event, config, func: eventListenerMessage }); }; window.__flagshipSdkQaAssistantMessageHandler = eventListenerMessage; window.addEventListener('message', window.__flagshipSdkQaAssistantMessageHandler); config.isQAModeEnabled = true; sessionStorage.setItem(FS_IS_QA_MODE_ENABLED, 'true'); } /** * * @param config */ function listenForKeyboardQaAssistant(config, visitorVariationState) { logInfoSprintf(config, 'QA assistant', 'Listening for keyboard events to launch QA Assistant'); if (window.__flagshipSdkOnKeyCombinationDown) { document.removeEventListener('keydown', window.__flagshipSdkOnKeyCombinationDown); } if (window.__flagshipSdkOnKeyCombinationUp) { document.removeEventListener('keyup', window.__flagshipSdkOnKeyCombinationUp); } const keysPressed = {}; const keyCombinationPressed = () => { return (keysPressed.Control || keysPressed.Alt) && keysPressed.q && keysPressed.a; }; window.__flagshipSdkOnKeyCombinationDown = (event) => { keysPressed[event.key] = true; sessionStorage.removeItem(FS_FORCED_VARIATIONS); if (keyCombinationPressed()) { loadQaAssistant(config, null, visitorVariationState); } }; window.__flagshipSdkOnKeyCombinationUp = (event) => { delete keysPressed[event.key]; }; document.addEventListener('keydown', window.__flagshipSdkOnKeyCombinationDown); document.addEventListener('keyup', window.__flagshipSdkOnKeyCombinationUp); } function detectNavigationChanges(config, visitorVariationState, callback) { if (window.__flagshipSdkOriginalPushState) { window.history.pushState = window.__flagshipSdkOriginalPushState; } if (window.__flagshipSdkOriginalReplaceState) { window.history.replaceState = window.__flagshipSdkOriginalReplaceState; } if (window.__flagshipSdkPopStateHandler) { window.removeEventListener('popstate', window.__flagshipSdkPopStateHandler); } window.__flagshipSdkOriginalPushState = window.history.pushState; window.__flagshipSdkOriginalReplaceState = window.history.replaceState; function triggerCallback() { if (config.isQAModeEnabled) { visitorVariationState.navigationDetected = true; } } window.history.pushState = function (...args) { if (window.__flagshipSdkOriginalPushState) { window.__flagshipSdkOriginalPushState.apply(this, args); triggerCallback(); } }; window.history.replaceState = function (...args) { if (window.__flagshipSdkOriginalReplaceState) { window.__flagshipSdkOriginalReplaceState.apply(this, args); triggerCallback(); } }; window.__flagshipSdkPopStateHandler = () => { triggerCallback(); }; window.addEventListener('popstate', window.__flagshipSdkPopStateHandler); } /** * * @param config * @returns */ function launchQaAssistant(config, visitorVariationState) { if (!isBrowser()) { return; } onDomReady(() => { const urlMap = { [FS_QA_ASSISTANT]: QA_ASSISTANT_PROD_URL, [TAG_QA_ASSISTANT]: QA_ASSISTANT_PROD_URL, [FS_QA_ASSISTANT_STAGING]: QA_ASSISTANT_STAGING_URL, [TAG_QA_ASSISTANT_STAGING]: QA_ASSISTANT_STAGING_URL, [FS_QA_ASSISTANT_LOCAL]: QA_ASSISTANT_LOCAL_URL, [TAG_QA_ASSISTANT_LOCAL]: QA_ASSISTANT_LOCAL_URL }; const queryParam = new URLSearchParams(window.location.search); const urlKey = Object.keys(urlMap).find((key) => queryParam.get(key) === 'true') || ''; if (window.__flagshipSdkOnPlatformChoiceLoaded) { window.removeEventListener('message', window.__flagshipSdkOnPlatformChoiceLoaded); } function onPlatformChoiceLoaded(event) { if (!TRUSTED_QA_ORIGINS.includes(event.origin)) { return; } if (event.data.name === MSG_NAME_FROM_IFRAME.QaAssistantPlatformChoiceLoaded) { if (!config.isQAModeEnabled) { loadQaAssistant(config, null, visitorVariationState); } window.removeEventListener('message', onPlatformChoiceLoaded); } } window.__flagshipSdkOnPlatformChoiceLoaded = onPlatformChoiceLoaded; window.addEventListener('message', window.__flagshipSdkOnPlatformChoiceLoaded); detectNavigationChanges(config, visitorVariationState); if (config.isQAModeEnabled || urlKey) { loadQaAssistant(config, urlMap[urlKey], visitorVariationState); return; } listenForKeyboardQaAssistant(config, visitorVariationState); }); } export { launchQaAssistant }; //# sourceMappingURL=thfSquI5.js.map