@bikdotai/bik-component-library 0.0.852-beta.6 → 0.0.852-beta.7

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.
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const x=require("react/jsx-dev-runtime"),r=require("react"),re=require("react-joyride"),ne=require("./MajorUpdatePopup.js"),ae=require("./MinorUpdatePopup.js"),Ee=require("./VideoModal.js"),je=require("./hooks/useFeatureAnnouncements.js"),Ie=require("./constants/selectors.js"),Pe=I=>I&&typeof I=="object"&&"default"in I?I:{default:I},me=Pe(re),Ve=({children:I,fetchVisibleFeatures:fe,getStoreFeatureProgress:be,fetchFeatureById:ye,markFeatureAsViewedForStore:ge,isFeatureApplicableToCurrentPage:he,module:xe,router:D,storeId:f,onAnnouncementShown:se,onAnnouncementInteracted:y})=>{const{majorUpdateFeatures:i,minorUpdateFeatures:P,isLoading:U,markFeatureAsViewed:p}=je.useFeatureAnnouncements({fetchVisibleFeatures:fe,getStoreFeatureProgress:be,fetchFeatureById:ye,markFeatureAsViewedForStore:ge,isFeatureApplicableToCurrentPage:he,module:xe,router:D}),[g,F]=r.useState(null),[l,S]=r.useState(null),[W,M]=r.useState(!1),[ie,k]=r.useState([]),[Se,V]=r.useState(!1),[le,B]=r.useState([]),[de,C]=r.useState(!1),[w,h]=r.useState(!1),[d,L]=r.useState([]),[T,N]=r.useState(!1),[v,E]=r.useState(!1),[ke,O]=r.useState(!1),[Ce,A]=r.useState(""),[_,J]=r.useState(!1),[we,R]=r.useState(!1),[ue,$]=r.useState(!1),[Te,ve]=r.useState(0),[Ne,Ue]=r.useState(0),[j,z]=r.useState(new Set);r.useEffect(()=>{const e="minor-spotlight-cutout-style";let o=document.getElementById(e);return o||(o=document.createElement("style"),o.id=e,document.head.appendChild(o)),o.textContent=`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const x=require("react/jsx-dev-runtime"),r=require("react"),re=require("react-joyride"),ne=require("./MajorUpdatePopup.js"),ae=require("./MinorUpdatePopup.js"),Ee=require("./VideoModal.js"),je=require("./hooks/useFeatureAnnouncements.js"),Ie=require("./constants/selectors.js"),Pe=I=>I&&typeof I=="object"&&"default"in I?I:{default:I},me=Pe(re),Ve=({children:I,fetchVisibleFeatures:fe,getStoreFeatureProgress:be,fetchFeatureById:ye,markFeatureAsViewedForStore:ge,isFeatureApplicableToCurrentPage:he,module:xe,router:D,storeId:f,onAnnouncementShown:se,onAnnouncementInteracted:y})=>{const{majorUpdateFeatures:i,minorUpdateFeatures:P,isLoading:N,markFeatureAsViewed:p}=je.useFeatureAnnouncements({fetchVisibleFeatures:fe,getStoreFeatureProgress:be,fetchFeatureById:ye,markFeatureAsViewedForStore:ge,isFeatureApplicableToCurrentPage:he,module:xe,router:D}),[g,F]=r.useState(null),[l,S]=r.useState(null),[W,M]=r.useState(!1),[ie,k]=r.useState([]),[Se,V]=r.useState(!1),[le,B]=r.useState([]),[de,C]=r.useState(!1),[w,h]=r.useState(!1),[d,L]=r.useState([]),[T,U]=r.useState(!1),[v,E]=r.useState(!1),[ke,O]=r.useState(!1),[Ce,A]=r.useState(""),[_,J]=r.useState(!1),[we,R]=r.useState(!1),[ue,$]=r.useState(!1),[Te,ve]=r.useState(0),[Ue,Ne]=r.useState(0),[j,z]=r.useState(new Set);r.useEffect(()=>{const e="minor-spotlight-cutout-style";let o=document.getElementById(e);return o||(o=document.createElement("style"),o.id=e,document.head.appendChild(o)),o.textContent=`
2
2
  .react-joyride__spotlight {
3
3
  transition: box-shadow 0.3s ease-in-out !important;
4
4
  will-change: box-shadow, transform;
@@ -12,5 +12,5 @@
12
12
  right: 12px !important;
13
13
  left: auto !important;
14
14
  }
15
- `,()=>{const n=document.getElementById(e);n&&n.remove()}},[]),r.useEffect(()=>{ve(e=>e+1),Ue(e=>e+1),R(!1),$(!1),z(new Set)},[D?.pathname]),r.useEffect(()=>{if(i.length>0&&!g&&!U&&!de&&!_){E(!1),N(!1),M(!1),k([]),S(null),L([]);let e=0;const o=10,n=()=>{e++,document.querySelector('[data-testid="whats-new-button"]')?ce(i[0]):e<o?setTimeout(n,1e3):E(!0)};n()}else i.length===0&&!U&&E(!0)},[i,g,U,de,_]),r.useEffect(()=>{const e=D?.query?.featureId;if(!e||U||P.length===0)return;const o=P.find(s=>s.id===e);if(!o||!o.featureTag)return;N(!0),h(!0);let n=0;const t=25,a=setInterval(()=>{n++;const s=o.featureTag.startsWith("#")||o.featureTag.startsWith(".")||o.featureTag.startsWith("[")?o.featureTag:`#${o.featureTag}`;if(document.querySelector(s)){const c=[o];L(c),q(o,c),clearInterval(a)}else n>=t&&(h(!1),clearInterval(a))},200);return()=>{clearInterval(a)}},[P,D?.query?.featureId,U]),r.useEffect(()=>{if(P.length>0&&!U&&!W&&!w&&!l&&!T&&v&&!_){let e=null,o=null,n=null,t=!1;const a=()=>{if(t||w||l||T||!v)return;const s=P.filter(u=>{if(!u.featureTag||u.featureTag.trim()===""||j.has(u.id))return!1;const c=u.featureTag.startsWith("#")||u.featureTag.startsWith(".")||u.featureTag.startsWith("[")?u.featureTag:`#${u.featureTag}`;return document.querySelector(c)!==null});s.length>0&&(L(s),q(s[0],s),e&&(e.disconnect(),e=null),o&&(window.removeEventListener("scroll",o),o=null),n&&(clearTimeout(n),n=null))};return e=new MutationObserver(s=>{let u=!1;for(const c of s){if(c.type==="childList"&&c.addedNodes.length>0)for(let m=0;m<c.addedNodes.length;m++){const b=c.addedNodes[m];if(b.nodeType===Node.ELEMENT_NODE){const pe=b;if(pe.id||pe.querySelector("[id]")){u=!0;break}}}if(u)break}!W&&!t&&!w&&!l&&!T&&v&&u&&(n&&clearTimeout(n),n=setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},200))}),o=()=>{!W&&!t&&!w&&!l&&!T&&v&&(n&&clearTimeout(n),requestAnimationFrame(()=>{n=setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},300)}))},e&&e.observe(document.body,{childList:!0,subtree:!0}),o&&window.addEventListener("scroll",o,{passive:!0}),a(),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},100),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},1e3),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},500),()=>{t=!0,e&&e.disconnect(),o&&window.removeEventListener("scroll",o),n&&clearTimeout(n)}}else(P.length===0||U)&&(D?.query?.featureId&&l||(M(!1),k([]),S(null),L([]),N(!1)))},[P,U,W,w,l,T,v,p,_]);const ce=e=>{F(e);const o=i.findIndex(a=>a.id===e.id),n=i.length,t=[{target:Ie.SELECTORS.WHATS_NEW_BUTTON,content:x.jsxDEV(ne.default,{feature:e,currentIndex:o,totalFeatures:n,onSkip:()=>K(e),onExplore:a=>Q(e,a),onSecondaryAction:a=>Z(e,a),onPrevious:()=>H(e),onNext:()=>X(e),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:452,columnNumber:6},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:e,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(t),V(!0),se&&f&&se({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo})},K=r.useCallback(async e=>{const o=e||g;o&&(C(!0),await Promise.all(i.map(n=>p(n.id))),V(!1),F(null),B([]),E(!0),y&&f&&y({storeId:f,announcementId:o.id,announcementTitle:o.title,imageUrl:o.displayImage||o.image,videoUrl:o.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{C(!1)},500))},[g,i,p]),Q=r.useCallback(async(e,o)=>{C(!0),await p(e.id);const n=o??e.primaryButton?.action;if(n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),n==="Open link"){const s=e.primaryButton?.redirectionUrl||e.redirectUrl;s&&!s.startsWith("http")&&(window.location.href=s)}V(!1),F(null),B([]),i.findIndex(s=>s.id===e.id)===i.length-1&&E(!0),y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Primary",buttonName:e.buttonText||"Explore",buttonUrl:e.redirectUrl||e.productVideo}),setTimeout(()=>{C(!1)},500)},[i,p]),Z=r.useCallback(async(e,o)=>{C(!0),await p(e.id),(o??e.secondaryButton?.action)==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),V(!1),F(null),B([]),i.findIndex(s=>s.id===e.id)===i.length-1&&E(!0),y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Secondary",buttonName:e.secondaryButton?.text||"Secondary",buttonUrl:e.secondaryButton?.redirectionUrl}),setTimeout(()=>{C(!1)},500)},[i,p]),H=r.useCallback(e=>{const o=e||g;if(!o)return;const n=i.findIndex(t=>t.id===o.id);if(n>0){const t=i[n-1];F(t);const a=n-1,s=i.length,u=[{target:'[data-testid="whats-new-button"]',content:x.jsxDEV(ne.default,{feature:t,currentIndex:a,totalFeatures:s,onSkip:()=>K(t),onExplore:c=>Q(t,c),onSecondaryAction:c=>Z(t,c),onPrevious:()=>H(t),onNext:()=>X(t),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:682,columnNumber:8},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(u)}},[g,i]),X=r.useCallback(e=>{const o=e||g;if(!o)return;const n=i.findIndex(t=>t.id===o.id);if(n<i.length-1){const t=i[n+1];F(t);const a=n+1,s=i.length,u=[{target:'[data-testid="whats-new-button"]',content:x.jsxDEV(ne.default,{feature:t,currentIndex:a,totalFeatures:s,onSkip:()=>K(t),onExplore:c=>Q(t,c),onSecondaryAction:c=>Z(t,c),onPrevious:()=>H(t),onNext:()=>X(t),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:765,columnNumber:8},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(u)}else C(!0),p(o.id),V(!1),F(null),B([]),E(!0),setTimeout(()=>{C(!1)},500)},[g,i,p]),Fe=()=>{i.length>0&&!g&&document.querySelector('[data-testid="whats-new-button"]')&&ce(i[0])};r.useEffect(()=>(window.showMajorUpdatePopup=Fe,()=>{delete window.showMajorUpdatePopup}),[i,g]);const Me=r.useCallback(e=>{const{action:o}=e;o===re.ACTIONS.CLOSE&&(g&&(C(!0),i.forEach(n=>{p(n.id)}),E(!0),setTimeout(()=>{C(!1)},500)),V(!1),F(null),B([]))},[g,i,p]),Be=r.useCallback(e=>{const{action:o}=e;o===re.ACTIONS.CLOSE&&(l&&(h(!0),p(l.id),d.findIndex(a=>a.id===l.id)===d.length-1&&N(!0),y&&f&&y({storeId:f,announcementId:l.id,announcementTitle:l.title,imageUrl:l.displayImage||l.image,videoUrl:l.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{h(!1)},500)),M(!1),S(null),k([]))},[l,d,p]),q=async(e,o)=>{S(e);const n=o||d,t=n.findIndex(m=>m.id===e.id),a=n.length,s=e.featureTag.startsWith("#")||e.featureTag.startsWith(".")||e.featureTag.startsWith("[")?e.featureTag:`#${e.featureTag}`,u=document.querySelector(s);if(u)try{const{scrollToElementSmooth:m}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await m(u,120)}catch{}const c=[{target:s,content:x.jsxDEV(ae.default,{feature:e,currentIndex:t,totalFeatures:a,onSkip:()=>G(e),onExplore:m=>Y(e,m),onSecondaryAction:m=>ee(e,m),onPrevious:()=>te(e),onNext:()=>oe(e),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:964,columnNumber:6},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:e,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(c),M(!0)},G=r.useCallback(async e=>{const o=e||l;if(o){h(!0),await p(o.id),z(t=>new Set(t).add(o.id)),M(!1),S(null),k([]);const n=d.find(t=>t.id!==o.id&&!j.has(t.id));y&&f&&y({storeId:f,announcementId:o.id,announcementTitle:o.title,imageUrl:o.displayImage||o.image,videoUrl:o.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{h(!1),n?q(n,d):N(!0)},500)}},[l,d,p,j]),Y=r.useCallback(async(e,o)=>{h(!0),await p(e.id),z(a=>new Set(a).add(e.id));const n=o??e.primaryButton?.action;if(n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),n==="Open link"){const a=e.primaryButton?.redirectionUrl||e.redirectUrl;a&&!a.startsWith("http")&&(window.location.href=a)}M(!1),S(null),k([]);const t=d.find(a=>a.id!==e.id&&!j.has(a.id));y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Primary",buttonName:e.buttonText||"Explore",buttonUrl:e.redirectUrl||e.productVideo}),setTimeout(()=>{h(!1),t&&n!=="Play Video"?q(t,d):t||N(!0)},500)},[d,p,j]),ee=r.useCallback(async(e,o)=>{h(!0),await p(e.id),z(a=>new Set(a).add(e.id));const n=o??e.secondaryButton?.action;n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),M(!1),S(null),k([]);const t=d.find(a=>a.id!==e.id&&!j.has(a.id));y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Secondary",buttonName:e.secondaryButton?.text||"Secondary",buttonUrl:e.secondaryButton?.redirectionUrl}),setTimeout(()=>{h(!1),t&&n!=="Play Video"?q(t,d):t||N(!0)},500)},[d,p,j]),te=r.useCallback(async e=>{const o=e||l;if(!o)return;const n=d.findIndex(t=>t.id===o.id);if(n>0){const t=d[n-1];S(t);const a=t.featureTag.startsWith("#")||t.featureTag.startsWith(".")||t.featureTag.startsWith("[")?t.featureTag:`#${t.featureTag}`,s=document.querySelector(a);if(s)try{const{scrollToElementSmooth:b}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await b(s,120)}catch{}const u=n-1,c=d.length,m=[{target:a,content:x.jsxDEV(ae.default,{feature:t,currentIndex:u,totalFeatures:c,onSkip:()=>G(t),onExplore:b=>Y(t,b),onSecondaryAction:b=>ee(t,b),onPrevious:()=>te(t),onNext:()=>oe(t),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1239,columnNumber:8},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(m)}},[l,d]),oe=r.useCallback(async e=>{const o=e||l;if(!o)return;const n=d.findIndex(t=>t.id===o.id);if(n<d.length-1){const t=d[n+1];S(t);const a=t.featureTag.startsWith("#")||t.featureTag.startsWith(".")||t.featureTag.startsWith("[")?t.featureTag:`#${t.featureTag}`,s=document.querySelector(a);if(s)try{const{scrollToElementSmooth:b}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await b(s,120)}catch{}const u=n+1,c=d.length,m=[{target:a,content:x.jsxDEV(ae.default,{feature:t,currentIndex:u,totalFeatures:c,onSkip:()=>G(t),onExplore:b=>Y(t,b),onSecondaryAction:b=>ee(t,b),onPrevious:()=>te(t),onNext:()=>oe(t),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1339,columnNumber:8},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(m)}else h(!0),N(!0),p(o.id),M(!1),S(null),k([]),setTimeout(()=>{h(!1)},500)},[l,d,p]);return x.jsxDEV(x.Fragment,{children:[I,le.length>0&&x.jsxDEV(me.default,{steps:le,run:Se,continuous:!1,showProgress:!1,showSkipButton:!1,callback:Me,disableOverlayClose:!1,disableCloseOnEsc:!1,disableOverlay:!1,spotlightClicks:!1,styles:{options:{primaryColor:"#007bff",zIndex:1e4,width:"auto",arrowColor:we?"transparent":"#212121"},overlay:{backgroundColor:"transparent"},spotlight:{backgroundColor:"transparent",border:"none",boxShadow:"none"},tooltip:{borderRadius:"16px",fontSize:"14px",padding:0,backgroundColor:"transparent",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}},locale:{back:"Back",close:"Close",last:"Close",next:"Next",skip:"Skip"}},`major-joyride-${Te}`,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1414,columnNumber:5},void 0),ie.length>0&&x.jsxDEV(me.default,{steps:ie,run:W,continuous:!1,showProgress:!1,showSkipButton:!1,callback:Be,disableOverlayClose:!1,disableCloseOnEsc:!1,disableOverlay:!1,scrollToFirstStep:!0,scrollOffset:120,disableScrolling:!1,styles:{options:{primaryColor:"#007bff",zIndex:1e4,width:"auto",arrowColor:ue?"transparent":"#ffffff"},overlay:{backgroundColor:"transparent"},spotlight:{backgroundColor:"transparent",borderRadius:"8px",boxShadow:ue?"none":"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)"},tooltip:{borderRadius:"4px",fontSize:"14px",padding:0,backgroundColor:"transparent",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonSkip:{display:"none"},buttonClose:{display:"none"}},locale:{back:"Back",close:"Close",last:"Close",next:"Next",skip:"Skip"}},`minor-joyride-${Ne}`,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1477,columnNumber:5},void 0),x.jsxDEV(Ee.VideoModal,{isOpen:ke,videoUrl:Ce,onClose:()=>{O(!1),A(""),J(!1);const e=d.find(o=>!j.has(o.id));e?setTimeout(()=>{q(e,d)},300):N(!0)}},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1543,columnNumber:4},void 0)]},void 0,!0,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1410,columnNumber:3},void 0)};exports.default=Ve;
15
+ `,()=>{const n=document.getElementById(e);n&&n.remove()}},[]),r.useEffect(()=>{ve(e=>e+1),Ne(e=>e+1),R(!1),$(!1),z(new Set)},[D?.pathname]),r.useEffect(()=>{if(i.length>0&&!g&&!N&&!de&&!_){E(!1),U(!1),M(!1),k([]),S(null),L([]);let e=0;const o=10,n=()=>{e++,document.querySelector('[data-testid="whats-new-button"]')?ce(i[0]):e<o?setTimeout(n,1e3):E(!0)};n()}else i.length===0&&!N&&E(!0)},[i,g,N,de,_]),r.useEffect(()=>{const e=D?.query?.featureId;if(!e||N||P.length===0)return;const o=P.find(s=>s.id===e);if(!o||!o.featureTag)return;U(!0),h(!0);let n=0;const t=25,a=setInterval(()=>{n++;const s=o.featureTag.startsWith("#")||o.featureTag.startsWith(".")||o.featureTag.startsWith("[")?o.featureTag:`#${o.featureTag}`;if(document.querySelector(s)){const c=[o];L(c),q(o,c),clearInterval(a)}else n>=t&&(h(!1),clearInterval(a))},200);return()=>{clearInterval(a)}},[P,D?.query?.featureId,N]),r.useEffect(()=>{if(P.length>0&&!N&&!W&&!w&&!l&&!T&&v&&!_){let e=null,o=null,n=null,t=!1;const a=()=>{if(t||w||l||T||!v)return;const s=P.filter(u=>{if(!u.featureTag||u.featureTag.trim()===""||j.has(u.id))return!1;const c=u.featureTag.startsWith("#")||u.featureTag.startsWith(".")||u.featureTag.startsWith("[")?u.featureTag:`#${u.featureTag}`;return document.querySelector(c)!==null});s.length>0&&(L(s),q(s[0],s),e&&(e.disconnect(),e=null),o&&(window.removeEventListener("scroll",o),o=null),n&&(clearTimeout(n),n=null))};return e=new MutationObserver(s=>{let u=!1;for(const c of s){if(c.type==="childList"&&c.addedNodes.length>0)for(let m=0;m<c.addedNodes.length;m++){const b=c.addedNodes[m];if(b.nodeType===Node.ELEMENT_NODE){const pe=b;if(pe.id||pe.querySelector("[id]")){u=!0;break}}}if(u)break}!W&&!t&&!w&&!l&&!T&&v&&u&&(n&&clearTimeout(n),n=setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},200))}),o=()=>{!W&&!t&&!w&&!l&&!T&&v&&(n&&clearTimeout(n),requestAnimationFrame(()=>{n=setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},300)}))},e&&e.observe(document.body,{childList:!0,subtree:!0}),o&&window.addEventListener("scroll",o,{passive:!0}),a(),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},100),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},1e3),setTimeout(()=>{!t&&!w&&!l&&!T&&v&&a()},500),()=>{t=!0,e&&e.disconnect(),o&&window.removeEventListener("scroll",o),n&&clearTimeout(n)}}else(P.length===0||N)&&(D?.query?.featureId&&l||(M(!1),k([]),S(null),L([]),U(!1)))},[P,N,W,w,l,T,v,p,_]);const ce=e=>{F(e);const o=i.findIndex(a=>a.id===e.id),n=i.length,t=[{target:Ie.SELECTORS.WHATS_NEW_BUTTON,content:x.jsxDEV(ne.default,{feature:e,currentIndex:o,totalFeatures:n,onSkip:()=>K(e),onExplore:a=>Q(e,a),onSecondaryAction:a=>Z(e,a),onPrevious:()=>H(e),onNext:()=>X(e),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:452,columnNumber:6},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:e,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(t),V(!0),se&&f&&se({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo})},K=r.useCallback(async e=>{const o=e||g;o&&(C(!0),await Promise.all(i.map(n=>p(n.id))),V(!1),F(null),B([]),E(!0),y&&f&&y({storeId:f,announcementId:o.id,announcementTitle:o.title,imageUrl:o.displayImage||o.image,videoUrl:o.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{C(!1)},500))},[g,i,p]),Q=r.useCallback(async(e,o)=>{C(!0),await p(e.id);const n=o??e.primaryButton?.action;if(n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),n==="Open link"){const s=e.primaryButton?.redirectionUrl||e.redirectUrl;s&&!s.startsWith("http")&&(window.location.href=s)}V(!1),F(null),B([]),i.findIndex(s=>s.id===e.id)===i.length-1&&E(!0),y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Primary",buttonName:e.primaryButton?.text||e.buttonText||"Explore",buttonUrl:e.primaryButton?.redirectionUrl||e.redirectUrl||e.productVideo}),setTimeout(()=>{C(!1)},500)},[i,p]),Z=r.useCallback(async(e,o)=>{C(!0),await p(e.id),(o??e.secondaryButton?.action)==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),V(!1),F(null),B([]),i.findIndex(s=>s.id===e.id)===i.length-1&&E(!0),y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Secondary",buttonName:e.secondaryButton?.text||"Secondary",buttonUrl:e.secondaryButton?.redirectionUrl}),setTimeout(()=>{C(!1)},500)},[i,p]),H=r.useCallback(e=>{const o=e||g;if(!o)return;const n=i.findIndex(t=>t.id===o.id);if(n>0){const t=i[n-1];F(t);const a=n-1,s=i.length,u=[{target:'[data-testid="whats-new-button"]',content:x.jsxDEV(ne.default,{feature:t,currentIndex:a,totalFeatures:s,onSkip:()=>K(t),onExplore:c=>Q(t,c),onSecondaryAction:c=>Z(t,c),onPrevious:()=>H(t),onNext:()=>X(t),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:688,columnNumber:8},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(u)}},[g,i]),X=r.useCallback(e=>{const o=e||g;if(!o)return;const n=i.findIndex(t=>t.id===o.id);if(n<i.length-1){const t=i[n+1];F(t);const a=n+1,s=i.length,u=[{target:'[data-testid="whats-new-button"]',content:x.jsxDEV(ne.default,{feature:t,currentIndex:a,totalFeatures:s,onSkip:()=>K(t),onExplore:c=>Q(t,c),onSecondaryAction:c=>Z(t,c),onPrevious:()=>H(t),onNext:()=>X(t),setIsClosing:R},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:771,columnNumber:8},void 0),placement:"bottom-start",placementBeacon:"top-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMajor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"16px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];B(u)}else C(!0),p(o.id),V(!1),F(null),B([]),E(!0),setTimeout(()=>{C(!1)},500)},[g,i,p]),Fe=()=>{i.length>0&&!g&&document.querySelector('[data-testid="whats-new-button"]')&&ce(i[0])};r.useEffect(()=>(window.showMajorUpdatePopup=Fe,()=>{delete window.showMajorUpdatePopup}),[i,g]);const Me=r.useCallback(e=>{const{action:o}=e;o===re.ACTIONS.CLOSE&&(g&&(C(!0),i.forEach(n=>{p(n.id)}),E(!0),setTimeout(()=>{C(!1)},500)),V(!1),F(null),B([]))},[g,i,p]),Be=r.useCallback(e=>{const{action:o}=e;o===re.ACTIONS.CLOSE&&(l&&(h(!0),p(l.id),d.findIndex(a=>a.id===l.id)===d.length-1&&U(!0),y&&f&&y({storeId:f,announcementId:l.id,announcementTitle:l.title,imageUrl:l.displayImage||l.image,videoUrl:l.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{h(!1)},500)),M(!1),S(null),k([]))},[l,d,p]),q=async(e,o)=>{S(e);const n=o||d,t=n.findIndex(m=>m.id===e.id),a=n.length,s=e.featureTag.startsWith("#")||e.featureTag.startsWith(".")||e.featureTag.startsWith("[")?e.featureTag:`#${e.featureTag}`,u=document.querySelector(s);if(u)try{const{scrollToElementSmooth:m}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await m(u,120)}catch{}const c=[{target:s,content:x.jsxDEV(ae.default,{feature:e,currentIndex:t,totalFeatures:a,onSkip:()=>G(e),onExplore:m=>Y(e,m),onSecondaryAction:m=>ee(e,m),onPrevious:()=>te(e),onNext:()=>oe(e),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:970,columnNumber:6},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:e,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(c),M(!0)},G=r.useCallback(async e=>{const o=e||l;if(o){h(!0),await p(o.id),z(t=>new Set(t).add(o.id)),M(!1),S(null),k([]);const n=d.find(t=>t.id!==o.id&&!j.has(t.id));y&&f&&y({storeId:f,announcementId:o.id,announcementTitle:o.title,imageUrl:o.displayImage||o.image,videoUrl:o.productVideo,buttonClicked:"Skip",buttonName:"Skip",buttonUrl:void 0}),setTimeout(()=>{h(!1),n?q(n,d):U(!0)},500)}},[l,d,p,j]),Y=r.useCallback(async(e,o)=>{h(!0),await p(e.id),z(a=>new Set(a).add(e.id));const n=o??e.primaryButton?.action;if(n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),n==="Open link"){const a=e.primaryButton?.redirectionUrl||e.redirectUrl;a&&!a.startsWith("http")&&(window.location.href=a)}M(!1),S(null),k([]);const t=d.find(a=>a.id!==e.id&&!j.has(a.id));y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Primary",buttonName:e.primaryButton?.text||e.buttonText||"Explore",buttonUrl:e.primaryButton?.redirectionUrl||e.redirectUrl||e.productVideo}),setTimeout(()=>{h(!1),t&&n!=="Play Video"?q(t,d):t||U(!0)},500)},[d,p,j]),ee=r.useCallback(async(e,o)=>{h(!0),await p(e.id),z(a=>new Set(a).add(e.id));const n=o??e.secondaryButton?.action;n==="Play Video"&&e.productVideo&&(A(e.productVideo),O(!0),J(!0)),M(!1),S(null),k([]);const t=d.find(a=>a.id!==e.id&&!j.has(a.id));y&&f&&y({storeId:f,announcementId:e.id,announcementTitle:e.title,imageUrl:e.displayImage||e.image,videoUrl:e.productVideo,buttonClicked:"Secondary",buttonName:e.secondaryButton?.text||"Secondary",buttonUrl:e.secondaryButton?.redirectionUrl}),setTimeout(()=>{h(!1),t&&n!=="Play Video"?q(t,d):t||U(!0)},500)},[d,p,j]),te=r.useCallback(async e=>{const o=e||l;if(!o)return;const n=d.findIndex(t=>t.id===o.id);if(n>0){const t=d[n-1];S(t);const a=t.featureTag.startsWith("#")||t.featureTag.startsWith(".")||t.featureTag.startsWith("[")?t.featureTag:`#${t.featureTag}`,s=document.querySelector(a);if(s)try{const{scrollToElementSmooth:b}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await b(s,120)}catch{}const u=n-1,c=d.length,m=[{target:a,content:x.jsxDEV(ae.default,{feature:t,currentIndex:u,totalFeatures:c,onSkip:()=>G(t),onExplore:b=>Y(t,b),onSecondaryAction:b=>ee(t,b),onPrevious:()=>te(t),onNext:()=>oe(t),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1251,columnNumber:8},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(m)}},[l,d]),oe=r.useCallback(async e=>{const o=e||l;if(!o)return;const n=d.findIndex(t=>t.id===o.id);if(n<d.length-1){const t=d[n+1];S(t);const a=t.featureTag.startsWith("#")||t.featureTag.startsWith(".")||t.featureTag.startsWith("[")?t.featureTag:`#${t.featureTag}`,s=document.querySelector(a);if(s)try{const{scrollToElementSmooth:b}=await Promise.resolve().then(()=>require("./utils/elementHelpers.js"));await b(s,120)}catch{}const u=n+1,c=d.length,m=[{target:a,content:x.jsxDEV(ae.default,{feature:t,currentIndex:u,totalFeatures:c,onSkip:()=>G(t),onExplore:b=>Y(t,b),onSecondaryAction:b=>ee(t,b),onPrevious:()=>te(t),onNext:()=>oe(t),setIsClosing:$},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1351,columnNumber:8},void 0),placement:"bottom",placementBeacon:"bottom-end",disableBeacon:!0,hideCloseButton:!0,hideSkipButton:!0,hideFooter:!0,offset:0,data:{feature:t,isMinor:!0},styles:{tooltip:{padding:0,backgroundColor:"transparent",borderRadius:"4px",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}}}];k(m)}else h(!0),U(!0),p(o.id),M(!1),S(null),k([]),setTimeout(()=>{h(!1)},500)},[l,d,p]);return x.jsxDEV(x.Fragment,{children:[I,le.length>0&&x.jsxDEV(me.default,{steps:le,run:Se,continuous:!1,showProgress:!1,showSkipButton:!1,callback:Me,disableOverlayClose:!1,disableCloseOnEsc:!1,disableOverlay:!1,spotlightClicks:!1,styles:{options:{primaryColor:"#007bff",zIndex:1e4,width:"auto",arrowColor:we?"transparent":"#212121"},overlay:{backgroundColor:"transparent"},spotlight:{backgroundColor:"transparent",border:"none",boxShadow:"none"},tooltip:{borderRadius:"16px",fontSize:"14px",padding:0,backgroundColor:"transparent",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonClose:{display:"none"},buttonSkip:{display:"none"}},locale:{back:"Back",close:"Close",last:"Close",next:"Next",skip:"Skip"}},`major-joyride-${Te}`,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1426,columnNumber:5},void 0),ie.length>0&&x.jsxDEV(me.default,{steps:ie,run:W,continuous:!1,showProgress:!1,showSkipButton:!1,callback:Be,disableOverlayClose:!1,disableCloseOnEsc:!1,disableOverlay:!1,scrollToFirstStep:!0,scrollOffset:120,disableScrolling:!1,styles:{options:{primaryColor:"#007bff",zIndex:1e4,width:"auto",arrowColor:ue?"transparent":"#ffffff"},overlay:{backgroundColor:"transparent"},spotlight:{backgroundColor:"transparent",borderRadius:"8px",boxShadow:ue?"none":"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)"},tooltip:{borderRadius:"4px",fontSize:"14px",padding:0,backgroundColor:"transparent",border:"none",filter:"none",boxShadow:"none"},tooltipContent:{padding:0},buttonNext:{display:"none"},buttonBack:{display:"none"},buttonSkip:{display:"none"},buttonClose:{display:"none"}},locale:{back:"Back",close:"Close",last:"Close",next:"Next",skip:"Skip"}},`minor-joyride-${Ue}`,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1489,columnNumber:5},void 0),x.jsxDEV(Ee.VideoModal,{isOpen:ke,videoUrl:Ce,onClose:()=>{O(!1),A(""),J(!1);const e=d.find(o=>!j.has(o.id));e?setTimeout(()=>{q(e,d)},300):U(!0)}},void 0,!1,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1555,columnNumber:4},void 0)]},void 0,!0,{fileName:"/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",lineNumber:1422,columnNumber:3},void 0)};exports.default=Ve;
16
16
  //# sourceMappingURL=FeatureAnnouncementProvider.js.map
@@ -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\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\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 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\t// Fire announcement interacted callback for Skip\n\t\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t\tannouncementId: currentMinorFeature.id,\n\t\t\t\t\t\t\tannouncementTitle: currentMinorFeature.title,\n\t\t\t\t\t\t\timageUrl:\n\t\t\t\t\t\t\t\tcurrentMinorFeature.displayImage || currentMinorFeature.image,\n\t\t\t\t\t\t\tvideoUrl: currentMinorFeature.productVideo,\n\t\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t\t});\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\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\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\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","jsxDEV","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handleSecondaryMajorFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","this","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","updatedSteps","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","minorSteps","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handleSecondaryMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","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\t// Fire announcement interacted callback for Skip\n\t\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t\tannouncementId: currentMinorFeature.id,\n\t\t\t\t\t\t\tannouncementTitle: currentMinorFeature.title,\n\t\t\t\t\t\t\timageUrl:\n\t\t\t\t\t\t\t\tcurrentMinorFeature.displayImage || currentMinorFeature.image,\n\t\t\t\t\t\t\tvideoUrl: currentMinorFeature.productVideo,\n\t\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t\t});\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\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","jsxDEV","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handleSecondaryMajorFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","this","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","updatedSteps","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","minorSteps","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handleSecondaryMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","Fragment","Joyride","VideoModal"],"mappings":"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"}
@@ -269,8 +269,10 @@ const $e = ({
269
269
  imageUrl: e.displayImage || e.image,
270
270
  videoUrl: e.productVideo,
271
271
  buttonClicked: "Primary",
272
- buttonName: e.buttonText || "Explore",
273
- buttonUrl: e.redirectUrl || e.productVideo
272
+ // Mirrors the rendered button and the navigation target, which both
273
+ // prefer primaryButton over the legacy top-level fields.
274
+ buttonName: e.primaryButton?.text || e.buttonText || "Explore",
275
+ buttonUrl: e.primaryButton?.redirectionUrl || e.redirectUrl || e.productVideo
274
276
  }), setTimeout(() => {
275
277
  w(!1);
276
278
  }, 500);
@@ -326,7 +328,7 @@ const $e = ({
326
328
  !1,
327
329
  {
328
330
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
329
- lineNumber: 682,
331
+ lineNumber: 688,
330
332
  columnNumber: 8
331
333
  },
332
334
  void 0
@@ -401,7 +403,7 @@ const $e = ({
401
403
  !1,
402
404
  {
403
405
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
404
- lineNumber: 765,
406
+ lineNumber: 771,
405
407
  columnNumber: 8
406
408
  },
407
409
  void 0
@@ -513,7 +515,7 @@ const $e = ({
513
515
  !1,
514
516
  {
515
517
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
516
- lineNumber: 964,
518
+ lineNumber: 970,
517
519
  columnNumber: 6
518
520
  },
519
521
  void 0
@@ -600,8 +602,10 @@ const $e = ({
600
602
  imageUrl: e.displayImage || e.image,
601
603
  videoUrl: e.productVideo,
602
604
  buttonClicked: "Primary",
603
- buttonName: e.buttonText || "Explore",
604
- buttonUrl: e.redirectUrl || e.productVideo
605
+ // Mirrors the rendered button and the navigation target, which both
606
+ // prefer primaryButton over the legacy top-level fields.
607
+ buttonName: e.primaryButton?.text || e.buttonText || "Explore",
608
+ buttonUrl: e.primaryButton?.redirectionUrl || e.redirectUrl || e.productVideo
605
609
  }), setTimeout(() => {
606
610
  h(!1), t && n !== "Play Video" ? W(t, l) : t || N(!0);
607
611
  }, 500);
@@ -668,7 +672,7 @@ const $e = ({
668
672
  !1,
669
673
  {
670
674
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
671
- lineNumber: 1239,
675
+ lineNumber: 1251,
672
676
  columnNumber: 8
673
677
  },
674
678
  void 0
@@ -750,7 +754,7 @@ const $e = ({
750
754
  !1,
751
755
  {
752
756
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
753
- lineNumber: 1339,
757
+ lineNumber: 1351,
754
758
  columnNumber: 8
755
759
  },
756
760
  void 0
@@ -864,7 +868,7 @@ const $e = ({
864
868
  !1,
865
869
  {
866
870
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
867
- lineNumber: 1414,
871
+ lineNumber: 1426,
868
872
  columnNumber: 5
869
873
  },
870
874
  void 0
@@ -936,7 +940,7 @@ const $e = ({
936
940
  !1,
937
941
  {
938
942
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
939
- lineNumber: 1477,
943
+ lineNumber: 1489,
940
944
  columnNumber: 5
941
945
  },
942
946
  void 0
@@ -960,14 +964,14 @@ const $e = ({
960
964
  !1,
961
965
  {
962
966
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
963
- lineNumber: 1543,
967
+ lineNumber: 1555,
964
968
  columnNumber: 4
965
969
  },
966
970
  void 0
967
971
  )
968
972
  ] }, void 0, !0, {
969
973
  fileName: "/Users/syedanoorain/Downloads/bik-component-library/src/components/feature-announcements/FeatureAnnouncementProvider.tsx",
970
- lineNumber: 1410,
974
+ lineNumber: 1422,
971
975
  columnNumber: 3
972
976
  }, void 0);
973
977
  };
@@ -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\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\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 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\t// Fire announcement interacted callback for Skip\n\t\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t\tannouncementId: currentMinorFeature.id,\n\t\t\t\t\t\t\tannouncementTitle: currentMinorFeature.title,\n\t\t\t\t\t\t\timageUrl:\n\t\t\t\t\t\t\t\tcurrentMinorFeature.displayImage || currentMinorFeature.image,\n\t\t\t\t\t\t\tvideoUrl: currentMinorFeature.productVideo,\n\t\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t\t});\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\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\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\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","jsxDEV","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handleSecondaryMajorFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","this","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handleSecondaryMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","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\t// Fire announcement interacted callback for Skip\n\t\t\t\t\tif (onAnnouncementInteracted && storeId) {\n\t\t\t\t\t\tonAnnouncementInteracted({\n\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t\tannouncementId: currentMinorFeature.id,\n\t\t\t\t\t\t\tannouncementTitle: currentMinorFeature.title,\n\t\t\t\t\t\t\timageUrl:\n\t\t\t\t\t\t\t\tcurrentMinorFeature.displayImage || currentMinorFeature.image,\n\t\t\t\t\t\t\tvideoUrl: currentMinorFeature.productVideo,\n\t\t\t\t\t\t\tbuttonClicked: 'Skip',\n\t\t\t\t\t\t\tbuttonName: 'Skip',\n\t\t\t\t\t\t\tbuttonUrl: undefined,\n\t\t\t\t\t\t});\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\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","jsxDEV","MajorUpdatePopup","handleSkipMajorUpdate","triggeredAction","handleExploreFeature","handleSecondaryMajorFeature","handlePreviousMajorUpdate","handleNextMajorUpdate","this","useCallback","targetFeature","majorFeature","action","url","prevFeature","prevIndex","nextFeature","nextIndex","showMajorUpdatePopup","handleMajorJoyrideCallback","data","ACTIONS","handleMinorJoyrideCallback","featuresToUse","features","targetElement","scrollToElementSmooth","MinorUpdatePopup","handleSkipMinorUpdate","handleExploreMinorFeature","handleSecondaryMinorFeature","handlePreviousMinorUpdate","handleNextMinorUpdate","Fragment","Joyride","VideoModal"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bikdotai/bik-component-library",
3
- "version": "0.0.852-beta.6",
3
+ "version": "0.0.852-beta.7",
4
4
  "description": "Bik Component Library",
5
5
  "repository": {
6
6
  "type": "git",