@bikdotai/bik-component-library 0.0.860 → 0.0.861
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/feature-announcements/FeatureAnnouncementProvider.js +2 -2
- package/dist/cjs/components/feature-announcements/FeatureAnnouncementProvider.js.map +1 -1
- package/dist/cjs/components/feature-announcements/MajorUpdatePopup.js +2 -2
- package/dist/cjs/components/feature-announcements/MajorUpdatePopup.js.map +1 -1
- package/dist/cjs/components/feature-announcements/MinorUpdatePopup.js +1 -1
- package/dist/cjs/components/feature-announcements/MinorUpdatePopup.js.map +1 -1
- package/dist/esm/components/feature-announcements/FeatureAnnouncementProvider.js +420 -346
- package/dist/esm/components/feature-announcements/FeatureAnnouncementProvider.js.map +1 -1
- package/dist/esm/components/feature-announcements/MajorUpdatePopup.js +33 -35
- package/dist/esm/components/feature-announcements/MajorUpdatePopup.js.map +1 -1
- package/dist/esm/components/feature-announcements/MinorUpdatePopup.js +47 -48
- package/dist/esm/components/feature-announcements/MinorUpdatePopup.js.map +1 -1
- package/dist/esm/components/feature-announcements/types/props.types.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureAnnouncementProvider.js","sources":["../../../../src/components/feature-announcements/FeatureAnnouncementProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Joyride, { ACTIONS } from 'react-joyride';\nimport { SELECTORS } from './constants';\nimport { useFeatureAnnouncements } from './hooks';\nimport MajorUpdatePopup from './MajorUpdatePopup';\nimport MinorUpdatePopup from './MinorUpdatePopup';\nimport { FeatureAnnouncement, FeatureAnnouncementProviderProps } from './types';\nimport { VideoModal } from './VideoModal';\n\nconst FeatureAnnouncementProvider: React.FC<\n\tFeatureAnnouncementProviderProps\n> = ({\n\tchildren,\n\tfetchVisibleFeatures,\n\tgetStoreFeatureProgress,\n\tfetchFeatureById,\n\tmarkFeatureAsViewedForStore,\n\tisFeatureApplicableToCurrentPage,\n\tmodule,\n\trouter,\n\tstoreId,\n\tonAnnouncementShown,\n\tonAnnouncementInteracted,\n}) => {\n\tconst {\n\t\tmajorUpdateFeatures,\n\t\tminorUpdateFeatures,\n\t\tisLoading,\n\t\tmarkFeatureAsViewed,\n\t} = useFeatureAnnouncements({\n\t\tfetchVisibleFeatures,\n\t\tgetStoreFeatureProgress,\n\t\tfetchFeatureById,\n\t\tmarkFeatureAsViewedForStore,\n\t\tisFeatureApplicableToCurrentPage,\n\t\tmodule,\n\t\trouter,\n\t});\n\n\tconst [currentMajorFeature, setCurrentMajorFeature] =\n\t\tuseState<FeatureAnnouncement | null>(null);\n\tconst [currentMinorFeature, setCurrentMinorFeature] =\n\t\tuseState<FeatureAnnouncement | null>(null);\n\tconst [runJoyride, setRunJoyride] = useState(false);\n\tconst [joyrideSteps, setJoyrideSteps] = useState<any[]>([]);\n\tconst [runMajorJoyride, setRunMajorJoyride] = useState(false);\n\tconst [majorJoyrideSteps, setMajorJoyrideSteps] = useState<any[]>([]);\n\tconst [isProcessingMajorUpdate, setIsProcessingMajorUpdate] = useState(false);\n\tconst [isProcessingMinorUpdate, setIsProcessingMinorUpdate] = useState(false);\n\tconst [availableMinorFeatures, setAvailableMinorFeatures] = useState<\n\t\tFeatureAnnouncement[]\n\t>([]);\n\tconst [minorFeaturesSkipped, setMinorFeaturesSkipped] = useState(false);\n\tconst [showMinorUpdates, setShowMinorUpdates] = useState(false);\n\tconst [isVideoModalOpen, setIsVideoModalOpen] = useState(false);\n\tconst [videoUrl, setVideoUrl] = useState('');\n\tconst [blockPopups, setBlockPopups] = useState(false);\n\tconst [isClosingMajor, setIsClosingMajor] = useState(false);\n\tconst [isClosingMinor, setIsClosingMinor] = useState(false);\n\tconst [majorJoyrideKey, setMajorJoyrideKey] = useState(0);\n\tconst [minorJoyrideKey, setMinorJoyrideKey] = useState(0);\n\tconst [shownMinorFeatureIds, setShownMinorFeatureIds] = useState<Set<string>>(\n\t\tnew Set(),\n\t);\n\n\t// Add custom style for spotlight cutout effect\n\tuseEffect(() => {\n\t\tconst styleId = 'minor-spotlight-cutout-style';\n\t\tlet styleElement = document.getElementById(styleId) as HTMLStyleElement;\n\n\t\tif (!styleElement) {\n\t\t\tstyleElement = document.createElement('style');\n\t\t\tstyleElement.id = styleId;\n\t\t\tdocument.head.appendChild(styleElement);\n\t\t}\n\n\t\tstyleElement.textContent = `\n\t\t\t.react-joyride__spotlight {\n\t\t\t\ttransition: box-shadow 0.3s ease-in-out !important;\n\t\t\t\twill-change: box-shadow, transform;\n\t\t\t\ttransform: translateZ(0);\n\t\t\t}\n\t\t\t.react-joyride__tooltip {\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\ttransform: translateZ(0);\n\t\t\t}\n\t\t\t.react-joyride__floater {\n\t\t\t\tright: 12px !important;\n\t\t\t\tleft: auto !important;\n\t\t\t}\n\t\t`;\n\n\t\treturn () => {\n\t\t\tconst el = document.getElementById(styleId);\n\t\t\tif (el) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t// Force Joyride remount on navigation to prevent stale state\n\tuseEffect(() => {\n\t\tsetMajorJoyrideKey((prev) => prev + 1);\n\t\tsetMinorJoyrideKey((prev) => prev + 1);\n\t\tsetIsClosingMajor(false);\n\t\tsetIsClosingMinor(false);\n\t\t// Reset session tracking on navigation to allow features to show on new pages\n\t\tsetShownMinorFeatureIds(new Set());\n\t}, [router?.pathname]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tmajorUpdateFeatures.length > 0 &&\n\t\t\t!currentMajorFeature &&\n\t\t\t!isLoading &&\n\t\t\t!isProcessingMajorUpdate &&\n\t\t\t!blockPopups\n\t\t) {\n\t\t\tsetShowMinorUpdates(false);\n\t\t\tsetMinorFeaturesSkipped(false);\n\t\t\tsetRunJoyride(false);\n\t\t\tsetJoyrideSteps([]);\n\t\t\tsetCurrentMinorFeature(null);\n\t\t\tsetAvailableMinorFeatures([]);\n\n\t\t\tlet attempts = 0;\n\t\t\tconst MAX_ATTEMPTS = 10;\n\n\t\t\tconst checkWhatsNewButton = () => {\n\t\t\t\tattempts++;\n\t\t\t\tconst whatsNewButton = document.querySelector(\n\t\t\t\t\t'[data-testid=\"whats-new-button\"]',\n\t\t\t\t);\n\n\t\t\t\tif (whatsNewButton) {\n\t\t\t\t\tshowMajorUpdateJoyride(majorUpdateFeatures[0]);\n\t\t\t\t} else if (attempts < MAX_ATTEMPTS) {\n\t\t\t\t\tsetTimeout(checkWhatsNewButton, 1000);\n\t\t\t\t} else {\n\t\t\t\t\tsetShowMinorUpdates(true);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckWhatsNewButton();\n\t\t} else if (majorUpdateFeatures.length === 0 && !isLoading) {\n\t\t\tsetShowMinorUpdates(true);\n\t\t}\n\t}, [\n\t\tmajorUpdateFeatures,\n\t\tcurrentMajorFeature,\n\t\tisLoading,\n\t\tisProcessingMajorUpdate,\n\t\tblockPopups,\n\t]);\n\n\tuseEffect(() => {\n\t\t// Only run this special logic if a feature is being forced via URL\n\t\tconst featureIdFromQuery = router?.query?.['featureId'] as string;\n\n\t\tif (!featureIdFromQuery || isLoading || minorUpdateFeatures.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst forcedFeature = minorUpdateFeatures.find(\n\t\t\t(f) => f.id === featureIdFromQuery,\n\t\t);\n\n\t\tif (!forcedFeature || !forcedFeature.featureTag) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent the standard flow from interfering\n\t\tsetMinorFeaturesSkipped(true);\n\t\t// Mark that we're processing to prevent other effects from interfering\n\t\tsetIsProcessingMinorUpdate(true);\n\n\t\tlet attempts = 0;\n\t\tconst maxAttempts = 25; // 5 seconds\n\t\tconst interval = setInterval(() => {\n\t\t\tattempts++;\n\t\t\tconst targetSelector =\n\t\t\t\tforcedFeature.featureTag.startsWith('#') ||\n\t\t\t\tforcedFeature.featureTag.startsWith('.') ||\n\t\t\t\tforcedFeature.featureTag.startsWith('[')\n\t\t\t\t\t? forcedFeature.featureTag\n\t\t\t\t\t: `#${forcedFeature.featureTag}`;\n\n\t\t\tconst element = document.querySelector(targetSelector);\n\n\t\t\tif (element) {\n\t\t\t\t// In test mode, pass the feature array directly to avoid async state issues\n\t\t\t\tconst testModeFeatures = [forcedFeature];\n\t\t\t\tsetAvailableMinorFeatures(testModeFeatures);\n\t\t\t\tshowMinorUpdateJoyride(forcedFeature, testModeFeatures);\n\t\t\t\t// Don't reset processing flag here - let user interaction handle it\n\t\t\t\t// This prevents auto-closing when multiple popups exist or when scrolling\n\t\t\t\tclearInterval(interval);\n\t\t\t} else if (attempts >= maxAttempts) {\n\t\t\t\t// Fallback for safety, though user expects it to be there.\n\t\t\t\t// We could log an error here.\n\t\t\t\t// Only reset on timeout (element not found)\n\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 200);\n\n\t\treturn () => {\n\t\t\tclearInterval(interval);\n\t\t\t// Don't reset processing flag on cleanup - it causes premature popup closure\n\t\t\t// The flag will be managed by user interactions (skip/explore handlers)\n\t\t};\n\t}, [minorUpdateFeatures, router?.query?.['featureId'], isLoading]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tminorUpdateFeatures.length > 0 &&\n\t\t\t!isLoading &&\n\t\t\t!runJoyride &&\n\t\t\t!isProcessingMinorUpdate &&\n\t\t\t!currentMinorFeature &&\n\t\t\t!minorFeaturesSkipped &&\n\t\t\tshowMinorUpdates &&\n\t\t\t!blockPopups\n\t\t) {\n\t\t\tlet observer: MutationObserver | null = null;\n\t\t\tlet scrollListener: (() => void) | null = null;\n\t\t\tlet checkTimeout: ReturnType<typeof setTimeout> | null = null;\n\t\t\tlet isCleanedUp = false;\n\n\t\t\tconst checkElementsAndStartTour = () => {\n\t\t\t\tif (\n\t\t\t\t\tisCleanedUp ||\n\t\t\t\t\tisProcessingMinorUpdate ||\n\t\t\t\t\tcurrentMinorFeature ||\n\t\t\t\t\tminorFeaturesSkipped ||\n\t\t\t\t\t!showMinorUpdates\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tconst availableFeatures = minorUpdateFeatures.filter((feature) => {\n\t\t\t\t\tif (!feature.featureTag || feature.featureTag.trim() === '') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip features already shown in this session\n\t\t\t\t\tif (shownMinorFeatureIds.has(feature.id)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst targetSelector =\n\t\t\t\t\t\tfeature.featureTag.startsWith('#') ||\n\t\t\t\t\t\tfeature.featureTag.startsWith('.') ||\n\t\t\t\t\t\tfeature.featureTag.startsWith('[')\n\t\t\t\t\t\t\t? feature.featureTag\n\t\t\t\t\t\t\t: `#${feature.featureTag}`;\n\n\t\t\t\t\tconst element = document.querySelector(targetSelector);\n\t\t\t\t\treturn element !== null;\n\t\t\t\t});\n\n\t\t\t\tif (availableFeatures.length > 0) {\n\t\t\t\t\tsetAvailableMinorFeatures(availableFeatures);\n\t\t\t\t\t// Pass features directly to avoid async state issues\n\t\t\t\t\tshowMinorUpdateJoyride(availableFeatures[0], availableFeatures);\n\n\t\t\t\t\tif (observer) {\n\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\tobserver = null;\n\t\t\t\t\t}\n\t\t\t\t\tif (scrollListener) {\n\t\t\t\t\t\twindow.removeEventListener('scroll', scrollListener);\n\t\t\t\t\t\tscrollListener = null;\n\t\t\t\t\t}\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t\tcheckTimeout = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tobserver = new MutationObserver((mutations) => {\n\t\t\t\tlet shouldCheck = false;\n\t\t\t\tfor (const mutation of mutations) {\n\t\t\t\t\tif (mutation.type === 'childList' && mutation.addedNodes.length > 0) {\n\t\t\t\t\t\tfor (let i = 0; i < mutation.addedNodes.length; i++) {\n\t\t\t\t\t\t\tconst node = mutation.addedNodes[i];\n\t\t\t\t\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst element = node as Element;\n\t\t\t\t\t\t\t\tif (element.id || element.querySelector('[id]')) {\n\t\t\t\t\t\t\t\t\tshouldCheck = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldCheck) break;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!runJoyride &&\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates &&\n\t\t\t\t\tshouldCheck\n\t\t\t\t) {\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t\tcheckTimeout = setTimeout(() => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\t\t\tshowMinorUpdates\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 200);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscrollListener = () => {\n\t\t\t\tif (\n\t\t\t\t\t!runJoyride &&\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t\t// Use RAF for smoother performance synced with browser paint\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tcheckTimeout = setTimeout(() => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\t\t\t\tshowMinorUpdates\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (observer) {\n\t\t\t\tobserver.observe(document.body, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (scrollListener) {\n\t\t\t\twindow.addEventListener('scroll', scrollListener, { passive: true });\n\t\t\t}\n\n\t\t\tcheckElementsAndStartTour();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 100);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 1000);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 500);\n\n\t\t\treturn () => {\n\t\t\t\tisCleanedUp = true;\n\t\t\t\tif (observer) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t\tif (scrollListener) {\n\t\t\t\t\twindow.removeEventListener('scroll', scrollListener);\n\t\t\t\t}\n\t\t\t\tif (checkTimeout) {\n\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t}\n\t\t\t};\n\t\t} else if (minorUpdateFeatures.length === 0 || isLoading) {\n\t\t\t// Don't clear joyride if we're in test mode with an active feature\n\t\t\tconst featureIdFromQuery = router?.query?.['featureId'] as string;\n\t\t\tconst isTestModeWithActiveFeature =\n\t\t\t\tfeatureIdFromQuery && currentMinorFeature;\n\n\t\t\tif (!isTestModeWithActiveFeature) {\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetJoyrideSteps([]);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetAvailableMinorFeatures([]);\n\t\t\t\tsetMinorFeaturesSkipped(false);\n\t\t\t}\n\t\t}\n\t}, [\n\t\tminorUpdateFeatures,\n\t\tisLoading,\n\t\trunJoyride,\n\t\tisProcessingMinorUpdate,\n\t\tcurrentMinorFeature,\n\t\tminorFeaturesSkipped,\n\t\tshowMinorUpdates,\n\t\tmarkFeatureAsViewed,\n\t\tblockPopups,\n\t]);\n\n\tconst showMajorUpdateJoyride = (feature) => {\n\t\tsetCurrentMajorFeature(feature);\n\n\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t(f) => f.id === feature.id,\n\t\t);\n\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\tconst majorSteps = [\n\t\t\t{\n\t\t\t\ttarget: SELECTORS.WHATS_NEW_BUTTON,\n\t\t\t\tcontent: (\n\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\tfeature={feature}\n\t\t\t\t\t\tcurrentIndex={currentIndex}\n\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(feature)}\n\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\thandleExploreFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(feature)}\n\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(feature)}\n\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tplacement: 'bottom-start',\n\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\tdisableBeacon: true,\n\t\t\t\thideCloseButton: true,\n\t\t\t\thideSkipButton: true,\n\t\t\t\thideFooter: true,\n\t\t\t\toffset: 0,\n\t\t\t\tdata: { feature, isMajor: true },\n\t\t\t\tstyles: {\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t},\n\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t},\n\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tsetMajorJoyrideSteps(majorSteps);\n\t\tsetRunMajorJoyride(true);\n\n\t\t// Fire announcement shown callback\n\t\tif (onAnnouncementShown && storeId) {\n\t\t\tonAnnouncementShown({\n\t\t\t\tstoreId,\n\t\t\t\tannouncementId: feature.id,\n\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleSkipMajorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (targetFeature) {\n\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tmajorUpdateFeatures.map((majorFeature) =>\n\t\t\t\t\t\tmarkFeatureAsViewed(majorFeature.id),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\n\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\t// Fire announcement interacted callback for Skip\n\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\tannouncementId: targetFeature.id,\n\t\t\t\t\t\tannouncementTitle: targetFeature.title,\n\t\t\t\t\t\timageUrl: targetFeature.displayImage || targetFeature.image,\n\t\t\t\t\t\tvideoUrl: targetFeature.productVideo,\n\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handleExploreFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMajorUpdate(true);\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\t\t\tconst action = triggeredAction ?? feature.primaryButton?.action;\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tif (action === 'Open link') {\n\t\t\t\tconst url =\n\t\t\t\t\tfeature.primaryButton?.redirectionUrl || feature.redirectUrl;\n\t\t\t\tif (url && !url.startsWith('http')) {\n\t\t\t\t\twindow.location.href = url;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetRunMajorJoyride(false);\n\t\t\tsetCurrentMajorFeature(null);\n\t\t\tsetMajorJoyrideSteps([]);\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === feature.id,\n\t\t\t);\n\t\t\tconst isLastMajorUpdate = currentIndex === majorUpdateFeatures.length - 1;\n\t\t\tif (isLastMajorUpdate) {\n\t\t\t\tsetShowMinorUpdates(true);\n\t\t\t}\n\n\t\t\t// Fire announcement interacted callback for Primary button\n\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\tstoreId,\n\t\t\t\t\tannouncementId: feature.id,\n\t\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t\t\tbuttonClicked: 'Primary',\n\t\t\t\t\tbuttonName: feature.buttonText || 'Explore',\n\t\t\t\t\tbuttonUrl: feature.redirectUrl || feature.productVideo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t}, 500);\n\t\t},\n\t\t[majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handlePreviousMajorUpdate = useCallback(\n\t\t(feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex > 0) {\n\t\t\t\tconst prevFeature = majorUpdateFeatures[currentIndex - 1];\n\t\t\t\tsetCurrentMajorFeature(prevFeature);\n\n\t\t\t\tconst prevIndex = currentIndex - 1;\n\t\t\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: '[data-testid=\"whats-new-button\"]',\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={prevFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={prevIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom-start',\n\t\t\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: prevFeature, isMajor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetMajorJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures],\n\t);\n\n\tconst handleNextMajorUpdate = useCallback(\n\t\t(feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex < majorUpdateFeatures.length - 1) {\n\t\t\t\tconst nextFeature = majorUpdateFeatures[currentIndex + 1];\n\t\t\t\tsetCurrentMajorFeature(nextFeature);\n\n\t\t\t\tconst nextIndex = currentIndex + 1;\n\t\t\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: '[data-testid=\"whats-new-button\"]',\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={nextFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={nextIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom-start',\n\t\t\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: nextFeature, isMajor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetMajorJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\tmarkFeatureAsViewed(targetFeature.id);\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\n\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst showMajorUpdatePopup = () => {\n\t\tif (majorUpdateFeatures.length > 0 && !currentMajorFeature) {\n\t\t\tconst whatsNewButton = document.querySelector(\n\t\t\t\t'[data-testid=\"whats-new-button\"]',\n\t\t\t);\n\n\t\t\tif (whatsNewButton) {\n\t\t\t\tshowMajorUpdateJoyride(majorUpdateFeatures[0]);\n\t\t\t}\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\t(window as any).showMajorUpdatePopup = showMajorUpdatePopup;\n\t\treturn () => {\n\t\t\tdelete (window as any).showMajorUpdatePopup;\n\t\t};\n\t}, [majorUpdateFeatures, currentMajorFeature]);\n\tconst handleMajorJoyrideCallback = useCallback(\n\t\t(data) => {\n\t\t\tconst { action } = data;\n\n\t\t\tif (action === ACTIONS.CLOSE) {\n\t\t\t\tif (currentMajorFeature) {\n\t\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\t\tmajorUpdateFeatures.forEach((majorFeature) => {\n\t\t\t\t\t\tmarkFeatureAsViewed(majorFeature.id);\n\t\t\t\t\t});\n\n\t\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handleMinorJoyrideCallback = useCallback(\n\t\t(data) => {\n\t\t\tconst { action } = data;\n\n\t\t\tif (action === ACTIONS.CLOSE) {\n\t\t\t\tif (currentMinorFeature) {\n\t\t\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t\t\t// Only mark the current feature as viewed, not all features\n\t\t\t\t\tmarkFeatureAsViewed(currentMinorFeature.id);\n\n\t\t\t\t\t// Check if there are more features to show\n\t\t\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t\t\t(f) => f.id === currentMinorFeature.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst isLastFeature =\n\t\t\t\t\t\tcurrentIndex === availableMinorFeatures.length - 1;\n\n\t\t\t\t\tif (isLastFeature) {\n\t\t\t\t\t\t// Only skip remaining features if this was the last one\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures, markFeatureAsViewed],\n\t);\n\tconst showMinorUpdateJoyride = async (feature, featuresToUse?) => {\n\t\tsetCurrentMinorFeature(feature);\n\n\t\t// Use provided features array or fall back to state (for test mode)\n\t\tconst features = featuresToUse || availableMinorFeatures;\n\t\tconst currentIndex = features.findIndex((f) => f.id === feature.id);\n\t\tconst totalFeatures = features.length;\n\n\t\tconst targetSelector =\n\t\t\tfeature.featureTag.startsWith('#') ||\n\t\t\tfeature.featureTag.startsWith('.') ||\n\t\t\tfeature.featureTag.startsWith('[')\n\t\t\t\t? feature.featureTag\n\t\t\t\t: `#${feature.featureTag}`;\n\n\t\t// Scroll to target element smoothly before showing popup\n\t\tconst targetElement = document.querySelector(targetSelector);\n\t\tif (targetElement) {\n\t\t\ttry {\n\t\t\t\t// Dynamically import to avoid circular dependencies\n\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t);\n\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t} catch (error) {\n\t\t\t\t// Scroll failed silently\n\t\t\t}\n\t\t}\n\n\t\tconst minorSteps = [\n\t\t\t{\n\t\t\t\ttarget: targetSelector,\n\t\t\t\tcontent: (\n\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\tfeature={feature}\n\t\t\t\t\t\tcurrentIndex={currentIndex}\n\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(feature)}\n\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\thandleExploreMinorFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(feature)}\n\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(feature)}\n\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tplacement: 'bottom',\n\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\tdisableBeacon: true,\n\t\t\t\thideCloseButton: true,\n\t\t\t\thideSkipButton: true,\n\t\t\t\thideFooter: true,\n\t\t\t\toffset: 0,\n\t\t\t\tdata: { feature, isMinor: true },\n\t\t\t\tstyles: {\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t},\n\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t},\n\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tsetJoyrideSteps(minorSteps);\n\t\tsetRunJoyride(true);\n\t};\n\n\tconst handleSkipMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (targetFeature) {\n\t\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t\t// Only mark the current feature as viewed, not all features\n\t\t\t\tawait markFeatureAsViewed(targetFeature.id);\n\n\t\t\t\t// Add to session tracker to prevent re-showing\n\t\t\t\tsetShownMinorFeatureIds((prev) => new Set(prev).add(targetFeature.id));\n\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\n\t\t\t\t// Find next unshown feature\n\t\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t\t(f) => f.id !== targetFeature.id && !shownMinorFeatureIds.has(f.id),\n\t\t\t\t);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\n\t\t\t\t\tif (nextFeature) {\n\t\t\t\t\t\t// Auto-advance to next feature\n\t\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No more features to show\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tcurrentMinorFeature,\n\t\t\tavailableMinorFeatures,\n\t\t\tmarkFeatureAsViewed,\n\t\t\tshownMinorFeatureIds,\n\t\t],\n\t);\n\n\tconst handleExploreMinorFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t// Only mark the current feature as viewed\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\n\t\t\t// Add to session tracker to prevent re-showing\n\t\t\tsetShownMinorFeatureIds((prev) => new Set(prev).add(feature.id));\n\n\t\t\tconst action = triggeredAction ?? feature.primaryButton?.action;\n\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tif (action === 'Open link') {\n\t\t\t\tconst url =\n\t\t\t\t\tfeature.primaryButton?.redirectionUrl || feature.redirectUrl;\n\t\t\t\tif (url && !url.startsWith('http')) {\n\t\t\t\t\twindow.location.href = url;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetRunJoyride(false);\n\t\t\tsetCurrentMinorFeature(null);\n\t\t\tsetJoyrideSteps([]);\n\n\t\t\t// Find next unshown feature (only auto-advance if no video modal)\n\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t(f) => f.id !== feature.id && !shownMinorFeatureIds.has(f.id),\n\t\t\t);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMinorUpdate(false);\n\n\t\t\t\t// Only auto-advance if no video modal is opened\n\t\t\t\tif (nextFeature && action !== 'Play Video') {\n\t\t\t\t\t// Auto-advance to next feature\n\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t} else if (!nextFeature) {\n\t\t\t\t\t// No more features to show\n\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t}\n\t\t\t\t// If video modal opened, wait for user to close it before advancing\n\t\t\t}, 500);\n\t\t},\n\t\t[availableMinorFeatures, markFeatureAsViewed, shownMinorFeatureIds],\n\t);\n\n\tconst handlePreviousMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex > 0) {\n\t\t\t\tconst prevFeature = availableMinorFeatures[currentIndex - 1];\n\t\t\t\tsetCurrentMinorFeature(prevFeature);\n\n\t\t\t\tconst targetSelector =\n\t\t\t\t\tprevFeature.featureTag.startsWith('#') ||\n\t\t\t\t\tprevFeature.featureTag.startsWith('.') ||\n\t\t\t\t\tprevFeature.featureTag.startsWith('[')\n\t\t\t\t\t\t? prevFeature.featureTag\n\t\t\t\t\t\t: `#${prevFeature.featureTag}`;\n\n\t\t\t\t// Scroll to the previous feature element\n\t\t\t\tconst targetElement = document.querySelector(targetSelector);\n\t\t\t\tif (targetElement) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Scroll failed silently\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst prevIndex = currentIndex - 1;\n\t\t\t\tconst totalFeatures = availableMinorFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={prevFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={prevIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreMinorFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom',\n\t\t\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: prevFeature, isMinor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetJoyrideSteps(updatedSteps);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures],\n\t);\n\n\tconst handleNextMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex < availableMinorFeatures.length - 1) {\n\t\t\t\tconst nextFeature = availableMinorFeatures[currentIndex + 1];\n\t\t\t\tsetCurrentMinorFeature(nextFeature);\n\n\t\t\t\tconst targetSelector =\n\t\t\t\t\tnextFeature.featureTag.startsWith('#') ||\n\t\t\t\t\tnextFeature.featureTag.startsWith('.') ||\n\t\t\t\t\tnextFeature.featureTag.startsWith('[')\n\t\t\t\t\t\t? nextFeature.featureTag\n\t\t\t\t\t\t: `#${nextFeature.featureTag}`;\n\n\t\t\t\t// Scroll to the next feature element\n\t\t\t\tconst targetElement = document.querySelector(targetSelector);\n\t\t\t\tif (targetElement) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Scroll failed silently\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst nextIndex = currentIndex + 1;\n\t\t\t\tconst totalFeatures = availableMinorFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={nextFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={nextIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreMinorFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom',\n\t\t\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: nextFeature, isMinor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\tsetIsProcessingMinorUpdate(true);\n\t\t\t\tsetMinorFeaturesSkipped(true);\n\n\t\t\t\tmarkFeatureAsViewed(targetFeature.id);\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures, markFeatureAsViewed],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{children}\n\n\t\t\t{majorJoyrideSteps.length > 0 && (\n\t\t\t\t<Joyride\n\t\t\t\t\tkey={`major-joyride-${majorJoyrideKey}`}\n\t\t\t\t\tsteps={majorJoyrideSteps}\n\t\t\t\t\trun={runMajorJoyride}\n\t\t\t\t\tcontinuous={false}\n\t\t\t\t\tshowProgress={false}\n\t\t\t\t\tshowSkipButton={false}\n\t\t\t\t\tcallback={handleMajorJoyrideCallback}\n\t\t\t\t\tdisableOverlayClose={false}\n\t\t\t\t\tdisableCloseOnEsc={false}\n\t\t\t\t\tdisableOverlay={false}\n\t\t\t\t\tspotlightClicks={false}\n\t\t\t\t\tstyles={{\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tprimaryColor: '#007bff',\n\t\t\t\t\t\t\tzIndex: 10000,\n\t\t\t\t\t\t\twidth: 'auto',\n\t\t\t\t\t\t\tarrowColor: isClosingMajor ? 'transparent' : '#212121',\n\t\t\t\t\t\t},\n\t\t\t\t\t\toverlay: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspotlight: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tlocale={{\n\t\t\t\t\t\tback: 'Back',\n\t\t\t\t\t\tclose: 'Close',\n\t\t\t\t\t\tlast: 'Close',\n\t\t\t\t\t\tnext: 'Next',\n\t\t\t\t\t\tskip: 'Skip',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{joyrideSteps.length > 0 && (\n\t\t\t\t<Joyride\n\t\t\t\t\tkey={`minor-joyride-${minorJoyrideKey}`}\n\t\t\t\t\tsteps={joyrideSteps}\n\t\t\t\t\trun={runJoyride}\n\t\t\t\t\tcontinuous={false}\n\t\t\t\t\tshowProgress={false}\n\t\t\t\t\tshowSkipButton={false}\n\t\t\t\t\tcallback={handleMinorJoyrideCallback}\n\t\t\t\t\tdisableOverlayClose={false}\n\t\t\t\t\tdisableCloseOnEsc={false}\n\t\t\t\t\tdisableOverlay={false}\n\t\t\t\t\tscrollToFirstStep={true}\n\t\t\t\t\tscrollOffset={120}\n\t\t\t\t\tdisableScrolling={false}\n\t\t\t\t\tstyles={{\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tprimaryColor: '#007bff',\n\t\t\t\t\t\t\tzIndex: 10000,\n\t\t\t\t\t\t\twidth: 'auto',\n\t\t\t\t\t\t\tarrowColor: isClosingMinor ? 'transparent' : '#ffffff',\n\t\t\t\t\t\t},\n\t\t\t\t\t\toverlay: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspotlight: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborderRadius: '8px',\n\t\t\t\t\t\t\tboxShadow: isClosingMinor\n\t\t\t\t\t\t\t\t? 'none'\n\t\t\t\t\t\t\t\t: '0 0 0 9999px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(255, 255, 255, 0.8), 0 0 20px 8px rgba(255, 255, 255, 0.4)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tlocale={{\n\t\t\t\t\t\tback: 'Back',\n\t\t\t\t\t\tclose: 'Close',\n\t\t\t\t\t\tlast: 'Close',\n\t\t\t\t\t\tnext: 'Next',\n\t\t\t\t\t\tskip: 'Skip',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<VideoModal\n\t\t\t\tisOpen={isVideoModalOpen}\n\t\t\t\tvideoUrl={videoUrl}\n\t\t\t\tonClose={() => {\n\t\t\t\t\tsetIsVideoModalOpen(false);\n\t\t\t\t\tsetVideoUrl('');\n\t\t\t\t\tsetBlockPopups(false);\n\n\t\t\t\t\t// After video modal closes, check if there are more features to show\n\t\t\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t\t\t(f) => !shownMinorFeatureIds.has(f.id),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (nextFeature) {\n\t\t\t\t\t\t// Auto-advance to next feature after video\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No more features to show\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nexport default FeatureAnnouncementProvider;\n"],"names":["FeatureAnnouncementProvider","children","fetchVisibleFeatures","getStoreFeatureProgress","fetchFeatureById","markFeatureAsViewedForStore","isFeatureApplicableToCurrentPage","module","router","storeId","onAnnouncementShown","onAnnouncementInteracted","majorUpdateFeatures","minorUpdateFeatures","isLoading","markFeatureAsViewed","useFeatureAnnouncements","currentMajorFeature","setCurrentMajorFeature","useState","currentMinorFeature","setCurrentMinorFeature","runJoyride","setRunJoyride","joyrideSteps","setJoyrideSteps","runMajorJoyride","setRunMajorJoyride","majorJoyrideSteps","setMajorJoyrideSteps","isProcessingMajorUpdate","setIsProcessingMajorUpdate","isProcessingMinorUpdate","setIsProcessingMinorUpdate","availableMinorFeatures","setAvailableMinorFeatures","minorFeaturesSkipped","setMinorFeaturesSkipped","showMinorUpdates","setShowMinorUpdates","isVideoModalOpen","setIsVideoModalOpen","videoUrl","setVideoUrl","blockPopups","setBlockPopups","isClosingMajor","setIsClosingMajor","isClosingMinor","setIsClosingMinor","majorJoyrideKey","setMajorJoyrideKey","minorJoyrideKey","setMinorJoyrideKey","shownMinorFeatureIds","setShownMinorFeatureIds","useEffect","styleId","styleElement","el","prev","attempts","MAX_ATTEMPTS","checkWhatsNewButton","showMajorUpdateJoyride","featureIdFromQuery","forcedFeature","f","maxAttempts","interval","targetSelector","testModeFeatures","showMinorUpdateJoyride","observer","scrollListener","checkTimeout","isCleanedUp","checkElementsAndStartTour","availableFeatures","feature","mutations","shouldCheck","mutation","i","node","element","currentIndex","totalFeatures","majorSteps","SELECTORS","jsx","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","jsxs","Fragment","Joyride","VideoModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FeatureAnnouncementProvider.js","sources":["../../../../src/components/feature-announcements/FeatureAnnouncementProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Joyride, { ACTIONS } from 'react-joyride';\nimport { SELECTORS } from './constants';\nimport { useFeatureAnnouncements } from './hooks';\nimport MajorUpdatePopup from './MajorUpdatePopup';\nimport MinorUpdatePopup from './MinorUpdatePopup';\nimport { FeatureAnnouncement, FeatureAnnouncementProviderProps } from './types';\nimport { VideoModal } from './VideoModal';\n\nconst FeatureAnnouncementProvider: React.FC<\n\tFeatureAnnouncementProviderProps\n> = ({\n\tchildren,\n\tfetchVisibleFeatures,\n\tgetStoreFeatureProgress,\n\tfetchFeatureById,\n\tmarkFeatureAsViewedForStore,\n\tisFeatureApplicableToCurrentPage,\n\tmodule,\n\trouter,\n\tstoreId,\n\tonAnnouncementShown,\n\tonAnnouncementInteracted,\n}) => {\n\tconst {\n\t\tmajorUpdateFeatures,\n\t\tminorUpdateFeatures,\n\t\tisLoading,\n\t\tmarkFeatureAsViewed,\n\t} = useFeatureAnnouncements({\n\t\tfetchVisibleFeatures,\n\t\tgetStoreFeatureProgress,\n\t\tfetchFeatureById,\n\t\tmarkFeatureAsViewedForStore,\n\t\tisFeatureApplicableToCurrentPage,\n\t\tmodule,\n\t\trouter,\n\t});\n\n\tconst [currentMajorFeature, setCurrentMajorFeature] =\n\t\tuseState<FeatureAnnouncement | null>(null);\n\tconst [currentMinorFeature, setCurrentMinorFeature] =\n\t\tuseState<FeatureAnnouncement | null>(null);\n\tconst [runJoyride, setRunJoyride] = useState(false);\n\tconst [joyrideSteps, setJoyrideSteps] = useState<any[]>([]);\n\tconst [runMajorJoyride, setRunMajorJoyride] = useState(false);\n\tconst [majorJoyrideSteps, setMajorJoyrideSteps] = useState<any[]>([]);\n\tconst [isProcessingMajorUpdate, setIsProcessingMajorUpdate] = useState(false);\n\tconst [isProcessingMinorUpdate, setIsProcessingMinorUpdate] = useState(false);\n\tconst [availableMinorFeatures, setAvailableMinorFeatures] = useState<\n\t\tFeatureAnnouncement[]\n\t>([]);\n\tconst [minorFeaturesSkipped, setMinorFeaturesSkipped] = useState(false);\n\tconst [showMinorUpdates, setShowMinorUpdates] = useState(false);\n\tconst [isVideoModalOpen, setIsVideoModalOpen] = useState(false);\n\tconst [videoUrl, setVideoUrl] = useState('');\n\tconst [blockPopups, setBlockPopups] = useState(false);\n\tconst [isClosingMajor, setIsClosingMajor] = useState(false);\n\tconst [isClosingMinor, setIsClosingMinor] = useState(false);\n\tconst [majorJoyrideKey, setMajorJoyrideKey] = useState(0);\n\tconst [minorJoyrideKey, setMinorJoyrideKey] = useState(0);\n\tconst [shownMinorFeatureIds, setShownMinorFeatureIds] = useState<Set<string>>(\n\t\tnew Set(),\n\t);\n\n\t// Add custom style for spotlight cutout effect\n\tuseEffect(() => {\n\t\tconst styleId = 'minor-spotlight-cutout-style';\n\t\tlet styleElement = document.getElementById(styleId) as HTMLStyleElement;\n\n\t\tif (!styleElement) {\n\t\t\tstyleElement = document.createElement('style');\n\t\t\tstyleElement.id = styleId;\n\t\t\tdocument.head.appendChild(styleElement);\n\t\t}\n\n\t\tstyleElement.textContent = `\n\t\t\t.react-joyride__spotlight {\n\t\t\t\ttransition: box-shadow 0.3s ease-in-out !important;\n\t\t\t\twill-change: box-shadow, transform;\n\t\t\t\ttransform: translateZ(0);\n\t\t\t}\n\t\t\t.react-joyride__tooltip {\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\ttransform: translateZ(0);\n\t\t\t}\n\t\t\t.react-joyride__floater {\n\t\t\t\tright: 12px !important;\n\t\t\t\tleft: auto !important;\n\t\t\t}\n\t\t`;\n\n\t\treturn () => {\n\t\t\tconst el = document.getElementById(styleId);\n\t\t\tif (el) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t// Force Joyride remount on navigation to prevent stale state\n\tuseEffect(() => {\n\t\tsetMajorJoyrideKey((prev) => prev + 1);\n\t\tsetMinorJoyrideKey((prev) => prev + 1);\n\t\tsetIsClosingMajor(false);\n\t\tsetIsClosingMinor(false);\n\t\t// Reset session tracking on navigation to allow features to show on new pages\n\t\tsetShownMinorFeatureIds(new Set());\n\t}, [router?.pathname]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tmajorUpdateFeatures.length > 0 &&\n\t\t\t!currentMajorFeature &&\n\t\t\t!isLoading &&\n\t\t\t!isProcessingMajorUpdate &&\n\t\t\t!blockPopups\n\t\t) {\n\t\t\tsetShowMinorUpdates(false);\n\t\t\tsetMinorFeaturesSkipped(false);\n\t\t\tsetRunJoyride(false);\n\t\t\tsetJoyrideSteps([]);\n\t\t\tsetCurrentMinorFeature(null);\n\t\t\tsetAvailableMinorFeatures([]);\n\n\t\t\tlet attempts = 0;\n\t\t\tconst MAX_ATTEMPTS = 10;\n\n\t\t\tconst checkWhatsNewButton = () => {\n\t\t\t\tattempts++;\n\t\t\t\tconst whatsNewButton = document.querySelector(\n\t\t\t\t\t'[data-testid=\"whats-new-button\"]',\n\t\t\t\t);\n\n\t\t\t\tif (whatsNewButton) {\n\t\t\t\t\tshowMajorUpdateJoyride(majorUpdateFeatures[0]);\n\t\t\t\t} else if (attempts < MAX_ATTEMPTS) {\n\t\t\t\t\tsetTimeout(checkWhatsNewButton, 1000);\n\t\t\t\t} else {\n\t\t\t\t\tsetShowMinorUpdates(true);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckWhatsNewButton();\n\t\t} else if (majorUpdateFeatures.length === 0 && !isLoading) {\n\t\t\tsetShowMinorUpdates(true);\n\t\t}\n\t}, [\n\t\tmajorUpdateFeatures,\n\t\tcurrentMajorFeature,\n\t\tisLoading,\n\t\tisProcessingMajorUpdate,\n\t\tblockPopups,\n\t]);\n\n\tuseEffect(() => {\n\t\t// Only run this special logic if a feature is being forced via URL\n\t\tconst featureIdFromQuery = router?.query?.['featureId'] as string;\n\n\t\tif (!featureIdFromQuery || isLoading || minorUpdateFeatures.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst forcedFeature = minorUpdateFeatures.find(\n\t\t\t(f) => f.id === featureIdFromQuery,\n\t\t);\n\n\t\tif (!forcedFeature || !forcedFeature.featureTag) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent the standard flow from interfering\n\t\tsetMinorFeaturesSkipped(true);\n\t\t// Mark that we're processing to prevent other effects from interfering\n\t\tsetIsProcessingMinorUpdate(true);\n\n\t\tlet attempts = 0;\n\t\tconst maxAttempts = 25; // 5 seconds\n\t\tconst interval = setInterval(() => {\n\t\t\tattempts++;\n\t\t\tconst targetSelector =\n\t\t\t\tforcedFeature.featureTag.startsWith('#') ||\n\t\t\t\tforcedFeature.featureTag.startsWith('.') ||\n\t\t\t\tforcedFeature.featureTag.startsWith('[')\n\t\t\t\t\t? forcedFeature.featureTag\n\t\t\t\t\t: `#${forcedFeature.featureTag}`;\n\n\t\t\tconst element = document.querySelector(targetSelector);\n\n\t\t\tif (element) {\n\t\t\t\t// In test mode, pass the feature array directly to avoid async state issues\n\t\t\t\tconst testModeFeatures = [forcedFeature];\n\t\t\t\tsetAvailableMinorFeatures(testModeFeatures);\n\t\t\t\tshowMinorUpdateJoyride(forcedFeature, testModeFeatures);\n\t\t\t\t// Don't reset processing flag here - let user interaction handle it\n\t\t\t\t// This prevents auto-closing when multiple popups exist or when scrolling\n\t\t\t\tclearInterval(interval);\n\t\t\t} else if (attempts >= maxAttempts) {\n\t\t\t\t// Fallback for safety, though user expects it to be there.\n\t\t\t\t// We could log an error here.\n\t\t\t\t// Only reset on timeout (element not found)\n\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 200);\n\n\t\treturn () => {\n\t\t\tclearInterval(interval);\n\t\t\t// Don't reset processing flag on cleanup - it causes premature popup closure\n\t\t\t// The flag will be managed by user interactions (skip/explore handlers)\n\t\t};\n\t}, [minorUpdateFeatures, router?.query?.['featureId'], isLoading]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tminorUpdateFeatures.length > 0 &&\n\t\t\t!isLoading &&\n\t\t\t!runJoyride &&\n\t\t\t!isProcessingMinorUpdate &&\n\t\t\t!currentMinorFeature &&\n\t\t\t!minorFeaturesSkipped &&\n\t\t\tshowMinorUpdates &&\n\t\t\t!blockPopups\n\t\t) {\n\t\t\tlet observer: MutationObserver | null = null;\n\t\t\tlet scrollListener: (() => void) | null = null;\n\t\t\tlet checkTimeout: ReturnType<typeof setTimeout> | null = null;\n\t\t\tlet isCleanedUp = false;\n\n\t\t\tconst checkElementsAndStartTour = () => {\n\t\t\t\tif (\n\t\t\t\t\tisCleanedUp ||\n\t\t\t\t\tisProcessingMinorUpdate ||\n\t\t\t\t\tcurrentMinorFeature ||\n\t\t\t\t\tminorFeaturesSkipped ||\n\t\t\t\t\t!showMinorUpdates\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tconst availableFeatures = minorUpdateFeatures.filter((feature) => {\n\t\t\t\t\tif (!feature.featureTag || feature.featureTag.trim() === '') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip features already shown in this session\n\t\t\t\t\tif (shownMinorFeatureIds.has(feature.id)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst targetSelector =\n\t\t\t\t\t\tfeature.featureTag.startsWith('#') ||\n\t\t\t\t\t\tfeature.featureTag.startsWith('.') ||\n\t\t\t\t\t\tfeature.featureTag.startsWith('[')\n\t\t\t\t\t\t\t? feature.featureTag\n\t\t\t\t\t\t\t: `#${feature.featureTag}`;\n\n\t\t\t\t\tconst element = document.querySelector(targetSelector);\n\t\t\t\t\treturn element !== null;\n\t\t\t\t});\n\n\t\t\t\tif (availableFeatures.length > 0) {\n\t\t\t\t\tsetAvailableMinorFeatures(availableFeatures);\n\t\t\t\t\t// Pass features directly to avoid async state issues\n\t\t\t\t\tshowMinorUpdateJoyride(availableFeatures[0], availableFeatures);\n\n\t\t\t\t\tif (observer) {\n\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\tobserver = null;\n\t\t\t\t\t}\n\t\t\t\t\tif (scrollListener) {\n\t\t\t\t\t\twindow.removeEventListener('scroll', scrollListener);\n\t\t\t\t\t\tscrollListener = null;\n\t\t\t\t\t}\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t\tcheckTimeout = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tobserver = new MutationObserver((mutations) => {\n\t\t\t\tlet shouldCheck = false;\n\t\t\t\tfor (const mutation of mutations) {\n\t\t\t\t\tif (mutation.type === 'childList' && mutation.addedNodes.length > 0) {\n\t\t\t\t\t\tfor (let i = 0; i < mutation.addedNodes.length; i++) {\n\t\t\t\t\t\t\tconst node = mutation.addedNodes[i];\n\t\t\t\t\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst element = node as Element;\n\t\t\t\t\t\t\t\tif (element.id || element.querySelector('[id]')) {\n\t\t\t\t\t\t\t\t\tshouldCheck = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldCheck) break;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!runJoyride &&\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates &&\n\t\t\t\t\tshouldCheck\n\t\t\t\t) {\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t\tcheckTimeout = setTimeout(() => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\t\t\tshowMinorUpdates\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 200);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscrollListener = () => {\n\t\t\t\tif (\n\t\t\t\t\t!runJoyride &&\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tif (checkTimeout) {\n\t\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t\t// Use RAF for smoother performance synced with browser paint\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tcheckTimeout = setTimeout(() => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\t\t\t\tshowMinorUpdates\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (observer) {\n\t\t\t\tobserver.observe(document.body, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (scrollListener) {\n\t\t\t\twindow.addEventListener('scroll', scrollListener, { passive: true });\n\t\t\t}\n\n\t\t\tcheckElementsAndStartTour();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 100);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 1000);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (\n\t\t\t\t\t!isCleanedUp &&\n\t\t\t\t\t!isProcessingMinorUpdate &&\n\t\t\t\t\t!currentMinorFeature &&\n\t\t\t\t\t!minorFeaturesSkipped &&\n\t\t\t\t\tshowMinorUpdates\n\t\t\t\t) {\n\t\t\t\t\tcheckElementsAndStartTour();\n\t\t\t\t}\n\t\t\t}, 500);\n\n\t\t\treturn () => {\n\t\t\t\tisCleanedUp = true;\n\t\t\t\tif (observer) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t\tif (scrollListener) {\n\t\t\t\t\twindow.removeEventListener('scroll', scrollListener);\n\t\t\t\t}\n\t\t\t\tif (checkTimeout) {\n\t\t\t\t\tclearTimeout(checkTimeout);\n\t\t\t\t}\n\t\t\t};\n\t\t} else if (minorUpdateFeatures.length === 0 || isLoading) {\n\t\t\t// Don't clear joyride if we're in test mode with an active feature\n\t\t\tconst featureIdFromQuery = router?.query?.['featureId'] as string;\n\t\t\tconst isTestModeWithActiveFeature =\n\t\t\t\tfeatureIdFromQuery && currentMinorFeature;\n\n\t\t\tif (!isTestModeWithActiveFeature) {\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetJoyrideSteps([]);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetAvailableMinorFeatures([]);\n\t\t\t\tsetMinorFeaturesSkipped(false);\n\t\t\t}\n\t\t}\n\t}, [\n\t\tminorUpdateFeatures,\n\t\tisLoading,\n\t\trunJoyride,\n\t\tisProcessingMinorUpdate,\n\t\tcurrentMinorFeature,\n\t\tminorFeaturesSkipped,\n\t\tshowMinorUpdates,\n\t\tmarkFeatureAsViewed,\n\t\tblockPopups,\n\t]);\n\n\tconst showMajorUpdateJoyride = (feature) => {\n\t\tsetCurrentMajorFeature(feature);\n\n\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t(f) => f.id === feature.id,\n\t\t);\n\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\tconst majorSteps = [\n\t\t\t{\n\t\t\t\ttarget: SELECTORS.WHATS_NEW_BUTTON,\n\t\t\t\tcontent: (\n\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\tfeature={feature}\n\t\t\t\t\t\tcurrentIndex={currentIndex}\n\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(feature)}\n\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\thandleExploreFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\thandleSecondaryMajorFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(feature)}\n\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(feature)}\n\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tplacement: 'bottom-start',\n\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\tdisableBeacon: true,\n\t\t\t\thideCloseButton: true,\n\t\t\t\thideSkipButton: true,\n\t\t\t\thideFooter: true,\n\t\t\t\toffset: 0,\n\t\t\t\tdata: { feature, isMajor: true },\n\t\t\t\tstyles: {\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t},\n\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t},\n\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tsetMajorJoyrideSteps(majorSteps);\n\t\tsetRunMajorJoyride(true);\n\n\t\t// Fire announcement shown callback\n\t\tif (onAnnouncementShown && storeId) {\n\t\t\tonAnnouncementShown({\n\t\t\t\tstoreId,\n\t\t\t\tannouncementId: feature.id,\n\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleSkipMajorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (targetFeature) {\n\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tmajorUpdateFeatures.map((majorFeature) =>\n\t\t\t\t\t\tmarkFeatureAsViewed(majorFeature.id),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\n\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\t// Fire announcement interacted callback for Skip\n\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\tannouncementId: targetFeature.id,\n\t\t\t\t\t\tannouncementTitle: targetFeature.title,\n\t\t\t\t\t\timageUrl: targetFeature.displayImage || targetFeature.image,\n\t\t\t\t\t\tvideoUrl: targetFeature.productVideo,\n\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handleExploreFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMajorUpdate(true);\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\t\t\tconst action = triggeredAction ?? feature.primaryButton?.action;\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tif (action === 'Open link') {\n\t\t\t\tconst url =\n\t\t\t\t\tfeature.primaryButton?.redirectionUrl || feature.redirectUrl;\n\t\t\t\tif (url && !url.startsWith('http')) {\n\t\t\t\t\twindow.location.href = url;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetRunMajorJoyride(false);\n\t\t\tsetCurrentMajorFeature(null);\n\t\t\tsetMajorJoyrideSteps([]);\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === feature.id,\n\t\t\t);\n\t\t\tconst isLastMajorUpdate = currentIndex === majorUpdateFeatures.length - 1;\n\t\t\tif (isLastMajorUpdate) {\n\t\t\t\tsetShowMinorUpdates(true);\n\t\t\t}\n\n\t\t\t// Fire announcement interacted callback for Primary button\n\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\tstoreId,\n\t\t\t\t\tannouncementId: feature.id,\n\t\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t\t\tbuttonClicked: 'Primary',\n\t\t\t\t\t// Mirrors the rendered button and the navigation target, which both\n\t\t\t\t\t// prefer primaryButton over the legacy top-level fields.\n\t\t\t\t\tbuttonName:\n\t\t\t\t\t\tfeature.primaryButton?.text || feature.buttonText || 'Explore',\n\t\t\t\t\tbuttonUrl:\n\t\t\t\t\t\tfeature.primaryButton?.redirectionUrl ||\n\t\t\t\t\t\tfeature.redirectUrl ||\n\t\t\t\t\t\tfeature.productVideo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t}, 500);\n\t\t},\n\t\t[majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handleSecondaryMajorFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMajorUpdate(true);\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\t\t\tconst action = triggeredAction ?? feature.secondaryButton?.action;\n\t\t\t// Redirection is handled by the popup; only the video modal is opened here.\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tsetRunMajorJoyride(false);\n\t\t\tsetCurrentMajorFeature(null);\n\t\t\tsetMajorJoyrideSteps([]);\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === feature.id,\n\t\t\t);\n\t\t\tconst isLastMajorUpdate = currentIndex === majorUpdateFeatures.length - 1;\n\t\t\tif (isLastMajorUpdate) {\n\t\t\t\tsetShowMinorUpdates(true);\n\t\t\t}\n\n\t\t\t// Fire announcement interacted callback for Secondary button\n\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\tstoreId,\n\t\t\t\t\tannouncementId: feature.id,\n\t\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t\t\tbuttonClicked: 'Secondary',\n\t\t\t\t\tbuttonName: feature.secondaryButton?.text || 'Secondary',\n\t\t\t\t\tbuttonUrl: feature.secondaryButton?.redirectionUrl,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t}, 500);\n\t\t},\n\t\t[majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handlePreviousMajorUpdate = useCallback(\n\t\t(feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex > 0) {\n\t\t\t\tconst prevFeature = majorUpdateFeatures[currentIndex - 1];\n\t\t\t\tsetCurrentMajorFeature(prevFeature);\n\n\t\t\t\tconst prevIndex = currentIndex - 1;\n\t\t\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: '[data-testid=\"whats-new-button\"]',\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={prevFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={prevIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleSecondaryMajorFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom-start',\n\t\t\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: prevFeature, isMajor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetMajorJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures],\n\t);\n\n\tconst handleNextMajorUpdate = useCallback(\n\t\t(feature) => {\n\t\t\tconst targetFeature = feature || currentMajorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = majorUpdateFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex < majorUpdateFeatures.length - 1) {\n\t\t\t\tconst nextFeature = majorUpdateFeatures[currentIndex + 1];\n\t\t\t\tsetCurrentMajorFeature(nextFeature);\n\n\t\t\t\tconst nextIndex = currentIndex + 1;\n\t\t\t\tconst totalFeatures = majorUpdateFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: '[data-testid=\"whats-new-button\"]',\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MajorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={nextFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={nextIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleSecondaryMajorFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMajorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMajor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom-start',\n\t\t\t\t\t\tplacementBeacon: 'top-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: nextFeature, isMajor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetMajorJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\tmarkFeatureAsViewed(targetFeature.id);\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\n\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst showMajorUpdatePopup = () => {\n\t\tif (majorUpdateFeatures.length > 0 && !currentMajorFeature) {\n\t\t\tconst whatsNewButton = document.querySelector(\n\t\t\t\t'[data-testid=\"whats-new-button\"]',\n\t\t\t);\n\n\t\t\tif (whatsNewButton) {\n\t\t\t\tshowMajorUpdateJoyride(majorUpdateFeatures[0]);\n\t\t\t}\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\t(window as any).showMajorUpdatePopup = showMajorUpdatePopup;\n\t\treturn () => {\n\t\t\tdelete (window as any).showMajorUpdatePopup;\n\t\t};\n\t}, [majorUpdateFeatures, currentMajorFeature]);\n\tconst handleMajorJoyrideCallback = useCallback(\n\t\t(data) => {\n\t\t\tconst { action } = data;\n\n\t\t\tif (action === ACTIONS.CLOSE) {\n\t\t\t\tif (currentMajorFeature) {\n\t\t\t\t\tsetIsProcessingMajorUpdate(true);\n\n\t\t\t\t\tmajorUpdateFeatures.forEach((majorFeature) => {\n\t\t\t\t\t\tmarkFeatureAsViewed(majorFeature.id);\n\t\t\t\t\t});\n\n\t\t\t\t\tsetShowMinorUpdates(true);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsProcessingMajorUpdate(false);\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tsetRunMajorJoyride(false);\n\t\t\t\tsetCurrentMajorFeature(null);\n\t\t\t\tsetMajorJoyrideSteps([]);\n\t\t\t}\n\t\t},\n\t\t[currentMajorFeature, majorUpdateFeatures, markFeatureAsViewed],\n\t);\n\n\tconst handleMinorJoyrideCallback = useCallback(\n\t\t(data) => {\n\t\t\tconst { action } = data;\n\n\t\t\tif (action === ACTIONS.CLOSE) {\n\t\t\t\tif (currentMinorFeature) {\n\t\t\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t\t\t// Only mark the current feature as viewed, not all features\n\t\t\t\t\tmarkFeatureAsViewed(currentMinorFeature.id);\n\n\t\t\t\t\t// Check if there are more features to show\n\t\t\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t\t\t(f) => f.id === currentMinorFeature.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst isLastFeature =\n\t\t\t\t\t\tcurrentIndex === availableMinorFeatures.length - 1;\n\n\t\t\t\t\tif (isLastFeature) {\n\t\t\t\t\t\t// Only skip remaining features if this was the last one\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures, markFeatureAsViewed],\n\t);\n\tconst showMinorUpdateJoyride = async (feature, featuresToUse?) => {\n\t\tsetCurrentMinorFeature(feature);\n\n\t\t// Use provided features array or fall back to state (for test mode)\n\t\tconst features = featuresToUse || availableMinorFeatures;\n\t\tconst currentIndex = features.findIndex((f) => f.id === feature.id);\n\t\tconst totalFeatures = features.length;\n\n\t\tconst targetSelector =\n\t\t\tfeature.featureTag.startsWith('#') ||\n\t\t\tfeature.featureTag.startsWith('.') ||\n\t\t\tfeature.featureTag.startsWith('[')\n\t\t\t\t? feature.featureTag\n\t\t\t\t: `#${feature.featureTag}`;\n\n\t\t// Scroll to target element smoothly before showing popup\n\t\tconst targetElement = document.querySelector(targetSelector);\n\t\tif (targetElement) {\n\t\t\ttry {\n\t\t\t\t// Dynamically import to avoid circular dependencies\n\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t);\n\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t} catch (error) {\n\t\t\t\t// Scroll failed silently\n\t\t\t}\n\t\t}\n\n\t\tconst minorSteps = [\n\t\t\t{\n\t\t\t\ttarget: targetSelector,\n\t\t\t\tcontent: (\n\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\tfeature={feature}\n\t\t\t\t\t\tcurrentIndex={currentIndex}\n\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(feature)}\n\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\thandleExploreMinorFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\thandleSecondaryMinorFeature(feature, triggeredAction)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(feature)}\n\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(feature)}\n\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tplacement: 'bottom',\n\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\tdisableBeacon: true,\n\t\t\t\thideCloseButton: true,\n\t\t\t\thideSkipButton: true,\n\t\t\t\thideFooter: true,\n\t\t\t\toffset: 0,\n\t\t\t\tdata: { feature, isMinor: true },\n\t\t\t\tstyles: {\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t},\n\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t},\n\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tsetJoyrideSteps(minorSteps);\n\t\tsetRunJoyride(true);\n\n\t\t// Fire announcement shown callback\n\t\tif (onAnnouncementShown && storeId) {\n\t\t\tonAnnouncementShown({\n\t\t\t\tstoreId,\n\t\t\t\tannouncementId: feature.id,\n\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleSkipMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (targetFeature) {\n\t\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t\t// Only mark the current feature as viewed, not all features\n\t\t\t\tawait markFeatureAsViewed(targetFeature.id);\n\n\t\t\t\t// Add to session tracker to prevent re-showing\n\t\t\t\tsetShownMinorFeatureIds((prev) => new Set(prev).add(targetFeature.id));\n\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\n\t\t\t\t// Find next unshown feature\n\t\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t\t(f) => f.id !== targetFeature.id && !shownMinorFeatureIds.has(f.id),\n\t\t\t\t);\n\n\t\t\t\t// Fire announcement interacted callback for Skip\n\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\tannouncementId: targetFeature.id,\n\t\t\t\t\t\tannouncementTitle: targetFeature.title,\n\t\t\t\t\t\timageUrl: targetFeature.displayImage || targetFeature.image,\n\t\t\t\t\t\tvideoUrl: targetFeature.productVideo,\n\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\n\t\t\t\t\tif (nextFeature) {\n\t\t\t\t\t\t// Auto-advance to next feature\n\t\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No more features to show\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tcurrentMinorFeature,\n\t\t\tavailableMinorFeatures,\n\t\t\tmarkFeatureAsViewed,\n\t\t\tshownMinorFeatureIds,\n\t\t],\n\t);\n\n\tconst handleExploreMinorFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t// Only mark the current feature as viewed\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\n\t\t\t// Add to session tracker to prevent re-showing\n\t\t\tsetShownMinorFeatureIds((prev) => new Set(prev).add(feature.id));\n\n\t\t\tconst action = triggeredAction ?? feature.primaryButton?.action;\n\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tif (action === 'Open link') {\n\t\t\t\tconst url =\n\t\t\t\t\tfeature.primaryButton?.redirectionUrl || feature.redirectUrl;\n\t\t\t\tif (url && !url.startsWith('http')) {\n\t\t\t\t\twindow.location.href = url;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetRunJoyride(false);\n\t\t\tsetCurrentMinorFeature(null);\n\t\t\tsetJoyrideSteps([]);\n\n\t\t\t// Find next unshown feature (only auto-advance if no video modal)\n\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t(f) => f.id !== feature.id && !shownMinorFeatureIds.has(f.id),\n\t\t\t);\n\n\t\t\t// Fire announcement interacted callback for Primary button\n\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\tstoreId,\n\t\t\t\t\tannouncementId: feature.id,\n\t\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t\t\tbuttonClicked: 'Primary',\n\t\t\t\t\t// Mirrors the rendered button and the navigation target, which both\n\t\t\t\t\t// prefer primaryButton over the legacy top-level fields.\n\t\t\t\t\tbuttonName:\n\t\t\t\t\t\tfeature.primaryButton?.text || feature.buttonText || 'Explore',\n\t\t\t\t\tbuttonUrl:\n\t\t\t\t\t\tfeature.primaryButton?.redirectionUrl ||\n\t\t\t\t\t\tfeature.redirectUrl ||\n\t\t\t\t\t\tfeature.productVideo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMinorUpdate(false);\n\n\t\t\t\t// Only auto-advance if no video modal is opened\n\t\t\t\tif (nextFeature && action !== 'Play Video') {\n\t\t\t\t\t// Auto-advance to next feature\n\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t} else if (!nextFeature) {\n\t\t\t\t\t// No more features to show\n\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t}\n\t\t\t\t// If video modal opened, wait for user to close it before advancing\n\t\t\t}, 500);\n\t\t},\n\t\t[availableMinorFeatures, markFeatureAsViewed, shownMinorFeatureIds],\n\t);\n\n\tconst handleSecondaryMinorFeature = useCallback(\n\t\tasync (feature, triggeredAction?: string) => {\n\t\t\tsetIsProcessingMinorUpdate(true);\n\n\t\t\t// Await so the feature is marked before any page navigation\n\t\t\tawait markFeatureAsViewed(feature.id);\n\n\t\t\t// Add to session tracker to prevent re-showing\n\t\t\tsetShownMinorFeatureIds((prev) => new Set(prev).add(feature.id));\n\n\t\t\tconst action = triggeredAction ?? feature.secondaryButton?.action;\n\t\t\t// Redirection is handled by the popup; only the video modal is opened here.\n\t\t\tif (action === 'Play Video' && feature.productVideo) {\n\t\t\t\tsetVideoUrl(feature.productVideo);\n\t\t\t\tsetIsVideoModalOpen(true);\n\t\t\t\tsetBlockPopups(true);\n\t\t\t}\n\n\t\t\tsetRunJoyride(false);\n\t\t\tsetCurrentMinorFeature(null);\n\t\t\tsetJoyrideSteps([]);\n\n\t\t\t// Find next unshown feature (only auto-advance if no video modal)\n\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t(f) => f.id !== feature.id && !shownMinorFeatureIds.has(f.id),\n\t\t\t);\n\n\t\t\t// Fire announcement interacted callback for Secondary button\n\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\tstoreId,\n\t\t\t\t\tannouncementId: feature.id,\n\t\t\t\t\tannouncementTitle: feature.title,\n\t\t\t\t\timageUrl: feature.displayImage || feature.image,\n\t\t\t\t\tvideoUrl: feature.productVideo,\n\t\t\t\t\tbuttonClicked: 'Secondary',\n\t\t\t\t\tbuttonName: feature.secondaryButton?.text || 'Secondary',\n\t\t\t\t\tbuttonUrl: feature.secondaryButton?.redirectionUrl,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsProcessingMinorUpdate(false);\n\n\t\t\t\tif (nextFeature && action !== 'Play Video') {\n\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t} else if (!nextFeature) {\n\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t},\n\t\t[availableMinorFeatures, markFeatureAsViewed, shownMinorFeatureIds],\n\t);\n\n\tconst handlePreviousMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex > 0) {\n\t\t\t\tconst prevFeature = availableMinorFeatures[currentIndex - 1];\n\t\t\t\tsetCurrentMinorFeature(prevFeature);\n\n\t\t\t\tconst targetSelector =\n\t\t\t\t\tprevFeature.featureTag.startsWith('#') ||\n\t\t\t\t\tprevFeature.featureTag.startsWith('.') ||\n\t\t\t\t\tprevFeature.featureTag.startsWith('[')\n\t\t\t\t\t\t? prevFeature.featureTag\n\t\t\t\t\t\t: `#${prevFeature.featureTag}`;\n\n\t\t\t\t// Scroll to the previous feature element\n\t\t\t\tconst targetElement = document.querySelector(targetSelector);\n\t\t\t\tif (targetElement) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Scroll failed silently\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst prevIndex = currentIndex - 1;\n\t\t\t\tconst totalFeatures = availableMinorFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={prevFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={prevIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreMinorFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleSecondaryMinorFeature(prevFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(prevFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom',\n\t\t\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: prevFeature, isMinor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetJoyrideSteps(updatedSteps);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures],\n\t);\n\n\tconst handleNextMinorUpdate = useCallback(\n\t\tasync (feature) => {\n\t\t\tconst targetFeature = feature || currentMinorFeature;\n\n\t\t\tif (!targetFeature) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentIndex = availableMinorFeatures.findIndex(\n\t\t\t\t(f) => f.id === targetFeature.id,\n\t\t\t);\n\n\t\t\tif (currentIndex < availableMinorFeatures.length - 1) {\n\t\t\t\tconst nextFeature = availableMinorFeatures[currentIndex + 1];\n\t\t\t\tsetCurrentMinorFeature(nextFeature);\n\n\t\t\t\tconst targetSelector =\n\t\t\t\t\tnextFeature.featureTag.startsWith('#') ||\n\t\t\t\t\tnextFeature.featureTag.startsWith('.') ||\n\t\t\t\t\tnextFeature.featureTag.startsWith('[')\n\t\t\t\t\t\t? nextFeature.featureTag\n\t\t\t\t\t\t: `#${nextFeature.featureTag}`;\n\n\t\t\t\t// Scroll to the next feature element\n\t\t\t\tconst targetElement = document.querySelector(targetSelector);\n\t\t\t\tif (targetElement) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { scrollToElementSmooth } = await import(\n\t\t\t\t\t\t\t'./utils/elementHelpers'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait scrollToElementSmooth(targetElement, 120);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Scroll failed silently\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst nextIndex = currentIndex + 1;\n\t\t\t\tconst totalFeatures = availableMinorFeatures.length;\n\n\t\t\t\tconst updatedSteps = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: targetSelector,\n\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t<MinorUpdatePopup\n\t\t\t\t\t\t\t\tfeature={nextFeature}\n\t\t\t\t\t\t\t\tcurrentIndex={nextIndex}\n\t\t\t\t\t\t\t\ttotalFeatures={totalFeatures}\n\t\t\t\t\t\t\t\tonSkip={() => handleSkipMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonExplore={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleExploreMinorFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSecondaryAction={(triggeredAction) =>\n\t\t\t\t\t\t\t\t\thandleSecondaryMinorFeature(nextFeature, triggeredAction)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPrevious={() => handlePreviousMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tonNext={() => handleNextMinorUpdate(nextFeature)}\n\t\t\t\t\t\t\t\tsetIsClosing={setIsClosingMinor}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tplacement: 'bottom',\n\t\t\t\t\t\tplacementBeacon: 'bottom-end',\n\t\t\t\t\t\tdisableBeacon: true,\n\t\t\t\t\t\thideCloseButton: true,\n\t\t\t\t\t\thideSkipButton: true,\n\t\t\t\t\t\thideFooter: true,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tdata: { feature: nextFeature, isMinor: true },\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsetJoyrideSteps(updatedSteps);\n\t\t\t} else {\n\t\t\t\tsetIsProcessingMinorUpdate(true);\n\t\t\t\tsetMinorFeaturesSkipped(true);\n\n\t\t\t\tmarkFeatureAsViewed(targetFeature.id);\n\t\t\t\tsetRunJoyride(false);\n\t\t\t\tsetCurrentMinorFeature(null);\n\t\t\t\tsetJoyrideSteps([]);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetIsProcessingMinorUpdate(false);\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t},\n\t\t[currentMinorFeature, availableMinorFeatures, markFeatureAsViewed],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{children}\n\n\t\t\t{majorJoyrideSteps.length > 0 && (\n\t\t\t\t<Joyride\n\t\t\t\t\tkey={`major-joyride-${majorJoyrideKey}`}\n\t\t\t\t\tsteps={majorJoyrideSteps}\n\t\t\t\t\trun={runMajorJoyride}\n\t\t\t\t\tcontinuous={false}\n\t\t\t\t\tshowProgress={false}\n\t\t\t\t\tshowSkipButton={false}\n\t\t\t\t\tcallback={handleMajorJoyrideCallback}\n\t\t\t\t\tdisableOverlayClose={false}\n\t\t\t\t\tdisableCloseOnEsc={false}\n\t\t\t\t\tdisableOverlay={false}\n\t\t\t\t\tspotlightClicks={false}\n\t\t\t\t\tstyles={{\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tprimaryColor: '#007bff',\n\t\t\t\t\t\t\tzIndex: 10000,\n\t\t\t\t\t\t\twidth: 'auto',\n\t\t\t\t\t\t\tarrowColor: isClosingMajor ? 'transparent' : '#212121',\n\t\t\t\t\t\t},\n\t\t\t\t\t\toverlay: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspotlight: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\tborderRadius: '16px',\n\t\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tlocale={{\n\t\t\t\t\t\tback: 'Back',\n\t\t\t\t\t\tclose: 'Close',\n\t\t\t\t\t\tlast: 'Close',\n\t\t\t\t\t\tnext: 'Next',\n\t\t\t\t\t\tskip: 'Skip',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{joyrideSteps.length > 0 && (\n\t\t\t\t<Joyride\n\t\t\t\t\tkey={`minor-joyride-${minorJoyrideKey}`}\n\t\t\t\t\tsteps={joyrideSteps}\n\t\t\t\t\trun={runJoyride}\n\t\t\t\t\tcontinuous={false}\n\t\t\t\t\tshowProgress={false}\n\t\t\t\t\tshowSkipButton={false}\n\t\t\t\t\tcallback={handleMinorJoyrideCallback}\n\t\t\t\t\tdisableOverlayClose={false}\n\t\t\t\t\tdisableCloseOnEsc={false}\n\t\t\t\t\tdisableOverlay={false}\n\t\t\t\t\tscrollToFirstStep={true}\n\t\t\t\t\tscrollOffset={120}\n\t\t\t\t\tdisableScrolling={false}\n\t\t\t\t\tstyles={{\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tprimaryColor: '#007bff',\n\t\t\t\t\t\t\tzIndex: 10000,\n\t\t\t\t\t\t\twidth: 'auto',\n\t\t\t\t\t\t\tarrowColor: isClosingMinor ? 'transparent' : '#ffffff',\n\t\t\t\t\t\t},\n\t\t\t\t\t\toverlay: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspotlight: {\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborderRadius: '8px',\n\t\t\t\t\t\t\tboxShadow: isClosingMinor\n\t\t\t\t\t\t\t\t? 'none'\n\t\t\t\t\t\t\t\t: '0 0 0 9999px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(255, 255, 255, 0.8), 0 0 20px 8px rgba(255, 255, 255, 0.4)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tfilter: 'none',\n\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltipContent: {\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonNext: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonBack: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonSkip: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuttonClose: {\n\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tlocale={{\n\t\t\t\t\t\tback: 'Back',\n\t\t\t\t\t\tclose: 'Close',\n\t\t\t\t\t\tlast: 'Close',\n\t\t\t\t\t\tnext: 'Next',\n\t\t\t\t\t\tskip: 'Skip',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<VideoModal\n\t\t\t\tisOpen={isVideoModalOpen}\n\t\t\t\tvideoUrl={videoUrl}\n\t\t\t\tonClose={() => {\n\t\t\t\t\tsetIsVideoModalOpen(false);\n\t\t\t\t\tsetVideoUrl('');\n\t\t\t\t\tsetBlockPopups(false);\n\n\t\t\t\t\t// After video modal closes, check if there are more features to show\n\t\t\t\t\tconst nextFeature = availableMinorFeatures.find(\n\t\t\t\t\t\t(f) => !shownMinorFeatureIds.has(f.id),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (nextFeature) {\n\t\t\t\t\t\t// Auto-advance to next feature after video\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tshowMinorUpdateJoyride(nextFeature, availableMinorFeatures);\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No more features to show\n\t\t\t\t\t\tsetMinorFeaturesSkipped(true);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nexport default FeatureAnnouncementProvider;\n"],"names":["FeatureAnnouncementProvider","children","fetchVisibleFeatures","getStoreFeatureProgress","fetchFeatureById","markFeatureAsViewedForStore","isFeatureApplicableToCurrentPage","module","router","storeId","onAnnouncementShown","onAnnouncementInteracted","majorUpdateFeatures","minorUpdateFeatures","isLoading","markFeatureAsViewed","useFeatureAnnouncements","currentMajorFeature","setCurrentMajorFeature","useState","currentMinorFeature","setCurrentMinorFeature","runJoyride","setRunJoyride","joyrideSteps","setJoyrideSteps","runMajorJoyride","setRunMajorJoyride","majorJoyrideSteps","setMajorJoyrideSteps","isProcessingMajorUpdate","setIsProcessingMajorUpdate","isProcessingMinorUpdate","setIsProcessingMinorUpdate","availableMinorFeatures","setAvailableMinorFeatures","minorFeaturesSkipped","setMinorFeaturesSkipped","showMinorUpdates","setShowMinorUpdates","isVideoModalOpen","setIsVideoModalOpen","videoUrl","setVideoUrl","blockPopups","setBlockPopups","isClosingMajor","setIsClosingMajor","isClosingMinor","setIsClosingMinor","majorJoyrideKey","setMajorJoyrideKey","minorJoyrideKey","setMinorJoyrideKey","shownMinorFeatureIds","setShownMinorFeatureIds","useEffect","styleId","styleElement","el","prev","attempts","MAX_ATTEMPTS","checkWhatsNewButton","showMajorUpdateJoyride","featureIdFromQuery","forcedFeature","f","maxAttempts","interval","targetSelector","testModeFeatures","showMinorUpdateJoyride","observer","scrollListener","checkTimeout","isCleanedUp","checkElementsAndStartTour","availableFeatures","feature","mutations","shouldCheck","mutation","i","node","element","currentIndex","totalFeatures","majorSteps","SELECTORS","jsx","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handleSecondaryMajorFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handleSecondaryMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","jsxs","Fragment","Joyride","VideoModal"],"mappings":"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"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import { jsx as o, jsxs as p, Fragment as F } from "react/jsx-runtime";
|
|
2
2
|
import { useState as f, useRef as T, useEffect as tt } from "react";
|
|
3
|
-
import
|
|
3
|
+
import x from "../../assets/icons/chevronRight2.svg.js";
|
|
4
4
|
import et from "../../assets/icons/play.svg.js";
|
|
5
|
-
import { TEXT as
|
|
5
|
+
import { TEXT as L } from "./constants/index.js";
|
|
6
6
|
import { getMajorPopupStyles as nt } from "./styles/majorPopup.styles.js";
|
|
7
7
|
import { decodeHTMLEntities as ot } from "./utils/htmlHelpers.js";
|
|
8
|
-
import { hideJoyrideArrow as k, calculateCloseTransform as
|
|
9
|
-
import { findWhatsNewButton as
|
|
8
|
+
import { hideJoyrideArrow as k, calculateCloseTransform as E, executeAfterAnimation as R } from "./utils/animationHelpers.js";
|
|
9
|
+
import { findWhatsNewButton as M } from "./utils/elementHelpers.js";
|
|
10
10
|
const gt = ({
|
|
11
11
|
feature: n,
|
|
12
12
|
currentIndex: d,
|
|
13
13
|
totalFeatures: y,
|
|
14
|
-
onSkip:
|
|
15
|
-
onExplore:
|
|
16
|
-
onPrevious:
|
|
14
|
+
onSkip: C,
|
|
15
|
+
onExplore: U,
|
|
16
|
+
onPrevious: V,
|
|
17
17
|
onNext: A,
|
|
18
18
|
setIsClosing: v,
|
|
19
19
|
onSecondaryAction: W,
|
|
20
20
|
ratio: S = "16:9",
|
|
21
21
|
padding: _
|
|
22
22
|
}) => {
|
|
23
|
-
const [
|
|
23
|
+
const [P, B] = f(!1), [O, D] = f(!1), [H, g] = f(""), l = T(null), [j, m] = f(!1), [I, b] = f(!0), u = T(null), [N, a] = f(S), K = T(null);
|
|
24
24
|
tt(() => {
|
|
25
|
-
|
|
26
|
-
}, [
|
|
25
|
+
P && D(!0);
|
|
26
|
+
}, [P]);
|
|
27
27
|
const X = (t) => {
|
|
28
28
|
k(l.current);
|
|
29
|
-
const s =
|
|
29
|
+
const s = M();
|
|
30
30
|
if (s && l.current) {
|
|
31
|
-
const r =
|
|
31
|
+
const r = E(
|
|
32
32
|
l.current,
|
|
33
33
|
s
|
|
34
34
|
);
|
|
@@ -54,10 +54,10 @@ const gt = ({
|
|
|
54
54
|
const r = n.primaryButton?.redirectionUrl || n.redirectUrl;
|
|
55
55
|
r && r.startsWith("http") && window.open(r, "_blank", "noopener,noreferrer");
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
const s =
|
|
57
|
+
U(t), k(l.current);
|
|
58
|
+
const s = M();
|
|
59
59
|
if (s && l.current) {
|
|
60
|
-
const r =
|
|
60
|
+
const r = E(
|
|
61
61
|
l.current,
|
|
62
62
|
s
|
|
63
63
|
);
|
|
@@ -66,25 +66,23 @@ const gt = ({
|
|
|
66
66
|
g("scale(0)");
|
|
67
67
|
v?.(!0), B(!0);
|
|
68
68
|
}, $ = (t) => {
|
|
69
|
-
t.preventDefault(), t.stopPropagation(), X(
|
|
69
|
+
t.preventDefault(), t.stopPropagation(), X(C);
|
|
70
70
|
}, q = (t) => {
|
|
71
|
-
t.preventDefault(), t.stopPropagation(),
|
|
71
|
+
t.preventDefault(), t.stopPropagation(), V();
|
|
72
72
|
}, Q = (t) => {
|
|
73
73
|
t.preventDefault(), t.stopPropagation(), A();
|
|
74
|
-
},
|
|
74
|
+
}, w = (t) => {
|
|
75
75
|
t.preventDefault(), t.stopPropagation();
|
|
76
|
-
const s = n.secondaryButton?.action, r = W ||
|
|
76
|
+
const s = n.secondaryButton?.action, r = W || C;
|
|
77
77
|
let c = null;
|
|
78
|
-
if (s === "
|
|
79
|
-
C("Play Video");
|
|
80
|
-
else if (s === "Open link") {
|
|
78
|
+
if (s === "Open link") {
|
|
81
79
|
const h = n.secondaryButton?.redirectionUrl;
|
|
82
80
|
h && (h.startsWith("http") ? window.open(h, "_blank", "noopener,noreferrer") : c = h);
|
|
83
81
|
}
|
|
84
82
|
k(l.current);
|
|
85
|
-
const i =
|
|
83
|
+
const i = M();
|
|
86
84
|
if (i && l.current) {
|
|
87
|
-
const h =
|
|
85
|
+
const h = E(
|
|
88
86
|
l.current,
|
|
89
87
|
i
|
|
90
88
|
);
|
|
@@ -92,10 +90,10 @@ const gt = ({
|
|
|
92
90
|
} else
|
|
93
91
|
g("scale(0)");
|
|
94
92
|
v?.(!0), B(!0), R(async () => {
|
|
95
|
-
await r(), c && (window.location.href = c);
|
|
93
|
+
await r(s), c && (window.location.href = c);
|
|
96
94
|
});
|
|
97
95
|
}, e = nt(
|
|
98
|
-
|
|
96
|
+
O,
|
|
99
97
|
H,
|
|
100
98
|
N,
|
|
101
99
|
_ || n.padding,
|
|
@@ -112,7 +110,7 @@ const gt = ({
|
|
|
112
110
|
ref: l,
|
|
113
111
|
style: {
|
|
114
112
|
...e.container,
|
|
115
|
-
opacity:
|
|
113
|
+
opacity: O ? 0 : 1,
|
|
116
114
|
transition: "opacity 0.2s ease-in-out, transform 0.3s ease"
|
|
117
115
|
},
|
|
118
116
|
children: [
|
|
@@ -147,14 +145,14 @@ const gt = ({
|
|
|
147
145
|
onLoadedMetadata: G
|
|
148
146
|
}
|
|
149
147
|
),
|
|
150
|
-
(
|
|
148
|
+
(j || I) && /* @__PURE__ */ o(
|
|
151
149
|
"div",
|
|
152
150
|
{
|
|
153
151
|
style: e.videoOverlay,
|
|
154
152
|
onClick: Y,
|
|
155
153
|
role: "button",
|
|
156
154
|
tabIndex: 0,
|
|
157
|
-
"aria-label":
|
|
155
|
+
"aria-label": j ? "Play video" : "Pause video",
|
|
158
156
|
onKeyDown: Z,
|
|
159
157
|
children: /* @__PURE__ */ o(et, { width: 20, height: 20 })
|
|
160
158
|
}
|
|
@@ -171,7 +169,7 @@ const gt = ({
|
|
|
171
169
|
n.image && (t.target.src = n.image);
|
|
172
170
|
}
|
|
173
171
|
}
|
|
174
|
-
) : /* @__PURE__ */ o("div", { style: e.imagePlaceholder, children:
|
|
172
|
+
) : /* @__PURE__ */ o("div", { style: e.imagePlaceholder, children: L.FEATURE_PREVIEW_PLACEHOLDER }) }),
|
|
175
173
|
/* @__PURE__ */ p("div", { style: e.contentContainer, children: [
|
|
176
174
|
/* @__PURE__ */ o("div", { style: e.skipButtonContainer, children: /* @__PURE__ */ o(
|
|
177
175
|
"button",
|
|
@@ -212,7 +210,7 @@ const gt = ({
|
|
|
212
210
|
t.currentTarget.style,
|
|
213
211
|
e.exploreButton.base
|
|
214
212
|
),
|
|
215
|
-
children: n.primaryButton?.text || n.buttonText ||
|
|
213
|
+
children: n.primaryButton?.text || n.buttonText || L.DEFAULT_BUTTON_TEXT
|
|
216
214
|
}
|
|
217
215
|
),
|
|
218
216
|
n.secondaryButton?.text && (n.secondaryButton?.redirectionUrl && n.secondaryButton?.action !== "Play Video" ? /* @__PURE__ */ o(
|
|
@@ -225,7 +223,7 @@ const gt = ({
|
|
|
225
223
|
rel: n.secondaryButton.redirectionUrl.startsWith(
|
|
226
224
|
"http"
|
|
227
225
|
) ? "noopener noreferrer" : void 0,
|
|
228
|
-
onClick:
|
|
226
|
+
onClick: w,
|
|
229
227
|
style: e.secondaryButton.base,
|
|
230
228
|
onMouseEnter: (t) => Object.assign(
|
|
231
229
|
t.currentTarget.style,
|
|
@@ -240,7 +238,7 @@ const gt = ({
|
|
|
240
238
|
) : /* @__PURE__ */ o(
|
|
241
239
|
"button",
|
|
242
240
|
{
|
|
243
|
-
onClick:
|
|
241
|
+
onClick: w,
|
|
244
242
|
style: e.secondaryButton.base,
|
|
245
243
|
onMouseEnter: (t) => Object.assign(
|
|
246
244
|
t.currentTarget.style,
|
|
@@ -274,7 +272,7 @@ const gt = ({
|
|
|
274
272
|
);
|
|
275
273
|
},
|
|
276
274
|
"aria-label": "Previous feature",
|
|
277
|
-
children: /* @__PURE__ */ o(
|
|
275
|
+
children: /* @__PURE__ */ o(x, { style: { transform: "rotate(180deg)" } })
|
|
278
276
|
}
|
|
279
277
|
),
|
|
280
278
|
/* @__PURE__ */ o(
|
|
@@ -300,7 +298,7 @@ const gt = ({
|
|
|
300
298
|
);
|
|
301
299
|
},
|
|
302
300
|
"aria-label": "Next feature",
|
|
303
|
-
children: /* @__PURE__ */ o(
|
|
301
|
+
children: /* @__PURE__ */ o(x, {})
|
|
304
302
|
}
|
|
305
303
|
)
|
|
306
304
|
] })
|