@envive-ai/react-hooks 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/amplitudeContext-CHzas7Cf.d.cts +52 -0
- package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
- package/dist/amplitudeContext-hY3caPC6.js +322 -0
- package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
- package/dist/api-DjeZXxl_.js +207 -0
- package/dist/api-_JaUnIUj.cjs +292 -0
- package/dist/app-CjsQ2_n-.js +132 -0
- package/dist/app-CnKRZ9RW.cjs +178 -0
- package/dist/application/models/graphql/index.cjs +3 -12
- package/dist/application/models/graphql/index.d.cts +1 -1
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/graphql/index.js +1 -10
- package/dist/application/models/guards/api/index.cjs +1 -2
- package/dist/application/models/guards/api/index.d.cts +2 -2
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/api/index.js +1 -2
- package/dist/application/models/index.cjs +48 -54
- package/dist/application/models/index.d.cts +7 -9
- package/dist/application/models/index.d.ts +7 -9
- package/dist/application/models/index.js +7 -11
- package/dist/application/models/utilityTypes/index.cjs +1 -1
- package/dist/application/models/utilityTypes/index.d.cts +1 -1
- package/dist/application/models/utilityTypes/index.d.ts +1 -1
- package/dist/application/models/utilityTypes/index.js +1 -1
- package/dist/application/models/variantInfo/index.cjs +1 -1
- package/dist/application/models/variantInfo/index.d.cts +1 -1
- package/dist/application/models/variantInfo/index.d.ts +1 -1
- package/dist/application/models/variantInfo/index.js +1 -1
- package/dist/application/utils/index.cjs +40 -37
- package/dist/application/utils/index.d.cts +18 -14
- package/dist/application/utils/index.d.ts +19 -15
- package/dist/application/utils/index.js +13 -10
- package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
- package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
- package/dist/atoms/app/index.cjs +14 -16
- package/dist/atoms/app/index.d.cts +20 -19
- package/dist/atoms/app/index.d.ts +20 -19
- package/dist/atoms/app/index.js +10 -11
- package/dist/atoms/atomStore/index.cjs +2 -1
- package/dist/atoms/atomStore/index.d.cts +24 -2
- package/dist/atoms/atomStore/index.d.ts +24 -2
- package/dist/atoms/atomStore/index.js +2 -1
- package/dist/atoms/chat/index.cjs +44 -40
- package/dist/atoms/chat/index.d.cts +35 -36
- package/dist/atoms/chat/index.d.ts +35 -36
- package/dist/atoms/chat/index.js +14 -10
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +5 -5
- package/dist/atoms/globalSearch/index.d.ts +6 -6
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +26 -38
- package/dist/atoms/org/index.d.cts +35 -48
- package/dist/atoms/org/index.d.ts +35 -48
- package/dist/atoms/org/index.js +11 -11
- package/dist/atoms/search/index.cjs +47 -41
- package/dist/atoms/search/index.d.cts +7 -9
- package/dist/atoms/search/index.d.ts +7 -9
- package/dist/atoms/search/index.js +16 -10
- package/dist/bandolier-DYEz4-8C.js +1229 -0
- package/dist/bandolier-o_-xrbOV.cjs +1229 -0
- package/dist/carpe-CsG5jCcl.cjs +607 -0
- package/dist/carpe-DONk00bZ.js +605 -0
- package/dist/cdnUtils-32v8bDX9.cjs +16 -0
- package/dist/cdnUtils-E4tLBt2g.js +11 -0
- package/dist/{chat-_NzpO_Hn.cjs → chat-BubCW1as.cjs} +1 -1
- package/dist/chat-CO7cRkaq.cjs +506 -0
- package/dist/{chat-CHmD79E1.js → chat-CV6MXeID.js} +1 -1
- package/dist/chat-hcRc4RRd.js +285 -0
- package/dist/{components-Dl-TMD9k.js → components-B4T3Uzth.js} +1 -1
- package/dist/{components-D0XDRcaN.cjs → components-Cw9WjA6g.cjs} +1 -1
- package/dist/config/locators/components/chat/index.cjs +1 -1
- package/dist/config/locators/components/chat/index.d.cts +1 -1
- package/dist/config/locators/components/chat/index.d.ts +1 -1
- package/dist/config/locators/components/chat/index.js +1 -1
- package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
- package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
- package/dist/config/locators/components/index.cjs +1 -1
- package/dist/config/locators/components/index.d.cts +1 -1
- package/dist/config/locators/components/index.d.ts +1 -1
- package/dist/config/locators/components/index.js +1 -1
- package/dist/config/locators/components/search/index.d.ts +1 -1
- package/dist/config/locators/index.cjs +4 -4
- package/dist/config/locators/index.d.cts +2 -2
- package/dist/config/locators/index.d.ts +2 -2
- package/dist/config/locators/index.js +4 -4
- package/dist/contexts/index.cjs +45 -14
- package/dist/contexts/index.d.cts +10 -10
- package/dist/contexts/index.d.ts +10 -10
- package/dist/contexts/index.js +22 -11
- package/dist/contexts-B4ihTBsV.cjs +2980 -0
- package/dist/contexts-DGlr7M1o.js +2596 -0
- package/dist/coterie-CKB93qfz.cjs +239 -0
- package/dist/{coterie--MGvWeVh.cjs → coterie-DHcj2fRE.js} +64 -65
- package/dist/{custservice-types-C8-9vKWb.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
- package/dist/{custservice-types-CamCiXjq.js → custservice-types-mnIunabv.js} +1 -1
- package/dist/default-BnB4p0Se.cjs +234 -0
- package/dist/default-D6f5Dyt7.js +199 -0
- package/dist/default-ZKkE5zT4.cjs +4 -0
- package/dist/default-legGZJwI.js +4 -0
- package/dist/{divIds-CjceLRD9.cjs → divIds-2dJlU3z8.cjs} +1 -15
- package/dist/{divIds-0Vj9g-fM.js → divIds-BUrN2vY-.js} +2 -4
- package/dist/dreamlandBaby-BiRYYFav.js +346 -0
- package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
- package/dist/{embedded-_cLpd6FK.js → embedded-BJLWIriJ.js} +1 -1
- package/dist/{embedded-B5Wi9g0T.cjs → embedded-Dl79TJLC.cjs} +1 -1
- package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
- package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
- package/dist/enviveConfig-BccuzS2a.cjs +240 -0
- package/dist/enviveConfig-CzhTz8Aa.js +152 -0
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.js +1 -1
- package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
- package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
- package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
- package/dist/fiveCbd-Dz2NouOF.js +613 -0
- package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
- package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
- package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
- package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
- package/dist/graphql-BNW60InJ.cjs +128 -0
- package/dist/graphql-CjB8wHzm.js +74 -0
- package/dist/graphqlConfig-CYt6tWII.js +30 -0
- package/dist/graphqlConfig-DicykC-o.cjs +61 -0
- package/dist/greenpan-B_EbPkSP.js +397 -0
- package/dist/greenpan-kPE4fJgd.cjs +397 -0
- package/dist/grooveLife-Ckuir319.js +342 -0
- package/dist/grooveLife-DKSEQp1F.cjs +342 -0
- package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
- package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
- package/dist/hooks/index.cjs +39 -13
- package/dist/hooks/index.d.cts +127 -45
- package/dist/hooks/index.d.ts +124 -42
- package/dist/hooks/index.js +22 -11
- package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
- package/dist/{index-BdNKc2ix.d.cts → index-BDPWBU3h.d.cts} +1 -1
- package/dist/index-BMPtlgac.d.ts +191 -0
- package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
- package/dist/{index-BrXuc_Ck.d.cts → index-Byb45OPg.d.cts} +1 -1
- package/dist/{index-CSIOQD-A.d.ts → index-C6KdON7d.d.ts} +1 -1
- package/dist/index-C7pGDl1A.d.ts +1609 -0
- package/dist/{index-K2kNsOTw.d.cts → index-C9lgsCWp.d.cts} +32 -32
- package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
- package/dist/{index-CbJZOEU4.d.ts → index-Cc-wBCn6.d.ts} +32 -32
- package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
- package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
- package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
- package/dist/{index-Cr2y08f1.d.ts → index-DOii3C6b.d.ts} +1 -1
- package/dist/index-DTu2X-YS.d.cts +1609 -0
- package/dist/index-OEifcBsm.d.cts +191 -0
- package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
- package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
- package/dist/interceptors/index.cjs +2 -12
- package/dist/interceptors/index.d.cts +8 -13
- package/dist/interceptors/index.d.ts +8 -13
- package/dist/interceptors/index.js +2 -11
- package/dist/jackArcher-B39OEIj6.cjs +727 -0
- package/dist/{jackArcher-sO9EbgrZ.js → jackArcher-BwkWGybC.js} +24 -25
- package/dist/jordanCraig-CxRH_jLi.js +1786 -0
- package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
- package/dist/kindredBravely-D78VwL20.cjs +490 -0
- package/dist/kindredBravely-DQDpAzdl.js +490 -0
- package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
- package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
- package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
- package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
- package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
- package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
- package/dist/longevityrx-DdV3v26F.cjs +320 -0
- package/dist/longevityrx-DfPDfvAt.js +320 -0
- package/dist/lookOptic-DgXFGBPP.cjs +282 -0
- package/dist/{lookOptic-Jwf7EAU8.js → lookOptic-FgVW1afF.js} +19 -20
- package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
- package/dist/{mantraBrand-DoaVj837.js → mantraBrand-uV8HCDR8.js} +22 -23
- package/dist/medterra-BtDpr1Hw.cjs +583 -0
- package/dist/medterra-DgzE7-mj.js +583 -0
- package/dist/modells-CJjsxOIR.js +484 -0
- package/dist/modells-Ck5KbRFj.cjs +484 -0
- package/dist/models-BkXg5eIP.cjs +1534 -0
- package/dist/models-UZ6HszfZ.js +1281 -0
- package/dist/{nodeSelector-DybpVr-i.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
- package/dist/{nodeSelector-vKB44CDB.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
- package/dist/org-C2RrBVQR.cjs +81 -0
- package/dist/org-xMytX--e.js +38 -0
- package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
- package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
- package/dist/pressedFloral-Bteoboms.js +661 -0
- package/dist/pressedFloral-CexgV-xy.cjs +661 -0
- package/dist/search-BMOAmrmY.js +459 -0
- package/dist/search-Df0Ifneg.cjs +672 -0
- package/dist/{search-filter-types-9rTb3jMj.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
- package/dist/{search-filter-types-C-zZSpGo.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
- package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
- package/dist/skinPerfection-BlvcEcUE.js +334 -0
- package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
- package/dist/snapSupplements-kcsPAOm9.js +285 -0
- package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
- package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
- package/dist/spanx-B4WFA_rI.js +661 -0
- package/dist/spanx-BWoE4F8b.cjs +663 -0
- package/dist/spanxStaging-BOrOjhXn.js +845 -0
- package/dist/spanxStaging-BfdfIug4.cjs +848 -0
- package/dist/{suggestionBarV2-types-Penx3Y67.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
- package/dist/{suggestionBarV2-types-B3lwrENK.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
- package/dist/supergoop-22dd5_BS.js +323 -0
- package/dist/supergoop-B-a4cku2.cjs +323 -0
- package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
- package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
- package/dist/types/index.cjs +2 -2
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +2 -2
- package/dist/types--pr1GQQx.js +154 -0
- package/dist/types-BVSyY3Hk.cjs +196 -0
- package/dist/{uniqueVintage-BWkDgt1z.js → uniqueVintage-CJXiNNe7.js} +19 -20
- package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
- package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
- package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
- package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
- package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
- package/dist/utils-C9ZSCx12.js +888 -0
- package/dist/utils-D5HO61hG.cjs +1016 -0
- package/dist/variantInfo-DbVxA1yE.js +1 -0
- package/dist/variantInfo-orXoPBCU.cjs +0 -0
- package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
- package/dist/venaCbd-CanovPS_.js +365 -0
- package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
- package/dist/{westonJonBoucher-BAGXegsX.js → westonJonBoucher-BUu1_wP1.js} +19 -20
- package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
- package/dist/{wineEnthusiast-EJbhMeKQ.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
- package/dist/wolfMattress-D9Mjq-HP.js +372 -0
- package/dist/wolfMattress-JssghhC-.cjs +372 -0
- package/dist/wolfTactical-C6exYhL7.cjs +349 -0
- package/dist/wolfTactical-CnV3KQdI.js +349 -0
- package/package.json +100 -19
- package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
- package/src/application/models/colorsConfig.ts +18 -18
- package/src/application/models/frontendConfig.ts +3 -3
- package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
- package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
- package/src/application/models/index.ts +0 -2
- package/src/application/models/localStorageEventListener.ts +2 -2
- package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
- package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
- package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
- package/src/application/utils/analyticsUtils.ts +53 -22
- package/src/application/utils/cdnUtils.ts +11 -0
- package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
- package/src/atoms/app/index.ts +7 -17
- package/src/atoms/app/variant.ts +13 -4
- package/src/atoms/chat/chatState.ts +28 -18
- package/src/atoms/chat/messageQueue.ts +36 -5
- package/src/atoms/chat/replies.ts +45 -37
- package/src/atoms/envive/enviveConfig.ts +10 -6
- package/src/atoms/org/graphqlConfig.ts +7 -1
- package/src/atoms/org/index.ts +3 -3
- package/src/atoms/org/newOrgConfigAtom.ts +8 -0
- package/src/atoms/org/orgPageConfig.ts +6 -5
- package/src/atoms/search/chatSearch.ts +11 -5
- package/src/atoms/search/searchAPI.ts +22 -12
- package/src/atoms/search/searchServiceAdapter.ts +25 -0
- package/src/contexts/amplitudeContext.tsx +466 -0
- package/src/contexts/cdnContext.tsx +48 -0
- package/src/contexts/chatContext.tsx +15 -12
- package/src/contexts/enviveConfigContext.tsx +22 -17
- package/src/contexts/enviveCssContext.tsx +34 -5
- package/src/contexts/featureFlagContext.tsx +193 -0
- package/src/contexts/featureFlagServiceContext.tsx +87 -0
- package/src/contexts/graphqlContext.tsx +165 -0
- package/src/contexts/index.ts +13 -3
- package/src/contexts/localStorageContext.tsx +159 -0
- package/src/contexts/newOrgConfigContext.tsx +104 -0
- package/src/contexts/orgConfigContext.tsx +92 -92
- package/src/contexts/searchContext.tsx +187 -0
- package/src/contexts/sessionStorageContext.tsx +80 -0
- package/src/contexts/shopifyUrlContext.tsx +97 -0
- package/src/contexts/types.ts +12 -8
- package/src/contexts/userIdentityContext.tsx +197 -0
- package/src/events/registerAnalyticsListeners.ts +32 -38
- package/src/hooks/index.ts +10 -4
- package/src/hooks/useAmplitudeOperations.ts +35 -0
- package/src/hooks/useAppDetails.ts +49 -0
- package/src/hooks/useCdnOperations.ts +16 -0
- package/src/hooks/useChatToggle.ts +5 -4
- package/src/hooks/useChatToggleAnalytics.ts +15 -0
- package/src/hooks/useGraphQLConfig.ts +63 -0
- package/src/hooks/useIdentifyUser.ts +33 -0
- package/src/hooks/useImageResolver.ts +7 -7
- package/src/hooks/useLocalStorageOperations.ts +92 -0
- package/src/hooks/useNewOrgConfig.ts +3 -76
- package/src/hooks/useSearch.tsx +21 -18
- package/src/hooks/useSearchOperations.ts +97 -0
- package/src/hooks/useSessionStorageOperations.ts +28 -0
- package/src/hooks/useShopifyUrlOperations.ts +45 -0
- package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
- package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
- package/src/interceptors/index.ts +0 -1
- package/src/interceptors/useMessageInterceptor.ts +5 -8
- package/src/merchants/bandolier/bandolier.ts +10 -28
- package/src/merchants/carpe/carpe.ts +5 -8
- package/src/merchants/coterie/coterie.ts +3 -6
- package/src/merchants/default.ts +73 -70
- package/src/merchants/domInsertion.ts +30 -0
- package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
- package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
- package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
- package/src/merchants/greenpan/greenpan.ts +6 -12
- package/src/merchants/gridInsertion.ts +19 -0
- package/src/merchants/grooveLife/grooveLife.ts +13 -7
- package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
- package/src/merchants/jackArcher/jackArcher.ts +26 -11
- package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
- package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
- package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
- package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
- package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
- package/src/merchants/longevityrx/longevityrx.ts +14 -8
- package/src/merchants/lookOptic/lookOptic.ts +6 -6
- package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
- package/src/merchants/medterra/medterra.ts +14 -11
- package/src/merchants/modells/modells.ts +6 -9
- package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
- package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
- package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
- package/src/merchants/spanx/spanx.ts +6 -6
- package/src/merchants/spanx/spanxStaging.ts +6 -12
- package/src/merchants/supergoop/supergoop.ts +11 -12
- package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
- package/src/merchants/venaCbd/venaCbd.ts +6 -9
- package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
- package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
- package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
- package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
- package/src/types/config-versions.ts +6 -0
- package/src/types.ts +0 -53
- package/dist/adapters/amplitude/index.cjs +0 -14
- package/dist/adapters/amplitude/index.d.cts +0 -6
- package/dist/adapters/amplitude/index.d.ts +0 -6
- package/dist/adapters/amplitude/index.js +0 -12
- package/dist/api-B2euFL-5.cjs +0 -269
- package/dist/api-XRr_lAG6.js +0 -190
- package/dist/application/config/index.cjs +0 -43
- package/dist/application/config/index.d.cts +0 -15
- package/dist/application/config/index.d.ts +0 -15
- package/dist/application/config/index.js +0 -41
- package/dist/application/service/customerService/index.cjs +0 -4
- package/dist/application/service/customerService/index.d.cts +0 -3
- package/dist/application/service/customerService/index.d.ts +0 -3
- package/dist/application/service/customerService/index.js +0 -4
- package/dist/application/service/index.cjs +0 -42
- package/dist/application/service/index.d.cts +0 -413
- package/dist/application/service/index.d.ts +0 -413
- package/dist/application/service/index.js +0 -12
- package/dist/atomStore-ONYy0XuA.d.cts +0 -24
- package/dist/atomStore-kOKiEcNl.d.ts +0 -24
- package/dist/bandolier-Da4wt6sm.cjs +0 -1230
- package/dist/bandolier-DzEmYWcz.js +0 -1230
- package/dist/carpe-AXipz0Xl.cjs +0 -608
- package/dist/carpe-CaUKwcEa.js +0 -606
- package/dist/contexts-CtRlNXaS.js +0 -7674
- package/dist/contexts-CtgmnYNn.cjs +0 -9088
- package/dist/coterie-oKHAT0lx.js +0 -240
- package/dist/customerService-BG1uNZZ1.cjs +0 -36
- package/dist/customerService-BHQRnLhC.js +0 -23
- package/dist/default-B4fINY5_.cjs +0 -4
- package/dist/default-BrTQxA0c.js +0 -4
- package/dist/default-C3LrcbZB.cjs +0 -199
- package/dist/default-CXkYrLEr.js +0 -176
- package/dist/dreamlandBaby-BEqt0eKF.js +0 -347
- package/dist/dreamlandBaby-DBDjEJCc.cjs +0 -347
- package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
- package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
- package/dist/fiveCbd-CdqNt16h.cjs +0 -614
- package/dist/fiveCbd-D6B-sgnX.js +0 -614
- package/dist/forLoveAndLemons-C7GsJG7f.cjs +0 -668
- package/dist/forLoveAndLemons-gNDlMtPR.js +0 -666
- package/dist/greenpan-B5AaW4M_.js +0 -398
- package/dist/greenpan-DrORpYms.cjs +0 -398
- package/dist/grooveLife-BJqsfH2H.cjs +0 -343
- package/dist/grooveLife-xIUmDM8s.js +0 -343
- package/dist/homegrownCannabis-8TZ21u6L.cjs +0 -411
- package/dist/homegrownCannabis-BtMuEvbZ.js +0 -411
- package/dist/index-CKUpnyJQ.d.ts +0 -72
- package/dist/index-DFL1dIT_.d.ts +0 -7
- package/dist/index-DXpgMVpp.d.ts +0 -749
- package/dist/index-MFbPQ8Ji.d.ts +0 -95
- package/dist/index-VHFMGkO-.d.cts +0 -72
- package/dist/index-VSFakgAI.d.cts +0 -95
- package/dist/index-aNW5V9fh.d.cts +0 -749
- package/dist/index-zZjcds15.d.cts +0 -7
- package/dist/jackArcher-WtkbLBZj.cjs +0 -728
- package/dist/jordanCraig-471FcgqF.cjs +0 -1787
- package/dist/jordanCraig-DNOncplU.js +0 -1787
- package/dist/kindredBravely-BlLyHGMX.cjs +0 -491
- package/dist/kindredBravely-cqZ4OvXp.js +0 -491
- package/dist/kutFromTheKloth-3mOIryvt.cjs +0 -370
- package/dist/kutFromTheKloth-DtVNCMKa.js +0 -370
- package/dist/larryAndSerges-88Bvq-Us.cjs +0 -262
- package/dist/larryAndSerges-cvak6May.js +0 -262
- package/dist/leapsAndRebounds-Dmf8eUPq.js +0 -361
- package/dist/leapsAndRebounds-iWKc923H.cjs +0 -361
- package/dist/logger-Dln20ans.cjs +0 -26
- package/dist/logger-pdEEY8T2.js +0 -20
- package/dist/longevityrx-BTMI9vn-.js +0 -321
- package/dist/longevityrx-CobPyigd.cjs +0 -321
- package/dist/lookOptic-C4H_c0JZ.cjs +0 -283
- package/dist/mantraBrand-CySGqbn6.cjs +0 -751
- package/dist/medterra-BnZ5p27n.cjs +0 -584
- package/dist/medterra-DaICcPPp.js +0 -584
- package/dist/modells-CZ1L6dD_.js +0 -485
- package/dist/modells-DF0SndHr.cjs +0 -485
- package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
- package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
- package/dist/pressedFloral-B3t2cYzs.cjs +0 -662
- package/dist/pressedFloral-Dsws2Kfb.js +0 -662
- package/dist/skinPerfection-CILQM2bR.cjs +0 -335
- package/dist/skinPerfection-DmQCntRf.js +0 -335
- package/dist/snapSupplements--X_v0KRM.js +0 -286
- package/dist/snapSupplements-Djuzl0Ed.cjs +0 -286
- package/dist/spanx-Bo81yXSF.cjs +0 -664
- package/dist/spanx-DauxB8KE.js +0 -662
- package/dist/spanxStaging-BucYQvR1.cjs +0 -849
- package/dist/spanxStaging-CfXUukdP.js +0 -846
- package/dist/supergoop-8qa_NV3F.cjs +0 -338
- package/dist/supergoop-DOaui-A6.js +0 -336
- package/dist/types-CD4LFta-.d.cts +0 -33
- package/dist/types-CGC6Oozp.cjs +0 -231
- package/dist/types-CnTCkyvK.js +0 -177
- package/dist/types-DBdI0j89.d.ts +0 -33
- package/dist/uniqueVintage-DAne8XcL.cjs +0 -1214
- package/dist/variant-CC1nrywd.d.ts +0 -13
- package/dist/variant-CQTuQQSq.d.cts +0 -13
- package/dist/venaCbd-B1HO_Pkr.cjs +0 -366
- package/dist/venaCbd-CnByO-5R.js +0 -366
- package/dist/westonJonBoucher-BRfHWMbs.cjs +0 -423
- package/dist/wineEnthusiast-DW8JVwV8.cjs +0 -941
- package/dist/wolfMattress-B6INZNRJ.cjs +0 -373
- package/dist/wolfMattress-D9P7ErH_.js +0 -373
- package/dist/wolfTactical-C5Pupi3J.js +0 -350
- package/dist/wolfTactical-TMthZM93.cjs +0 -350
- package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
- package/src/adapters/amplitude/index.ts +0 -2
- package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
- package/src/adapters/spiffy/commerce/graphql.ts +0 -219
- package/src/application/config/generalStaticConfig.ts +0 -40
- package/src/application/config/index.ts +0 -1
- package/src/application/models/domMutationContinuation.ts +0 -7
- package/src/application/models/domObservationStrategy.ts +0 -9
- package/src/application/service/cachingService.ts +0 -84
- package/src/application/service/cdnService.ts +0 -20
- package/src/application/service/customerService/index.ts +0 -8
- package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
- package/src/application/service/domMutationObserver.ts +0 -320
- package/src/application/service/domMutations/GridInsertionService.ts +0 -123
- package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
- package/src/application/service/domMutations/domInsertionService.ts +0 -90
- package/src/application/service/domMutations/domMutationListener.ts +0 -15
- package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
- package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
- package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
- package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
- package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
- package/src/application/service/featureFlagService.ts +0 -130
- package/src/application/service/graphqlConfigService.ts +0 -59
- package/src/application/service/index.ts +0 -32
- package/src/application/service/kustomerIntegrationService.ts +0 -111
- package/src/application/service/localStorageService.ts +0 -77
- package/src/application/service/pageVariantService.ts +0 -866
- package/src/application/service/searchService.ts +0 -147
- package/src/application/service/sessionStorageService.ts +0 -27
- package/src/application/service/shopifyUrlService.ts +0 -63
- package/src/application/service/userIdentityService.ts +0 -114
- package/src/application/service/windowChatToggleService.ts +0 -80
- package/src/application/service/windowDataLayerService.ts +0 -181
- package/src/application/service/windowFrontendConfigService.ts +0 -129
- package/src/atoms/org/merchantCss.ts +0 -161
- package/src/atoms/org/org.ts +0 -251
- package/src/atoms/org/orgUIConfig.ts +0 -142
- package/src/enabled-features.ts +0 -83
- package/src/hooks/useDynamicVariants.ts +0 -226
- package/src/hooks/useFileUpload.ts +0 -63
- package/src/hooks/useHideElements.ts +0 -85
- package/src/interceptors/useFormEscalation.ts +0 -57
- /package/dist/{locators-DnKpajbY.js → atomStore-CZnUUsrr.js} +0 -0
- /package/dist/{locators-CugndTUM.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
- /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
- /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
- /package/dist/{variantInfo-CzhR5W6h.js → utilityTypes-8sETsYPk.js} +0 -0
- /package/dist/{variantInfo-CNRTY0gH.cjs → utilityTypes-COShxVir.cjs} +0 -0
- /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
|
@@ -1,866 +0,0 @@
|
|
|
1
|
-
import { v4 as uuid } from "uuid";
|
|
2
|
-
import { createVisitUserEvent } from "src/hooks/utils";
|
|
3
|
-
import CommerceApiClient from "src/adapters/spiffy/commerce/api";
|
|
4
|
-
import Logger from "src/application/logging/logger";
|
|
5
|
-
import { getAtomStore } from "src/atoms/atomStore/atomStore";
|
|
6
|
-
import { featureFlagServiceAtom } from "src/atoms/org/org";
|
|
7
|
-
import {
|
|
8
|
-
CategoryExtractor,
|
|
9
|
-
CategoryExtractorType,
|
|
10
|
-
IdExtractor,
|
|
11
|
-
OrgPageConfig,
|
|
12
|
-
PageVariantConfig,
|
|
13
|
-
PageVariantTest,
|
|
14
|
-
PageVariantTestType,
|
|
15
|
-
} from "src/contexts/types";
|
|
16
|
-
import { ShopifyUrlService } from "src/application/service/shopifyUrlService";
|
|
17
|
-
import {
|
|
18
|
-
Message,
|
|
19
|
-
MessageRole,
|
|
20
|
-
MessageType,
|
|
21
|
-
VariantInfo,
|
|
22
|
-
} from "src/application/models";
|
|
23
|
-
import { FeatureGates } from "src/application/models/featureGates";
|
|
24
|
-
import { appDetailsAtom } from "src/atoms/app";
|
|
25
|
-
|
|
26
|
-
import {
|
|
27
|
-
PageVisitCategory,
|
|
28
|
-
type SupportedEventProductCategory,
|
|
29
|
-
} from "@spiffy-ai/commerce-api-client";
|
|
30
|
-
import {
|
|
31
|
-
SupportedEvent,
|
|
32
|
-
urlResolverAtom,
|
|
33
|
-
UrlResolverResponse,
|
|
34
|
-
UrlResolvingPDPConfig,
|
|
35
|
-
UrlResolvingPLPConfig,
|
|
36
|
-
} from "src/atoms/app/variant";
|
|
37
|
-
import { chatAtom, lastAssistantMessageAtom } from "src/atoms/chat";
|
|
38
|
-
import { StringUtils } from "../utils/stringUtils";
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* This class is used to resolve the PageVariants for the Spiffy App.
|
|
42
|
-
* It includes a number of static utility functions for performing pageTests and
|
|
43
|
-
* extracting data necessary to build the PageVariants.
|
|
44
|
-
*
|
|
45
|
-
* Under most circumstances only `getVariantInfoWithPageConfig` will be called externally
|
|
46
|
-
* The other functions should be used internally by that function.
|
|
47
|
-
*/
|
|
48
|
-
class PageVariantService {
|
|
49
|
-
public static readonly pageTest = async (
|
|
50
|
-
test: PageVariantTest,
|
|
51
|
-
pageVariantConfig: PageVariantConfig,
|
|
52
|
-
atomValues?: {
|
|
53
|
-
responseStreaming: boolean;
|
|
54
|
-
messages: Message[][];
|
|
55
|
-
lastAssistantMessage?: Message[] | null | undefined;
|
|
56
|
-
}
|
|
57
|
-
): Promise<boolean> => {
|
|
58
|
-
switch (test.testType) {
|
|
59
|
-
case PageVariantTestType.UrlResolver: {
|
|
60
|
-
const url = window._spiffy.variantUrlOverride ?? window.location.href;
|
|
61
|
-
const response = await PageVariantService.getCachedUrlResolver(url);
|
|
62
|
-
return (
|
|
63
|
-
response.ready &&
|
|
64
|
-
response.variant_type === pageVariantConfig.variantType
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
case PageVariantTestType.ShopifyPDP:
|
|
68
|
-
return ShopifyUrlService.isOnPdpPage();
|
|
69
|
-
case PageVariantTestType.ShopifyPLP:
|
|
70
|
-
return ShopifyUrlService.isOnPlpPage();
|
|
71
|
-
case PageVariantTestType.PageCategory:
|
|
72
|
-
return !!PageVariantService.getCategory(test.extractor);
|
|
73
|
-
case PageVariantTestType.FeatureGate:
|
|
74
|
-
return PageVariantService.checkFeatureGate(test.featureGate);
|
|
75
|
-
case PageVariantTestType.PlpId:
|
|
76
|
-
return PageVariantService.checkPlpIds({
|
|
77
|
-
plpIds: test.plpIds,
|
|
78
|
-
plpIdExtractor: test.plpIdExtractor,
|
|
79
|
-
});
|
|
80
|
-
case PageVariantTestType.QueryParam:
|
|
81
|
-
return PageVariantService.checkQueryParam({
|
|
82
|
-
queryParam: test.queryParam,
|
|
83
|
-
});
|
|
84
|
-
case PageVariantTestType.ProductId:
|
|
85
|
-
return PageVariantService.checkProductId({
|
|
86
|
-
productIds: test.productIds,
|
|
87
|
-
productIdExtractor: test.productIdExtractor,
|
|
88
|
-
});
|
|
89
|
-
case PageVariantTestType.Fallback:
|
|
90
|
-
// The 'fallback' testType will always evaluate to true
|
|
91
|
-
return true;
|
|
92
|
-
case PageVariantTestType.CatalogCategory:
|
|
93
|
-
return PageVariantService.checkCatalogCategory(
|
|
94
|
-
test.category,
|
|
95
|
-
pageVariantConfig
|
|
96
|
-
);
|
|
97
|
-
case PageVariantTestType.TopCatalogCategory:
|
|
98
|
-
return PageVariantService.checkInTopCategory(
|
|
99
|
-
test.topCategory,
|
|
100
|
-
pageVariantConfig
|
|
101
|
-
);
|
|
102
|
-
case PageVariantTestType.HasReviews:
|
|
103
|
-
return PageVariantService.checkHasReviews(
|
|
104
|
-
pageVariantConfig,
|
|
105
|
-
test.reviewMinimum
|
|
106
|
-
);
|
|
107
|
-
case PageVariantTestType.InCollection:
|
|
108
|
-
return PageVariantService.checkInCollection(
|
|
109
|
-
test.collections,
|
|
110
|
-
pageVariantConfig
|
|
111
|
-
);
|
|
112
|
-
case PageVariantTestType.HasMerchantTag:
|
|
113
|
-
return PageVariantService.checkHasMerchantTag(
|
|
114
|
-
test.merchantTags,
|
|
115
|
-
pageVariantConfig
|
|
116
|
-
);
|
|
117
|
-
case PageVariantTestType.UserHasInteracted:
|
|
118
|
-
return PageVariantService.userHasInteracted(atomValues?.messages);
|
|
119
|
-
case PageVariantTestType.UserHasNotInteracted:
|
|
120
|
-
return PageVariantService.userHasNotInteracted(atomValues?.messages);
|
|
121
|
-
case PageVariantTestType.isLoading:
|
|
122
|
-
return PageVariantService.isLoading(
|
|
123
|
-
atomValues?.messages,
|
|
124
|
-
atomValues?.responseStreaming
|
|
125
|
-
);
|
|
126
|
-
case PageVariantTestType.isProductComparison:
|
|
127
|
-
return PageVariantService.isProductComparison(
|
|
128
|
-
atomValues?.lastAssistantMessage
|
|
129
|
-
);
|
|
130
|
-
default:
|
|
131
|
-
// If there is a testType that we do not cover - default to false
|
|
132
|
-
Logger.logInfo(`[Spiffy] pageTest - ${test} not supported`);
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
private static readonly getCachedUrlResolver = async (url: string) => {
|
|
138
|
-
// Check atom cache first (like OrgConfig does)
|
|
139
|
-
const atomStore = getAtomStore();
|
|
140
|
-
const cache = atomStore.get(urlResolverAtom);
|
|
141
|
-
const cachedUrlResolver = cache?.[url];
|
|
142
|
-
|
|
143
|
-
if (cachedUrlResolver) {
|
|
144
|
-
return cachedUrlResolver;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const response = (await CommerceApiClient.resolveUrl(
|
|
148
|
-
url
|
|
149
|
-
)) as UrlResolverResponse;
|
|
150
|
-
|
|
151
|
-
// Store in atom cache for this URL (will be persisted to sessionStorage automatically)
|
|
152
|
-
atomStore.set(urlResolverAtom, { url, response });
|
|
153
|
-
|
|
154
|
-
return response;
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Checks if the current page matches the expected catalog category.
|
|
159
|
-
*
|
|
160
|
-
* @param category - The expected catalog category as defined by data in Elastic Search.
|
|
161
|
-
* @param pageVariantConfig - The variant config for the current page.
|
|
162
|
-
*
|
|
163
|
-
* @returns True if the current page matches the expected catalog category.
|
|
164
|
-
*/
|
|
165
|
-
private static readonly checkCatalogCategory = async (
|
|
166
|
-
category: SupportedEventProductCategory | string,
|
|
167
|
-
pageVariantConfig: PageVariantConfig
|
|
168
|
-
): Promise<boolean> => {
|
|
169
|
-
const supportedEventResponse = await PageVariantService.checkSupportedEvent(
|
|
170
|
-
pageVariantConfig
|
|
171
|
-
);
|
|
172
|
-
if (supportedEventResponse && supportedEventResponse.category) {
|
|
173
|
-
return supportedEventResponse?.category === category;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return false;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
private static readonly checkInTopCategory = async (
|
|
180
|
-
topCategory: string[],
|
|
181
|
-
pageVariantConfig: PageVariantConfig
|
|
182
|
-
): Promise<boolean> => {
|
|
183
|
-
const supportedEventResponse = await PageVariantService.checkSupportedEvent(
|
|
184
|
-
pageVariantConfig
|
|
185
|
-
);
|
|
186
|
-
if (supportedEventResponse && supportedEventResponse?.top_category) {
|
|
187
|
-
return topCategory.includes(supportedEventResponse?.top_category);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return false;
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
private static readonly checkHasReviews = async (
|
|
194
|
-
pageVariantConfig: PageVariantConfig,
|
|
195
|
-
reviewMinimum: number = 0
|
|
196
|
-
): Promise<boolean> => {
|
|
197
|
-
const supportedEventResponse = await PageVariantService.checkSupportedEvent(
|
|
198
|
-
pageVariantConfig
|
|
199
|
-
);
|
|
200
|
-
if (supportedEventResponse?.numberOfReviews) {
|
|
201
|
-
return supportedEventResponse.numberOfReviews >= reviewMinimum;
|
|
202
|
-
}
|
|
203
|
-
return false;
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
private static readonly checkInCollection = async (
|
|
207
|
-
collections: string[],
|
|
208
|
-
pageVariantConfig: PageVariantConfig
|
|
209
|
-
): Promise<boolean> => {
|
|
210
|
-
const supportedEventResponse = await PageVariantService.checkSupportedEvent(
|
|
211
|
-
pageVariantConfig
|
|
212
|
-
);
|
|
213
|
-
if (supportedEventResponse?.collections) {
|
|
214
|
-
return supportedEventResponse.collections.some((collection) =>
|
|
215
|
-
collections.includes(collection)
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
return false;
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
private static readonly checkHasMerchantTag = async (
|
|
222
|
-
merchantTags: string[],
|
|
223
|
-
pageVariantConfig: PageVariantConfig
|
|
224
|
-
): Promise<boolean> => {
|
|
225
|
-
const supportedEventResponse = await PageVariantService.checkSupportedEvent(
|
|
226
|
-
pageVariantConfig
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
if (supportedEventResponse?.merchant_tags) {
|
|
230
|
-
return supportedEventResponse.merchant_tags.some((tag) =>
|
|
231
|
-
merchantTags.includes(tag)
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
return false;
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
private static readonly userHasInteracted = (msgs?: Message[][]): boolean => {
|
|
239
|
-
if (msgs) {
|
|
240
|
-
return msgs.some((m) => m.some((msg) => msg.role === MessageRole.User));
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const atomStore = getAtomStore();
|
|
244
|
-
const { messages } = atomStore.get(chatAtom);
|
|
245
|
-
return messages.some((m) => m.some((msg) => msg.role === MessageRole.User));
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
private static readonly userHasNotInteracted = (
|
|
249
|
-
msgs?: Message[][]
|
|
250
|
-
): boolean => {
|
|
251
|
-
if (msgs) {
|
|
252
|
-
return !msgs.some((m) => m.some((msg) => msg.role === MessageRole.User));
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const atomStore = getAtomStore();
|
|
256
|
-
const chat = atomStore.get(chatAtom);
|
|
257
|
-
return !chat.messages.some((m) =>
|
|
258
|
-
m.some((msg) => msg.role === MessageRole.User)
|
|
259
|
-
);
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
private static readonly isLoading = (
|
|
263
|
-
msgs?: Message[][],
|
|
264
|
-
responseStream?: boolean
|
|
265
|
-
): boolean => {
|
|
266
|
-
if (msgs) {
|
|
267
|
-
return responseStream || (!responseStream && msgs.length === 0);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const atomStore = getAtomStore();
|
|
271
|
-
const { responseStreaming, messages } = atomStore.get(chatAtom);
|
|
272
|
-
return responseStreaming || (!responseStreaming && messages.length === 0);
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
private static readonly isProductComparison = (
|
|
276
|
-
lastMsg: Message[] | null | undefined
|
|
277
|
-
): boolean => {
|
|
278
|
-
if (lastMsg) {
|
|
279
|
-
return (
|
|
280
|
-
lastMsg?.filter((msg) => msg.type === MessageType.Product).length === 2
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const atomStore = getAtomStore();
|
|
285
|
-
const lastAssistantMessage = atomStore.get(lastAssistantMessageAtom);
|
|
286
|
-
return (
|
|
287
|
-
lastAssistantMessage?.filter((msg) => msg.type === MessageType.Product)
|
|
288
|
-
.length === 2
|
|
289
|
-
);
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
private static readonly checkPlpIds = async ({
|
|
293
|
-
plpIds,
|
|
294
|
-
plpIdExtractor,
|
|
295
|
-
}: {
|
|
296
|
-
plpIds: string[];
|
|
297
|
-
plpIdExtractor: IdExtractor;
|
|
298
|
-
}): Promise<boolean> => {
|
|
299
|
-
let currentPlpId: string | null;
|
|
300
|
-
if (plpIdExtractor === "url-resolver-plp-id") {
|
|
301
|
-
currentPlpId = await PageVariantService.getIdFromUrlResolver("plpId");
|
|
302
|
-
} else {
|
|
303
|
-
currentPlpId = await PageVariantService.getId(plpIdExtractor);
|
|
304
|
-
}
|
|
305
|
-
const result = plpIds.includes(currentPlpId ?? "");
|
|
306
|
-
return result;
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
private static readonly checkQueryParam = async ({
|
|
310
|
-
queryParam,
|
|
311
|
-
}: {
|
|
312
|
-
queryParam: string;
|
|
313
|
-
}): Promise<boolean> => {
|
|
314
|
-
const params = new URLSearchParams(window.location.search);
|
|
315
|
-
return params.has(queryParam);
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
private static readonly checkProductId = async ({
|
|
319
|
-
productIds,
|
|
320
|
-
productIdExtractor,
|
|
321
|
-
}: {
|
|
322
|
-
productIds: string[];
|
|
323
|
-
productIdExtractor: IdExtractor;
|
|
324
|
-
}): Promise<boolean> => {
|
|
325
|
-
let currentProductId: string | null;
|
|
326
|
-
if (productIdExtractor === "url-resolver-product-id") {
|
|
327
|
-
currentProductId = await PageVariantService.getIdFromUrlResolver(
|
|
328
|
-
"productId"
|
|
329
|
-
);
|
|
330
|
-
} else {
|
|
331
|
-
currentProductId = await PageVariantService.getId(productIdExtractor);
|
|
332
|
-
}
|
|
333
|
-
const result = productIds.includes(currentProductId ?? "");
|
|
334
|
-
return result;
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
static checkFeatureGate(featureGate: FeatureGates): boolean {
|
|
338
|
-
const atomStore = getAtomStore();
|
|
339
|
-
const featureFlagService = atomStore.get(featureFlagServiceAtom);
|
|
340
|
-
|
|
341
|
-
return featureFlagService?.isFeatureGateEnabled(featureGate) || false;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
static getCategory(extractor: CategoryExtractor): PageVisitCategory | null {
|
|
345
|
-
if (extractor.type === CategoryExtractorType.VisitCategoryDefault) {
|
|
346
|
-
return extractor.value;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (extractor.type === CategoryExtractorType.VisitCategoryMap) {
|
|
350
|
-
const urlMap = Object.entries(extractor.map);
|
|
351
|
-
|
|
352
|
-
const matched = urlMap.find(([, urls]) => {
|
|
353
|
-
const hostMatched = StringUtils.findMatchingPattern(
|
|
354
|
-
urls,
|
|
355
|
-
window.location
|
|
356
|
-
);
|
|
357
|
-
if (hostMatched) {
|
|
358
|
-
return hostMatched;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return urls.find((url) => window.location.pathname.includes(url));
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
if (matched) {
|
|
365
|
-
return matched[0] as PageVisitCategory;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
return null;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
Logger.logError(
|
|
372
|
-
`[spiffy-ai] PageVariantService.getCategory error - extractor=${extractor} not supported`,
|
|
373
|
-
undefined
|
|
374
|
-
);
|
|
375
|
-
return null;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
static async getId(extractor?: IdExtractor): Promise<string | null> {
|
|
379
|
-
if (!extractor || extractor === "null") {
|
|
380
|
-
Logger.logDebug(
|
|
381
|
-
`[spiffy-ai] PageVariantService.getId - extractor=${extractor} is null or not supported`
|
|
382
|
-
);
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Handle URL resolver extractors
|
|
387
|
-
if (extractor === "url-resolver-product-id") {
|
|
388
|
-
return PageVariantService.getIdFromUrlResolver("productId");
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
if (extractor === "url-resolver-plp-id") {
|
|
392
|
-
return PageVariantService.getIdFromUrlResolver("plpId");
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
// Handle regular extractors
|
|
396
|
-
return ShopifyUrlService.getPlpOrPdpId(extractor);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
private static readonly getIdFromUrlResolver = async (
|
|
400
|
-
field: "productId" | "plpId"
|
|
401
|
-
) => {
|
|
402
|
-
const url = window._spiffy.variantUrlOverride ?? window.location.href;
|
|
403
|
-
const response = await this.getCachedUrlResolver(url);
|
|
404
|
-
// PDP
|
|
405
|
-
if (field === "productId" && response.variant_type === "pdp") {
|
|
406
|
-
let productId: string | undefined;
|
|
407
|
-
if (
|
|
408
|
-
response.user_event?.attributes &&
|
|
409
|
-
"product_id" in response.user_event.attributes
|
|
410
|
-
) {
|
|
411
|
-
productId = response.user_event.attributes.product_id;
|
|
412
|
-
}
|
|
413
|
-
return productId ?? null;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
// PLP
|
|
417
|
-
if (field === "plpId" && response.variant_type === "plp") {
|
|
418
|
-
let plpId: string | undefined;
|
|
419
|
-
if (
|
|
420
|
-
response.user_event?.category === "plp_visit" &&
|
|
421
|
-
response.user_event.attributes &&
|
|
422
|
-
"attributes" in response.user_event.attributes &&
|
|
423
|
-
response.user_event.attributes.attributes &&
|
|
424
|
-
"id" in response.user_event.attributes.attributes
|
|
425
|
-
) {
|
|
426
|
-
plpId = response.user_event.attributes.attributes.id;
|
|
427
|
-
}
|
|
428
|
-
return plpId ?? null;
|
|
429
|
-
}
|
|
430
|
-
return null;
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
// /**
|
|
434
|
-
// * Transforms backend page_variant to frontend PageVariantConfig: check -> test
|
|
435
|
-
// *
|
|
436
|
-
// * @param backendPageVariant - Backend page variant with variant_checks
|
|
437
|
-
// * @returns Frontend PageVariantConfig with variantTests
|
|
438
|
-
// */
|
|
439
|
-
// private static readonly transformBackendPageVariantToFrontend = (
|
|
440
|
-
// backendPageVariant: BackendPageVariantConfig,
|
|
441
|
-
// ): PageVariantConfig => {
|
|
442
|
-
// const convertChecktoTest = (checks: PageVariantCheckConfig[]): PageVariantTest[] => checks.map((check: PageVariantCheckConfig): PageVariantTest => {
|
|
443
|
-
// switch (check.check_type) {
|
|
444
|
-
// case 'ShopifyPDP':
|
|
445
|
-
// return {
|
|
446
|
-
// testType: PageVariantTestType.ShopifyPDP,
|
|
447
|
-
// };
|
|
448
|
-
// case 'ShopifyPLP':
|
|
449
|
-
// return {
|
|
450
|
-
// testType: PageVariantTestType.ShopifyPLP,
|
|
451
|
-
// };
|
|
452
|
-
// case 'FeatureGate':
|
|
453
|
-
// return {
|
|
454
|
-
// testType: PageVariantTestType.FeatureGate,
|
|
455
|
-
// featureGate: check.feature_gate as FeatureGates,
|
|
456
|
-
// };
|
|
457
|
-
// case 'ProductId':
|
|
458
|
-
// return {
|
|
459
|
-
// testType: PageVariantTestType.ProductId,
|
|
460
|
-
// productIdExtractor: check.product_id_extractor as IdExtractor,
|
|
461
|
-
// productIds: check.product_ids as string[],
|
|
462
|
-
// };
|
|
463
|
-
// case 'PlpId':
|
|
464
|
-
// return {
|
|
465
|
-
// testType: PageVariantTestType.PlpId,
|
|
466
|
-
// plpIdExtractor: check.plp_id_extractor as IdExtractor,
|
|
467
|
-
// plpIds: check.plp_ids as string[],
|
|
468
|
-
// };
|
|
469
|
-
// case 'InCollection':
|
|
470
|
-
// return {
|
|
471
|
-
// testType: PageVariantTestType.InCollection,
|
|
472
|
-
// collections: check.collections as string[],
|
|
473
|
-
// };
|
|
474
|
-
// case 'QueryParam':
|
|
475
|
-
// return {
|
|
476
|
-
// testType: PageVariantTestType.QueryParam,
|
|
477
|
-
// queryParam: check.query_param as string,
|
|
478
|
-
// };
|
|
479
|
-
// case 'PageCategory':
|
|
480
|
-
// return {
|
|
481
|
-
// testType: PageVariantTestType.PageCategory,
|
|
482
|
-
// extractor: check.extractor as CategoryExtractor,
|
|
483
|
-
// };
|
|
484
|
-
// case 'CatalogCategory':
|
|
485
|
-
// return {
|
|
486
|
-
// testType: PageVariantTestType.CatalogCategory,
|
|
487
|
-
// category: check.category as SupportedEventProductCategory,
|
|
488
|
-
// };
|
|
489
|
-
// case 'TopCatalogCategory':
|
|
490
|
-
// return {
|
|
491
|
-
// testType: PageVariantTestType.TopCatalogCategory,
|
|
492
|
-
// topCategory: check.top_category as SupportedEventProductCategory[],
|
|
493
|
-
// };
|
|
494
|
-
// case 'HasReviews':
|
|
495
|
-
// return {
|
|
496
|
-
// testType: PageVariantTestType.HasReviews,
|
|
497
|
-
// reviewMinimum: check?.review_minimum,
|
|
498
|
-
// };
|
|
499
|
-
// case 'UrlResolver':
|
|
500
|
-
// return {
|
|
501
|
-
// testType: PageVariantTestType.UrlResolver,
|
|
502
|
-
// };
|
|
503
|
-
// case 'Fallback':
|
|
504
|
-
// return {
|
|
505
|
-
// testType: PageVariantTestType.Fallback,
|
|
506
|
-
// };
|
|
507
|
-
// case 'HasMerchantTag':
|
|
508
|
-
// return {
|
|
509
|
-
// testType: PageVariantTestType.HasMerchantTag,
|
|
510
|
-
// merchantTags: check.merchant_tags as string[],
|
|
511
|
-
// };
|
|
512
|
-
// default:
|
|
513
|
-
// throw new Error(`Unsupported check_type: ${check.check_type}`);
|
|
514
|
-
// }
|
|
515
|
-
// });
|
|
516
|
-
// const variantTests: PageVariantTest[] = convertChecktoTest(
|
|
517
|
-
// backendPageVariant.variant_checks || [],
|
|
518
|
-
// );
|
|
519
|
-
|
|
520
|
-
// const widgetMounting: WidgetMounting[] = backendPageVariant.widget_mounting.map(
|
|
521
|
-
// (widgetMountingConfig: BackendWidgetMountingConfig) => {
|
|
522
|
-
// if (widgetMountingConfig.mounting_point_widgets?.length) {
|
|
523
|
-
// return {
|
|
524
|
-
// mountingConfigId: widgetMountingConfig.mounting_config_id,
|
|
525
|
-
// mountingPointWidgets: widgetMountingConfig.mounting_point_widgets.map(
|
|
526
|
-
// (mountingPointWidget) => ({
|
|
527
|
-
// tests: convertChecktoTest(mountingPointWidget.checks),
|
|
528
|
-
// widgetConfigId: mountingPointWidget.widget_config_id,
|
|
529
|
-
// }),
|
|
530
|
-
// ),
|
|
531
|
-
// } as DynamicWidgetMounting;
|
|
532
|
-
// }
|
|
533
|
-
// return {
|
|
534
|
-
// mountingConfigId: widgetMountingConfig.mounting_config_id,
|
|
535
|
-
// widgetConfigId: widgetMountingConfig.widget_config_id,
|
|
536
|
-
// } as StaticWidgetMounting;
|
|
537
|
-
// },
|
|
538
|
-
// );
|
|
539
|
-
|
|
540
|
-
// return {
|
|
541
|
-
// variantId: backendPageVariant.variant_id,
|
|
542
|
-
// variantType: backendPageVariant.variant_type,
|
|
543
|
-
// variantTests,
|
|
544
|
-
// widgetMounting,
|
|
545
|
-
// ...(backendPageVariant.variant_type === 'pdp' && {
|
|
546
|
-
// productIdExtractor: backendPageVariant.product_id_extractor as IdExtractor,
|
|
547
|
-
// ...(backendPageVariant.parent_product_id_extractor && {
|
|
548
|
-
// parentProductIdExtractor: backendPageVariant.parent_product_id_extractor as IdExtractor,
|
|
549
|
-
// }),
|
|
550
|
-
// }),
|
|
551
|
-
// ...(backendPageVariant.variant_type === 'plp' && {
|
|
552
|
-
// plpIdExtractor: backendPageVariant.plp_id_extractor as IdExtractor,
|
|
553
|
-
// }),
|
|
554
|
-
// } as PageVariantConfig;
|
|
555
|
-
// };
|
|
556
|
-
|
|
557
|
-
/**
|
|
558
|
-
* Gets the variant info for the current page based on the merchant's page config.
|
|
559
|
-
*
|
|
560
|
-
* @param orgPageConfig - The merchant's page config.
|
|
561
|
-
*
|
|
562
|
-
* @returns The variant info for the current page, or undefined if the page tests do not
|
|
563
|
-
* return any matches.
|
|
564
|
-
*/
|
|
565
|
-
static readonly getVariantInfoWithPageConfig = async (
|
|
566
|
-
orgPageConfig: OrgPageConfig
|
|
567
|
-
): Promise<[VariantInfo, PageVariantConfig] | undefined> => {
|
|
568
|
-
// First check if there is a variant override set
|
|
569
|
-
if (window?._spiffy?.variantInfoOverride) {
|
|
570
|
-
Logger.logDebug(
|
|
571
|
-
"[spiffy-ai] Found variantInfoOverride",
|
|
572
|
-
window._spiffy.variantInfoOverride
|
|
573
|
-
);
|
|
574
|
-
const matchingPageVariantConfig = orgPageConfig.pageVariants.find(
|
|
575
|
-
(pageVariant) =>
|
|
576
|
-
pageVariant.variantId ===
|
|
577
|
-
window._spiffy.variantInfoOverride?.variantId
|
|
578
|
-
);
|
|
579
|
-
if (matchingPageVariantConfig) {
|
|
580
|
-
Logger.logInfo(
|
|
581
|
-
"[spiffy-ai] Returning overriden variantInfo",
|
|
582
|
-
window._spiffy.variantInfoOverride
|
|
583
|
-
);
|
|
584
|
-
return [window._spiffy.variantInfoOverride, matchingPageVariantConfig];
|
|
585
|
-
}
|
|
586
|
-
Logger.logWarn(
|
|
587
|
-
"[spiffy-ai] Found variantInfoOverride but no matching pageVariantConfig",
|
|
588
|
-
window._spiffy.variantInfoOverride
|
|
589
|
-
);
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// Disable the page_variant coming from the backend as it is returning null for merchants today
|
|
593
|
-
// const atomStore = getAtomStore();
|
|
594
|
-
|
|
595
|
-
// const isGraphQLPageConfigsEnabled = PageVariantService.checkFeatureGate(
|
|
596
|
-
// FeatureGates.IsGraphQLPageConfigsEnabled,
|
|
597
|
-
// );
|
|
598
|
-
|
|
599
|
-
// if (isGraphQLPageConfigsEnabled) {
|
|
600
|
-
// // If GraphQL page configs are enabled, use the URL resolver to get the page variant
|
|
601
|
-
// const url =
|
|
602
|
-
// window._spiffy.variantUrlOverride ?? `${window.location.origin}${window.location.pathname}`;
|
|
603
|
-
// const response = await PageVariantService.getCachedUrlResolver(url);
|
|
604
|
-
|
|
605
|
-
// if (response?.page_variant) {
|
|
606
|
-
// // Transform backend page_variant to frontend PageVariantConfig
|
|
607
|
-
// const frontendPageVariant = PageVariantService.transformBackendPageVariantToFrontend(
|
|
608
|
-
// response.page_variant,
|
|
609
|
-
// );
|
|
610
|
-
|
|
611
|
-
// atomStore.set(orgPageConfigAtom, [frontendPageVariant]);
|
|
612
|
-
|
|
613
|
-
// const variantInfo = await PageVariantService.parsePageVariantConfig(
|
|
614
|
-
// frontendPageVariant,
|
|
615
|
-
// url,
|
|
616
|
-
// );
|
|
617
|
-
// if (variantInfo) {
|
|
618
|
-
// return [variantInfo, frontendPageVariant];
|
|
619
|
-
// }
|
|
620
|
-
// }
|
|
621
|
-
|
|
622
|
-
// Logger.logWarn('[spiffy-ai] no page variant fetched', undefined);
|
|
623
|
-
// await tellExtensionAboutInjectionError(new Error('No pagevariantConfig matched'));
|
|
624
|
-
|
|
625
|
-
// return undefined;
|
|
626
|
-
// }
|
|
627
|
-
|
|
628
|
-
// If GraphQL page configs are not enabled, use the local page config
|
|
629
|
-
|
|
630
|
-
// return the first variant that passes all of its tests
|
|
631
|
-
for await (const pageVariant of [...orgPageConfig.pageVariants]) {
|
|
632
|
-
const testResults = await Promise.all(
|
|
633
|
-
pageVariant.variantTests.map((test) =>
|
|
634
|
-
PageVariantService.pageTest(test, pageVariant)
|
|
635
|
-
)
|
|
636
|
-
);
|
|
637
|
-
|
|
638
|
-
if (testResults.every((result) => result)) {
|
|
639
|
-
// this URL eventually gets used to look up whether a product/page is supported
|
|
640
|
-
// the backend does not strip out query params which can return different results
|
|
641
|
-
// for the same page. Strip out the query params here to ensure consistent results.
|
|
642
|
-
const url = `${window.location.origin}${window.location.pathname}`;
|
|
643
|
-
const variantInfo = await this.parsePageVariantConfig(pageVariant, url);
|
|
644
|
-
|
|
645
|
-
if (variantInfo) {
|
|
646
|
-
return [variantInfo, pageVariant];
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
Logger.logWarn(
|
|
652
|
-
"[spiffy-ai] no pageVariantConfig matched",
|
|
653
|
-
undefined,
|
|
654
|
-
orgPageConfig.pageVariants
|
|
655
|
-
);
|
|
656
|
-
// TODO: remove or enable if we decide to support injection in this repo.
|
|
657
|
-
// await tellExtensionAboutInjectionError(
|
|
658
|
-
// new Error("No pagevariantConfig matched")
|
|
659
|
-
// );
|
|
660
|
-
|
|
661
|
-
return undefined;
|
|
662
|
-
};
|
|
663
|
-
|
|
664
|
-
/**
|
|
665
|
-
* Checks if the current page is supported. A page is supported if it has been indexed in
|
|
666
|
-
* Elastic Search and its category has been whitelisted by the backend.
|
|
667
|
-
*
|
|
668
|
-
* @param pageVariantConfig - The variant config for the current page which is used to get
|
|
669
|
-
* the variant info.
|
|
670
|
-
*
|
|
671
|
-
* @returns The supported event response from the backend, or undefined if the page is not supported.
|
|
672
|
-
*/
|
|
673
|
-
static readonly checkSupportedEvent = async (
|
|
674
|
-
pageVariantConfig: PageVariantConfig
|
|
675
|
-
): Promise<SupportedEvent | undefined> => {
|
|
676
|
-
try {
|
|
677
|
-
const variantInfo = await this.parsePageVariantConfig(
|
|
678
|
-
pageVariantConfig,
|
|
679
|
-
window.location.href
|
|
680
|
-
);
|
|
681
|
-
|
|
682
|
-
const usesURLResolver = pageVariantConfig.variantTests.some(
|
|
683
|
-
(test) => test.testType === PageVariantTestType.UrlResolver
|
|
684
|
-
);
|
|
685
|
-
|
|
686
|
-
if (
|
|
687
|
-
!variantInfo ||
|
|
688
|
-
(variantInfo.variant === "plp" && !variantInfo.plpId) ||
|
|
689
|
-
(variantInfo.variant === "pdp" && !variantInfo.productId) ||
|
|
690
|
-
(variantInfo.variant === "page_visit" && !variantInfo.url)
|
|
691
|
-
) {
|
|
692
|
-
return undefined;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
const atomStore = getAtomStore();
|
|
696
|
-
const appDetails = atomStore.get(appDetailsAtom);
|
|
697
|
-
|
|
698
|
-
const visitEvent = createVisitUserEvent({ variantInfo });
|
|
699
|
-
|
|
700
|
-
if (!visitEvent) {
|
|
701
|
-
Logger.logWarn("spiffy-ai] no visitEvent found", variantInfo);
|
|
702
|
-
return undefined;
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
if (!usesURLResolver) {
|
|
706
|
-
return await CommerceApiClient.isSupportedEvent({
|
|
707
|
-
id: uuid(),
|
|
708
|
-
context: appDetails,
|
|
709
|
-
userEvent: visitEvent,
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
// If it got here, it means that the page is supported by the URL resolver.
|
|
714
|
-
// We still need to populate a supported event object to make the widgets show up.
|
|
715
|
-
const url = window._spiffy.variantUrlOverride ?? window.location.href;
|
|
716
|
-
const response = await this.getCachedUrlResolver(url);
|
|
717
|
-
|
|
718
|
-
const basicResponse = {
|
|
719
|
-
supported: true,
|
|
720
|
-
ready: response.ready,
|
|
721
|
-
numberOfReviews: 0,
|
|
722
|
-
} as SupportedEvent;
|
|
723
|
-
|
|
724
|
-
if (variantInfo.variant === "plp") {
|
|
725
|
-
const { top_category } =
|
|
726
|
-
response.specific_details as UrlResolvingPLPConfig;
|
|
727
|
-
return {
|
|
728
|
-
...basicResponse,
|
|
729
|
-
top_category,
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
if (variantInfo.variant === "pdp") {
|
|
734
|
-
const { collections, number_of_reviews, merchant_tags } =
|
|
735
|
-
response.specific_details as UrlResolvingPDPConfig;
|
|
736
|
-
return {
|
|
737
|
-
...basicResponse,
|
|
738
|
-
numberOfReviews: number_of_reviews || 0,
|
|
739
|
-
collections: collections || [],
|
|
740
|
-
merchant_tags,
|
|
741
|
-
};
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
return basicResponse;
|
|
745
|
-
} catch (error) {
|
|
746
|
-
Logger.logError("spiffy-ai] error checking supported event", error, {
|
|
747
|
-
pageVariantConfig,
|
|
748
|
-
});
|
|
749
|
-
return undefined;
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
|
|
753
|
-
/**
|
|
754
|
-
* Parses the page variant config into a variant info object.
|
|
755
|
-
*
|
|
756
|
-
* @param pageVariantConfig - The variant config for the current page.
|
|
757
|
-
* @param url - The current URL of the page. This is used to extract the pdp/plp id.
|
|
758
|
-
*
|
|
759
|
-
* @returns The variant info for the current page, or undefined if the page variant config is invalid or not supported.
|
|
760
|
-
*/
|
|
761
|
-
private static readonly parsePageVariantConfig = async (
|
|
762
|
-
pageVariantConfig: PageVariantConfig,
|
|
763
|
-
url: string
|
|
764
|
-
): Promise<VariantInfo | undefined> => {
|
|
765
|
-
if (window?._spiffy?.variantInfoOverride) {
|
|
766
|
-
return window._spiffy.variantInfoOverride;
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
if (pageVariantConfig.variantType === "pdp") {
|
|
770
|
-
let productId: string = "";
|
|
771
|
-
if (pageVariantConfig.productIdExtractor === "url-resolver-product-id") {
|
|
772
|
-
productId =
|
|
773
|
-
(await PageVariantService.getIdFromUrlResolver("productId")) ?? "";
|
|
774
|
-
} else {
|
|
775
|
-
productId =
|
|
776
|
-
(await PageVariantService.getId(
|
|
777
|
-
pageVariantConfig.productIdExtractor
|
|
778
|
-
)) ?? "";
|
|
779
|
-
}
|
|
780
|
-
const parentProductId =
|
|
781
|
-
(await PageVariantService.getId(
|
|
782
|
-
pageVariantConfig.parentProductIdExtractor
|
|
783
|
-
)) ?? "";
|
|
784
|
-
return {
|
|
785
|
-
variantId: pageVariantConfig.variantId,
|
|
786
|
-
variant: pageVariantConfig.variantType,
|
|
787
|
-
parentProductId,
|
|
788
|
-
productId,
|
|
789
|
-
url,
|
|
790
|
-
};
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
if (pageVariantConfig.variantType === "plp") {
|
|
794
|
-
let plpId: string = "";
|
|
795
|
-
if (pageVariantConfig.plpIdExtractor === "url-resolver-plp-id") {
|
|
796
|
-
plpId = (await PageVariantService.getIdFromUrlResolver("plpId")) ?? "";
|
|
797
|
-
} else {
|
|
798
|
-
plpId =
|
|
799
|
-
(await PageVariantService.getId(pageVariantConfig.plpIdExtractor)) ??
|
|
800
|
-
"";
|
|
801
|
-
}
|
|
802
|
-
return {
|
|
803
|
-
variantId: pageVariantConfig.variantId,
|
|
804
|
-
variant: pageVariantConfig.variantType,
|
|
805
|
-
plpId,
|
|
806
|
-
url,
|
|
807
|
-
};
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
if (pageVariantConfig.variantType === "page_visit") {
|
|
811
|
-
const pageVisitCategory =
|
|
812
|
-
pageVariantConfig.variantTests.reduce<PageVisitCategory | null>(
|
|
813
|
-
(acc, currentTest) =>
|
|
814
|
-
currentTest.testType === PageVariantTestType.PageCategory
|
|
815
|
-
? PageVariantService.getCategory(currentTest.extractor)
|
|
816
|
-
: acc,
|
|
817
|
-
null
|
|
818
|
-
);
|
|
819
|
-
|
|
820
|
-
// This *should* only be the result of invalid config. Should we throw an error here or handle it with a default value?
|
|
821
|
-
if (pageVisitCategory === null) {
|
|
822
|
-
throw new Error(
|
|
823
|
-
"[spiffy-ai] - Invalid variant config produced invalid pageVisitCategory"
|
|
824
|
-
);
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
return {
|
|
828
|
-
variantId: pageVariantConfig.variantId,
|
|
829
|
-
variant: pageVariantConfig.variantType,
|
|
830
|
-
url,
|
|
831
|
-
pageVisitCategory,
|
|
832
|
-
};
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
if (pageVariantConfig.variantType === "homepage") {
|
|
836
|
-
return {
|
|
837
|
-
variantId: pageVariantConfig.variantId,
|
|
838
|
-
variant: "page_visit",
|
|
839
|
-
pageVisitCategory: PageVisitCategory.Homepage,
|
|
840
|
-
url,
|
|
841
|
-
};
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
if (pageVariantConfig.variantType === "search") {
|
|
845
|
-
return {
|
|
846
|
-
variantId: pageVariantConfig.variantId,
|
|
847
|
-
variant: "page_visit",
|
|
848
|
-
pageVisitCategory: PageVisitCategory.Search,
|
|
849
|
-
url,
|
|
850
|
-
};
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
if (pageVariantConfig.variantType === "other") {
|
|
854
|
-
return {
|
|
855
|
-
variantId: pageVariantConfig.variantId,
|
|
856
|
-
variant: "page_visit",
|
|
857
|
-
pageVisitCategory: PageVisitCategory.Other,
|
|
858
|
-
url,
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
return undefined;
|
|
863
|
-
};
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
export { PageVariantService };
|