@envive-ai/react-hooks 0.1.0
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/LICENSE +2 -0
- package/README.md +2 -0
- package/dist/GridInsertionService-CEYo9pGj.js +22 -0
- package/dist/GridInsertionService-CS_bnPh0.cjs +28 -0
- package/dist/bandolier-Ble8jEa8.js +1221 -0
- package/dist/bandolier-Bm2xAt_j.cjs +1221 -0
- package/dist/carpe-Da7b-LCW.cjs +599 -0
- package/dist/carpe-W13mhRRP.js +597 -0
- package/dist/cdnService-CZ-aXcY6.cjs +23 -0
- package/dist/cdnService-zQfKk3Eb.js +18 -0
- package/dist/chatElementDisplayLocation-CX8fuNao.d.cts +239 -0
- package/dist/chatElementDisplayLocation-CwptS9tx.d.ts +239 -0
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/contexts/index.cjs +13 -0
- package/dist/contexts/index.d.cts +65 -0
- package/dist/contexts/index.d.ts +66 -0
- package/dist/contexts/index.js +7 -0
- package/dist/contexts-BRjfVq_k.js +5064 -0
- package/dist/contexts-BYArqZtK.cjs +5164 -0
- package/dist/coterie-3y0D9ko4.cjs +229 -0
- package/dist/coterie-DOWcJAYv.js +229 -0
- package/dist/custservice-types-CFIFwZ-r.js +10 -0
- package/dist/custservice-types-CkfxZiHY.cjs +16 -0
- package/dist/default-C2fEZKXk.js +175 -0
- package/dist/default-CBUq6Q6G.cjs +4 -0
- package/dist/default-CGIFZK6m.js +4 -0
- package/dist/default-D_KPZdPJ.cjs +198 -0
- package/dist/divIds-Bss-btao.js +49 -0
- package/dist/divIds-DnZNd7rA.cjs +223 -0
- package/dist/dreamlandBaby-DCIsuU9R.cjs +338 -0
- package/dist/dreamlandBaby-DvSaZGrz.js +338 -0
- package/dist/entrypoints-D_JUvkgy.cjs +18 -0
- package/dist/entrypoints-YLQsbBRD.js +6 -0
- package/dist/enviveConfigContext-CUGLpPGU.js +34 -0
- package/dist/enviveConfigContext-Dfr2VH6u.cjs +48 -0
- package/dist/fiveCbd-B1SESMCO.js +605 -0
- package/dist/fiveCbd-CkOlVby_.cjs +605 -0
- package/dist/forLoveAndLemons-CfYPMnKS.cjs +660 -0
- package/dist/forLoveAndLemons-DmwYZIk0.js +658 -0
- package/dist/greenpan-Bsl3ir59.cjs +389 -0
- package/dist/greenpan-BtOi45lf.js +389 -0
- package/dist/grooveLife-6_dtYsRk.js +334 -0
- package/dist/grooveLife-Cmm1PSCL.cjs +334 -0
- package/dist/homegrownCannabis-C-kw-74X.js +400 -0
- package/dist/homegrownCannabis-CO0uY_mp.cjs +400 -0
- package/dist/hooks/index.cjs +16 -0
- package/dist/hooks/index.d.cts +357 -0
- package/dist/hooks/index.d.ts +357 -0
- package/dist/hooks/index.js +7 -0
- package/dist/jackArcher-CLVmwwpI.js +719 -0
- package/dist/jackArcher-DdYTIzAV.cjs +719 -0
- package/dist/jordanCraig-Am-Oor-O.js +1778 -0
- package/dist/jordanCraig-_u3-w4Hp.cjs +1778 -0
- package/dist/kindredBravely-CWovIDSc.cjs +482 -0
- package/dist/kindredBravely-eWp-ud_E.js +482 -0
- package/dist/kutFromTheKloth-BMV4BuGQ.js +361 -0
- package/dist/kutFromTheKloth-Q589bAOC.cjs +361 -0
- package/dist/larryAndSerges-BMUlTgI-.js +252 -0
- package/dist/larryAndSerges-CEau764j.cjs +252 -0
- package/dist/leapsAndRebounds-DGMzPO7T.js +352 -0
- package/dist/leapsAndRebounds-DHAtRTJD.cjs +352 -0
- package/dist/logger-Dln20ans.cjs +25 -0
- package/dist/logger-pdEEY8T2.js +19 -0
- package/dist/longevityrx-CZW8Hxzi.cjs +312 -0
- package/dist/longevityrx-jH2JLhNH.js +312 -0
- package/dist/lookOptic-BGXP5P_V.js +274 -0
- package/dist/lookOptic-CA6RwLbG.cjs +274 -0
- package/dist/mantraBrand-Cm9_PBCT.js +742 -0
- package/dist/mantraBrand-DByNqpnL.cjs +742 -0
- package/dist/medterra-B0wxj_PV.js +575 -0
- package/dist/medterra-DnPN2ksU.cjs +575 -0
- package/dist/modells-Bmz8Ag5M.js +476 -0
- package/dist/modells-CoYgkLSp.cjs +476 -0
- package/dist/models-DHdb7QWn.js +51 -0
- package/dist/models-ixxUsGL_.cjs +69 -0
- package/dist/pressedFloral-DSKs_oVG.js +653 -0
- package/dist/pressedFloral-DjBiSoUl.cjs +653 -0
- package/dist/skinPerfection-B_3xzVNS.cjs +326 -0
- package/dist/skinPerfection-IDrBuAPt.js +326 -0
- package/dist/snapSupplements-BJk5T5ba.js +277 -0
- package/dist/snapSupplements-BStTsdOZ.cjs +277 -0
- package/dist/socialProofClasses-Bhv2Vulz.js +9 -0
- package/dist/socialProofClasses-CrQBWdSA.cjs +39 -0
- package/dist/spanx-BYg0LE7R.js +653 -0
- package/dist/spanx-LwU1zSzq.cjs +655 -0
- package/dist/spanxStaging-CfSmuKYB.js +837 -0
- package/dist/spanxStaging-OZLV9qix.cjs +840 -0
- package/dist/suggestionBarV2-types-BllzwsBD.js +34 -0
- package/dist/suggestionBarV2-types-CaovchMP.cjs +46 -0
- package/dist/supergoop-BqPXDnKk.cjs +327 -0
- package/dist/supergoop-CIlrHND_.js +325 -0
- package/dist/types-C4T5UOIW.cjs +230 -0
- package/dist/types-CYNvLeSA.js +176 -0
- package/dist/uniqueVintage-B30mOqbH.cjs +1205 -0
- package/dist/uniqueVintage-CFueJOhO.js +1203 -0
- package/dist/venaCbd-DHGZy49P.cjs +357 -0
- package/dist/venaCbd-T0CqVD4k.js +357 -0
- package/dist/westonJonBoucher-BdMzs_Yg.cjs +414 -0
- package/dist/westonJonBoucher-b4TCQ4ev.js +414 -0
- package/dist/wineEnthusiast-BLGlOjgr.cjs +932 -0
- package/dist/wineEnthusiast-BqR0i_54.js +932 -0
- package/dist/wolfMattress-CyyO-LoC.js +362 -0
- package/dist/wolfMattress-DNGZOivg.cjs +362 -0
- package/dist/wolfTactical-3Mm2fvVF.js +341 -0
- package/dist/wolfTactical-BmXYlFjr.cjs +341 -0
- package/package.json +66 -0
- package/src/adapters/amplitude/amplitudeAdapter.ts +454 -0
- package/src/adapters/amplitude/index.ts +2 -0
- package/src/adapters/amplitude/stubAmplitudeAdapter.ts +34 -0
- package/src/adapters/spiffy/commerce/api.ts +596 -0
- package/src/adapters/spiffy/commerce/exceptions/sessionExceptions.ts +6 -0
- package/src/adapters/spiffy/commerce/exceptions/unsupportedProductExceptions.ts +6 -0
- package/src/adapters/spiffy/commerce/graphql.ts +184 -0
- package/src/application/config/generalStaticConfig.ts +37 -0
- package/src/application/logging/logger.ts +29 -0
- package/src/application/models/api/context.ts +4 -0
- package/src/application/models/api/generationParams.ts +4 -0
- package/src/application/models/api/nextMessageRequest.ts +11 -0
- package/src/application/models/api/orgAnalyticsConfig.ts +19 -0
- package/src/application/models/api/orgConfigResults.ts +40 -0
- package/src/application/models/api/organizationConfig.ts +12 -0
- package/src/application/models/api/response.ts +132 -0
- package/src/application/models/api/responseGenerics.ts +67 -0
- package/src/application/models/api/search.ts +26 -0
- package/src/application/models/api/suggestion.ts +4 -0
- package/src/application/models/api/supportedEventRequest.ts +8 -0
- package/src/application/models/api/userEvent.ts +101 -0
- package/src/application/models/cachedValue.ts +8 -0
- package/src/application/models/chatElementDisplayLocation.ts +22 -0
- package/src/application/models/clientDetails.ts +18 -0
- package/src/application/models/colorsConfig.ts +28 -0
- package/src/application/models/conversationalSearchIds.ts +5 -0
- package/src/application/models/dataLayer.ts +45 -0
- package/src/application/models/domMutationContinuation.ts +7 -0
- package/src/application/models/domObservationStrategy.ts +9 -0
- package/src/application/models/events.ts +5 -0
- package/src/application/models/featureGates.ts +23 -0
- package/src/application/models/frontendConfig.ts +14 -0
- package/src/application/models/googleAnalyticsEvents.ts +8 -0
- package/src/application/models/graphql/index.ts +2 -0
- package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +37 -0
- package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +103 -0
- package/src/application/models/graphql/queries/getMerchantOrgIdQuery.ts +11 -0
- package/src/application/models/guards/api/index.ts +12 -0
- package/src/application/models/guards/api/isApiFormResponse.ts +90 -0
- package/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts +37 -0
- package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +155 -0
- package/src/application/models/guards/api/isApiOrgConfigResults.ts +277 -0
- package/src/application/models/guards/api/isApiOrganizationConfig.ts +207 -0
- package/src/application/models/guards/api/isApiPDPEventAttributes.ts +21 -0
- package/src/application/models/guards/api/isApiPLPEventAttributes.ts +41 -0
- package/src/application/models/guards/api/isApiPageResponseAttributes.ts +21 -0
- package/src/application/models/guards/api/isApiProductResponseAttributes.ts +85 -0
- package/src/application/models/guards/api/isApiProductSearchAttributes.ts +23 -0
- package/src/application/models/guards/api/isApiProductSearchFilterAttributes.ts +15 -0
- package/src/application/models/guards/api/isApiQueryTypedEventAttributes.ts +4 -0
- package/src/application/models/guards/api/isApiResponse.ts +39 -0
- package/src/application/models/guards/api/isApiReviewResponseAttributes.ts +30 -0
- package/src/application/models/guards/api/isApiReviewRichInformation.ts +37 -0
- package/src/application/models/guards/api/isApiSearchEventAttributes.ts +28 -0
- package/src/application/models/guards/api/isApiSuggestion.ts +36 -0
- package/src/application/models/guards/api/isApiSuggestionClickedEventAttributes.ts +9 -0
- package/src/application/models/guards/api/isApiTextResponseAttributes.ts +9 -0
- package/src/application/models/guards/api/isApiUserEvent.ts +25 -0
- package/src/application/models/guards/graphQL/isGraphQLColorsConfig.ts +50 -0
- package/src/application/models/guards/isBaseEcommerceEvent.ts +17 -0
- package/src/application/models/guards/isGA4EcommerceEvent.ts +17 -0
- package/src/application/models/guards/isLegacyUAEcommerceEvent.ts +17 -0
- package/src/application/models/guards/isMobilePLPChatPlacementParameter.ts +11 -0
- package/src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts +4 -0
- package/src/application/models/guards/isVariantInfo.ts +37 -0
- package/src/application/models/guards/utils.ts +43 -0
- package/src/application/models/index.ts +20 -0
- package/src/application/models/localStorageEventListener.ts +4 -0
- package/src/application/models/message.ts +146 -0
- package/src/application/models/mobilePLPChatPlacementParameter.ts +3 -0
- package/src/application/models/orgsEnum.ts +36 -0
- package/src/application/models/productExperiment.ts +5 -0
- package/src/application/models/spanxTakeAQuizCtaParameter.ts +4 -0
- package/src/application/models/spiffyWidgets.ts +16 -0
- package/src/application/models/supportedOrgs.ts +137 -0
- package/src/application/models/utilityTypes/camelCase.ts +87 -0
- package/src/application/models/utilityTypes/camelCasedPropertiesDeep.ts +80 -0
- package/src/application/models/utilityTypes/delimiterCase.ts +121 -0
- package/src/application/models/utilityTypes/delimiterCasedPropertiesDeep.ts +98 -0
- package/src/application/models/utilityTypes/index.ts +1 -0
- package/src/application/models/utilityTypes/internal.ts +93 -0
- package/src/application/models/utilityTypes/primitive.ts +8 -0
- package/src/application/models/utilityTypes/snakeCasedPropertiesDeep.ts +49 -0
- package/src/application/models/utilityTypes/splitWords.ts +76 -0
- package/src/application/models/utilityTypes/trim.ts +28 -0
- package/src/application/models/utilityTypes/unknownArray.ts +25 -0
- package/src/application/models/utils/snakeToCamelTransformer.ts +90 -0
- package/src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts +68 -0
- package/src/application/models/validators/validateGraphQLColorsConfig.ts +29 -0
- package/src/application/models/validators/validateGraphQLFrontendConfig.ts +594 -0
- package/src/application/models/validators/validateGraphQLOrgId.ts +7 -0
- package/src/application/models/validators/validateMobilePLPChatPlacementParameter.ts +14 -0
- package/src/application/models/validators/validateOrgConfigResults.ts +47 -0
- package/src/application/models/validators/validateOrganizationConfig.ts +37 -0
- package/src/application/models/validators/validateResponse.ts +187 -0
- package/src/application/models/validators/validateSuggestion.ts +16 -0
- package/src/application/models/validators/validateUserEvent.ts +110 -0
- package/src/application/models/variantInfo/index.ts +1 -0
- package/src/application/models/variantInfo/pageVisitInfo.ts +6 -0
- package/src/application/models/variantInfo/plpInfo.ts +3 -0
- package/src/application/models/variantInfo/productInfo.ts +5 -0
- package/src/application/models/variantInfo/variantInfo.ts +23 -0
- package/src/application/service/cachingService.ts +84 -0
- package/src/application/service/cdnService.ts +18 -0
- package/src/application/service/customerService/index.ts +8 -0
- package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +15 -0
- package/src/application/service/customerService/types.ts +31 -0
- package/src/application/service/domMutationObserver.ts +320 -0
- package/src/application/service/domMutations/GridInsertionService.ts +123 -0
- package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +99 -0
- package/src/application/service/domMutations/domInsertionService.ts +90 -0
- package/src/application/service/domMutations/domMutationListener.ts +15 -0
- package/src/application/service/domMutations/domMutationListenerState.ts +52 -0
- package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +41 -0
- package/src/application/service/domMutations/gladly/gladlyListener.ts +61 -0
- package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +41 -0
- package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +119 -0
- package/src/application/service/environmentService.ts +51 -0
- package/src/application/service/featureFlagService.ts +130 -0
- package/src/application/service/kustomerIntegrationService.ts +111 -0
- package/src/application/service/localStorageService.ts +77 -0
- package/src/application/service/pageVariantService.ts +779 -0
- package/src/application/service/searchService.ts +140 -0
- package/src/application/service/sessionStorageService.ts +27 -0
- package/src/application/service/shopifyUrlService.ts +63 -0
- package/src/application/service/userIdentityService.ts +114 -0
- package/src/application/service/windowChatToggleService.ts +71 -0
- package/src/application/service/windowDataLayerService.ts +181 -0
- package/src/application/service/windowFrontendConfigService.ts +104 -0
- package/src/application/utils/__tests__/divideArrays.test.ts +14 -0
- package/src/application/utils/analyticsUtils.ts +110 -0
- package/src/application/utils/coreContextToApiContext.ts +11 -0
- package/src/application/utils/coreUserEventToApiUserEvent.ts +106 -0
- package/src/application/utils/divideArray.ts +7 -0
- package/src/application/utils/domObserver.ts +96 -0
- package/src/application/utils/elementObserver.ts +246 -0
- package/src/application/utils/imageFilter.ts +12 -0
- package/src/application/utils/index.ts +3 -0
- package/src/application/utils/merchantUtils.ts +16 -0
- package/src/application/utils/messageFromFormSubmittedEvent.ts +31 -0
- package/src/application/utils/messageFromQueryEvent.ts +38 -0
- package/src/application/utils/messageFromResponse.ts +133 -0
- package/src/application/utils/messageFromSuggestionEvent.ts +32 -0
- package/src/application/utils/mouseEventTypes.ts +1 -0
- package/src/application/utils/mutationHelper.ts +51 -0
- package/src/application/utils/nextMessageRequestToApiRequest.ts +31 -0
- package/src/application/utils/nodeSelector.ts +133 -0
- package/src/application/utils/overrides.ts +196 -0
- package/src/application/utils/stringUtils.ts +55 -0
- package/src/application/utils/supportedEventRequestToApiRequest.ts +12 -0
- package/src/application/utils/urlsParser.ts +53 -0
- package/src/application/utils/validation.ts +5 -0
- package/src/atoms/app/index.ts +57 -0
- package/src/atoms/app/variant.ts +261 -0
- package/src/atoms/atomStore.ts +34 -0
- package/src/atoms/chat/chatState.ts +44 -0
- package/src/atoms/chat/form.ts +19 -0
- package/src/atoms/chat/index.ts +38 -0
- package/src/atoms/chat/lastMessage.ts +11 -0
- package/src/atoms/chat/messageQueue.ts +65 -0
- package/src/atoms/chat/performanceMetrics.ts +84 -0
- package/src/atoms/chat/renderedWidgetRefs.ts +28 -0
- package/src/atoms/chat/replies.ts +51 -0
- package/src/atoms/chat/suggestions.ts +36 -0
- package/src/atoms/globalSearch.ts +12 -0
- package/src/atoms/index.ts +5 -0
- package/src/atoms/org/customerService.ts +13 -0
- package/src/atoms/org/graphqlConfig.ts +27 -0
- package/src/atoms/org/index.ts +7 -0
- package/src/atoms/org/merchantCss.ts +44 -0
- package/src/atoms/org/org.ts +256 -0
- package/src/atoms/org/orgAnalyticsConfig.ts +28 -0
- package/src/atoms/org/orgPageConfig.ts +38 -0
- package/src/atoms/org/orgUIConfig.ts +122 -0
- package/src/atoms/search/chatSearch.ts +293 -0
- package/src/atoms/search/index.ts +2 -0
- package/src/atoms/search/productFilters.ts +207 -0
- package/src/atoms/search/productSorter.ts +23 -0
- package/src/atoms/search/searchAPI.ts +194 -0
- package/src/atoms/search/types.ts +55 -0
- package/src/atoms/search/utils.ts +18 -0
- package/src/config/divIds.ts +27 -0
- package/src/config/locators/components/chat/entrypoints.ts +13 -0
- package/src/config/locators/components/chat/index.ts +23 -0
- package/src/config/locators/components/chat/preview.ts +13 -0
- package/src/config/locators/components/chat/variants/index.ts +16 -0
- package/src/config/locators/components/common/buttons.ts +6 -0
- package/src/config/locators/components/common/cards.ts +18 -0
- package/src/config/locators/components/common/links.ts +1 -0
- package/src/config/locators/components/common/tables.ts +2 -0
- package/src/config/locators/components/floating-button.ts +2 -0
- package/src/config/locators/components/index.ts +3 -0
- package/src/config/locators/components/report-issue.ts +21 -0
- package/src/config/locators/components/search/index.ts +5 -0
- package/src/config/locators/components/shadow-dom.ts +1 -0
- package/src/config/locators/embedded.ts +21 -0
- package/src/config/locators/index.ts +3 -0
- package/src/config/socialProofClasses.ts +17 -0
- package/src/contexts/chatContext.tsx +451 -0
- package/src/contexts/enviveConfigContext.tsx +70 -0
- package/src/contexts/index.ts +4 -0
- package/src/contexts/systemSettingsContext.tsx +61 -0
- package/src/contexts/types.ts +1059 -0
- package/src/enabled-features.ts +83 -0
- package/src/events/event-types.ts +11 -0
- package/src/events/index.ts +52 -0
- package/src/events/registerAnalyticsListeners.ts +49 -0
- package/src/extension.ts +63 -0
- package/src/hooks/index.ts +22 -0
- package/src/hooks/useBlockBackButton.ts +29 -0
- package/src/hooks/useChatToggle.ts +66 -0
- package/src/hooks/useCustomerSupportHandoff.ts +39 -0
- package/src/hooks/useDebounce.ts +17 -0
- package/src/hooks/useDynamicVariants.ts +210 -0
- package/src/hooks/useElementObserver.ts +245 -0
- package/src/hooks/useFileUpload.ts +61 -0
- package/src/hooks/useGrabAndScroll.ts +133 -0
- package/src/hooks/useHideElements.ts +82 -0
- package/src/hooks/useHorizontalScrollAnimation.ts +115 -0
- package/src/hooks/useImageResolver.ts +51 -0
- package/src/hooks/useIntersection.ts +28 -0
- package/src/hooks/useIsSmallScreen.ts +23 -0
- package/src/hooks/useMessageFilter.ts +49 -0
- package/src/hooks/useMessageScrollObserver.ts +47 -0
- package/src/hooks/useReducedMotionWithOverride.ts +15 -0
- package/src/hooks/useSearch.tsx +433 -0
- package/src/hooks/useSnapCalculator.ts +38 -0
- package/src/hooks/useSnapControl.ts +155 -0
- package/src/hooks/useSystemSettingsContext.ts +12 -0
- package/src/hooks/useTrackComponentVisibleEvent.ts +52 -0
- package/src/hooks/useUpdateAnalyticsProps.ts +56 -0
- package/src/hooks/utils.ts +153 -0
- package/src/index.ts +31 -0
- package/src/initialize.ts +163 -0
- package/src/interceptors/types.ts +6 -0
- package/src/interceptors/useFormEscalation.ts +40 -0
- package/src/interceptors/useMessageInterceptor.ts +32 -0
- package/src/main.ts +85 -0
- package/src/main.tsx +123 -0
- package/src/merchants/bandolier/bandolier.ts +1389 -0
- package/src/merchants/carpe/carpe.ts +656 -0
- package/src/merchants/coterie/coterie.ts +280 -0
- package/src/merchants/default.ts +193 -0
- package/src/merchants/dreamlandBaby/dreamlandBaby.ts +375 -0
- package/src/merchants/fiveCbd/fiveCbd.ts +697 -0
- package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +721 -0
- package/src/merchants/greenpan/greenpan.ts +440 -0
- package/src/merchants/grooveLife/grooveLife.ts +386 -0
- package/src/merchants/homegrownCannabis/homegrownCannabis.ts +468 -0
- package/src/merchants/init-merchant.sh +53 -0
- package/src/merchants/jackArcher/jackArcher.ts +974 -0
- package/src/merchants/jordanCraig/jordanCraig.ts +1927 -0
- package/src/merchants/kindredBravely/kindredBravely.ts +529 -0
- package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +418 -0
- package/src/merchants/larryAndSerges/larryAndSerges.ts +314 -0
- package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +424 -0
- package/src/merchants/longevityrx/longevityrx.ts +368 -0
- package/src/merchants/lookOptic/lookOptic.ts +323 -0
- package/src/merchants/mantraBrand/mantraBrand.ts +838 -0
- package/src/merchants/medterra/medterra.ts +670 -0
- package/src/merchants/modells/modells.ts +546 -0
- package/src/merchants/pressedFloral/pressedFloral.ts +734 -0
- package/src/merchants/skinPerfection/skinPerfection.ts +379 -0
- package/src/merchants/snapSupplements/snapSupplements.ts +325 -0
- package/src/merchants/spanx/spanx.ts +810 -0
- package/src/merchants/spanx/spanxStaging.ts +942 -0
- package/src/merchants/supergoop/supergoop.ts +376 -0
- package/src/merchants/uniqueVintage/uniqueVintage.ts +1314 -0
- package/src/merchants/uniqueVintage/views/useUniqueVintageChatSearch.ts +147 -0
- package/src/merchants/venaCbd/venaCbd.ts +410 -0
- package/src/merchants/westonJonBoucher/westonJonBoucher.ts +473 -0
- package/src/merchants/wineEnthusiast/wineEnthusiast.ts +990 -0
- package/src/merchants/wolfMattress/wolfMattress.ts +411 -0
- package/src/merchants/wolfTactical/wolfTactical.ts +389 -0
- package/src/types/custservice-types.ts +28 -0
- package/src/types/search-filter-types.ts +111 -0
- package/src/types/suggestionBarV2-types.ts +4 -0
- package/src/types/test-types.ts +3 -0
- package/src/types.ts +66 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { atomWithStorage } from 'jotai/utils';
|
|
3
|
+
import Logger from 'src/application/logging/logger';
|
|
4
|
+
import { getAtomStore, sessionStorageUtil } from 'src/atoms/atomStore';
|
|
5
|
+
|
|
6
|
+
export const APP_INITIAL_START_TIME_KEY = 'spiffy-app-initial-start-time';
|
|
7
|
+
export const PAGE_LOAD_OFFSET_TIME_KEY = 'spiffy-page-load-offset-time';
|
|
8
|
+
/**
|
|
9
|
+
* The different performance metrics that can be logged. All times are relative to the
|
|
10
|
+
* initial start time of the app and are stored in milliseconds.
|
|
11
|
+
*/
|
|
12
|
+
export enum PerfMetricsEvents {
|
|
13
|
+
PageLoadOffset = 'page_load_offset_ms',
|
|
14
|
+
MainBundleLoaded = 'main_bundle_loaded_ms',
|
|
15
|
+
OrgConfigLoadStarted = 'org_config_load_started_ms',
|
|
16
|
+
OrgConfigLoadEnded = 'org_config_load_ended_ms',
|
|
17
|
+
FirstResponseStarted = 'first_response_started_ms',
|
|
18
|
+
FirstResponseCompleted = 'first_response_completed_ms',
|
|
19
|
+
FirstSuggestionsStarted = 'first_suggestions_started_ms',
|
|
20
|
+
FirstSuggestionsCompleted = 'first_suggestions_completed_ms',
|
|
21
|
+
EmbeddedWidgetRendered = 'embedded_widget_rendered_ms',
|
|
22
|
+
FloatingButtonRendered = 'floating_button_rendered_ms',
|
|
23
|
+
TopSuggestionsBarRendered = 'top_suggestions_bar_rendered_ms',
|
|
24
|
+
BottomSuggestionsBarRendered = 'bottom_suggestions_bar_rendered_ms',
|
|
25
|
+
SearchPromptRendered = 'search_prompt_rendered_ms',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const internalPerfMetricsAtom = atom<Map<PerfMetricsEvents, number>>(new Map());
|
|
29
|
+
export const appInitialStartTimeMsAtom = atomWithStorage<string | undefined>(
|
|
30
|
+
APP_INITIAL_START_TIME_KEY,
|
|
31
|
+
sessionStorage.getItem(APP_INITIAL_START_TIME_KEY) ?? undefined,
|
|
32
|
+
sessionStorageUtil,
|
|
33
|
+
{
|
|
34
|
+
getOnInit: true,
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
export const pageLoadOffsetTimeAtom = atomWithStorage<string | undefined>(
|
|
39
|
+
PAGE_LOAD_OFFSET_TIME_KEY,
|
|
40
|
+
sessionStorage.getItem(PAGE_LOAD_OFFSET_TIME_KEY) ?? undefined,
|
|
41
|
+
sessionStorageUtil,
|
|
42
|
+
{
|
|
43
|
+
getOnInit: true,
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resets the performance metrics atom to an empty map. This should be called after the performance
|
|
49
|
+
* metrics have been reported to amplitude. On SPA, it ensures that we can still capture metrics as
|
|
50
|
+
* the user navigates around the app (although there is more work to be done to fully enable this).
|
|
51
|
+
* On non-SPA, it ensures that previously captured metrics are not reported again.
|
|
52
|
+
*/
|
|
53
|
+
export const resetPerformanceMetricsAtom = () => {
|
|
54
|
+
const atomStore = getAtomStore();
|
|
55
|
+
atomStore.set(internalPerfMetricsAtom, new Map());
|
|
56
|
+
};
|
|
57
|
+
export const performanceMetricsAtom = atom((get) => get(internalPerfMetricsAtom));
|
|
58
|
+
export const hasReportedPerformanceMetricsAtom = atom<boolean>(false);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Logs a performance metric by capturing the delta between the initial app start time
|
|
62
|
+
* and the current time. If the metric has already been logged, it will not be logged again.
|
|
63
|
+
*
|
|
64
|
+
* @param value The performance metric name to log.
|
|
65
|
+
*/
|
|
66
|
+
export const logPerfMetricAtom = atom(null, (get, set, value: PerfMetricsEvents) => {
|
|
67
|
+
const initialTimeStorageValue = get(appInitialStartTimeMsAtom);
|
|
68
|
+
const initialTimeMs = initialTimeStorageValue ? parseInt(initialTimeStorageValue, 10) : undefined;
|
|
69
|
+
|
|
70
|
+
if (initialTimeMs == null) {
|
|
71
|
+
Logger.logWarn(`[spiffy-ai] No initial app start time found. Skipping...`, undefined);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const currentPerfMetrics = get(internalPerfMetricsAtom);
|
|
76
|
+
if (currentPerfMetrics.has(value)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const currentTimeMs = Date.now();
|
|
81
|
+
const deltaMs = currentTimeMs - initialTimeMs;
|
|
82
|
+
currentPerfMetrics.set(value, deltaMs);
|
|
83
|
+
set(internalPerfMetricsAtom, currentPerfMetrics);
|
|
84
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { getAtomStore } from 'src/atoms/atomStore';
|
|
3
|
+
|
|
4
|
+
const internalWidgetArrayAtom = atom<HTMLElement[]>([])
|
|
5
|
+
|
|
6
|
+
export const widgetArrayAtom = atom((get) =>
|
|
7
|
+
get(internalWidgetArrayAtom))
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* This function call is used to create a list of the Spiffy widgets
|
|
11
|
+
* that are rendering on the page.
|
|
12
|
+
*
|
|
13
|
+
* It is used by the FloatingButton widget to slide out of view when it
|
|
14
|
+
* overlaps with another Spiffy widget.
|
|
15
|
+
*
|
|
16
|
+
* The spiffy widgets should be added to the this array for the floating button
|
|
17
|
+
* to know about them.
|
|
18
|
+
*
|
|
19
|
+
* Today the "SuggestionBar" widget is not added, but the other widgets are.
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
export const addWidget = (ref: HTMLElement, idx?: number) => {
|
|
23
|
+
const atomStore = getAtomStore()
|
|
24
|
+
const val = atomStore.get(internalWidgetArrayAtom)
|
|
25
|
+
const insertIdx = idx ?? val.length
|
|
26
|
+
val[insertIdx] = ref
|
|
27
|
+
atomStore.set(internalWidgetArrayAtom, val)
|
|
28
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { Message, MessageType } from 'src/application/models';
|
|
3
|
+
import {
|
|
4
|
+
userHasRepliedAtom,
|
|
5
|
+
messagesAtom,
|
|
6
|
+
userQueryAtom,
|
|
7
|
+
replyEventCategoryAtom,
|
|
8
|
+
} from 'src/atoms/chat';
|
|
9
|
+
import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
|
|
10
|
+
import { AmplitudeAdapter, SpiffyMetricsEventName } from 'src/adapters/amplitude';
|
|
11
|
+
import { queueUserEventAtom } from './messageQueue';
|
|
12
|
+
|
|
13
|
+
type HandleReplyParams = {
|
|
14
|
+
message: Message;
|
|
15
|
+
userTyped: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const handleReplyAtom = atom(null, (get, set, { message, userTyped }: HandleReplyParams) => {
|
|
19
|
+
if (message.type !== MessageType.QueryTyped) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const queryTyped = message.metadata.content;
|
|
24
|
+
|
|
25
|
+
set(replyEventCategoryAtom, UserEventCategory.QueryTyped);
|
|
26
|
+
set(userQueryAtom, queryTyped);
|
|
27
|
+
set(messagesAtom, [...get(messagesAtom), [message]]);
|
|
28
|
+
set(userHasRepliedAtom, true);
|
|
29
|
+
set(queueUserEventAtom, {
|
|
30
|
+
eventId: message.id,
|
|
31
|
+
createdAt: message.createdAt,
|
|
32
|
+
category: UserEventCategory.QueryTyped,
|
|
33
|
+
attributes: {
|
|
34
|
+
query: queryTyped,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
AmplitudeAdapter.trackEvent({
|
|
38
|
+
eventName: SpiffyMetricsEventName.ChatUserMessageInput,
|
|
39
|
+
eventProps: {
|
|
40
|
+
message_id: message.id,
|
|
41
|
+
message_role: message.role,
|
|
42
|
+
message_type: message.type,
|
|
43
|
+
message_metadata: {
|
|
44
|
+
content: AmplitudeAdapter.amplitudeSafeString(message?.metadata?.content),
|
|
45
|
+
created_at: message.createdAt,
|
|
46
|
+
user_typed: userTyped,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
alsoSendToGoogleAnalytics: true,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { Message, MessageRole, MessageType, Suggestion } from 'src/application/models';
|
|
3
|
+
import {
|
|
4
|
+
messagesAtom,
|
|
5
|
+
replyEventCategoryAtom,
|
|
6
|
+
suggestionAtom,
|
|
7
|
+
userHasRepliedAtom,
|
|
8
|
+
} from 'src/atoms/chat';
|
|
9
|
+
import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
|
|
10
|
+
import { queueUserEventAtom } from './messageQueue';
|
|
11
|
+
|
|
12
|
+
export const handleSuggestionAtom = atom(null, (get, set, suggestion: Suggestion) => {
|
|
13
|
+
const newMessage: Message = {
|
|
14
|
+
id: suggestion.id,
|
|
15
|
+
role: MessageRole.User,
|
|
16
|
+
type: MessageType.SuggestionClicked,
|
|
17
|
+
createdAt: new Date().toISOString(),
|
|
18
|
+
metadata: {
|
|
19
|
+
suggestionId: suggestion.id,
|
|
20
|
+
suggestionContent: suggestion.content,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
set(replyEventCategoryAtom, UserEventCategory.SuggestionClicked);
|
|
25
|
+
set(suggestionAtom, suggestion);
|
|
26
|
+
set(messagesAtom, [...get(messagesAtom), [newMessage]]);
|
|
27
|
+
set(userHasRepliedAtom, true);
|
|
28
|
+
set(queueUserEventAtom, {
|
|
29
|
+
eventId: suggestion.id,
|
|
30
|
+
category: UserEventCategory.SuggestionClicked,
|
|
31
|
+
createdAt: newMessage.createdAt,
|
|
32
|
+
attributes: {
|
|
33
|
+
suggestionId: suggestion.id,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
|
|
3
|
+
export const autocompleteStateAtom = atom<{ results: string[]; isLoading: boolean }>({
|
|
4
|
+
results: [],
|
|
5
|
+
isLoading: false,
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const isFilterOpenAtom = atom(false);
|
|
9
|
+
|
|
10
|
+
export const isGlobalSearchOpenAtom = atom(false);
|
|
11
|
+
|
|
12
|
+
export const isSearchResultsOpenAtom = atom(false);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AttachmentRequest,
|
|
3
|
+
CustServiceConversationMessages,
|
|
4
|
+
} from "@spiffy-ai/commerce-api-client";
|
|
5
|
+
import { atom } from "jotai";
|
|
6
|
+
import { ChatState } from "src/types/custservice-types";
|
|
7
|
+
|
|
8
|
+
export const isBusinessHoursAtom = atom<boolean>(true);
|
|
9
|
+
export const isCustomerServiceOpenAtom = atom<boolean>(false);
|
|
10
|
+
export const customerServiceResponseAtom =
|
|
11
|
+
atom<CustServiceConversationMessages>();
|
|
12
|
+
export const customerServiceChatStateAtom = atom<ChatState>();
|
|
13
|
+
export const customerServiceAttachment = atom<AttachmentRequest | undefined>();
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { ColorMapping } from 'src/application/models/colorsConfig';
|
|
3
|
+
import { FrontendConfig } from 'src/application/models/frontendConfig';
|
|
4
|
+
import { getOrgInfo } from 'src/application/models/supportedOrgs';
|
|
5
|
+
import { orgShortNameAtom } from 'src/atoms/org/org';
|
|
6
|
+
|
|
7
|
+
const internalGraphQLColorsConfigAtom = atom<ColorMapping | undefined>(undefined);
|
|
8
|
+
const internalGraphQLFrontendConfigAtom = atom<FrontendConfig | undefined>(undefined);
|
|
9
|
+
|
|
10
|
+
export const colorsConfigAtom = atom(
|
|
11
|
+
async (get) => {
|
|
12
|
+
const colors = get(internalGraphQLColorsConfigAtom);
|
|
13
|
+
const orgInfo = await getOrgInfo(get(orgShortNameAtom));
|
|
14
|
+
const orgUIConfigColors = orgInfo.orgColors();
|
|
15
|
+
return { ...orgUIConfigColors, ...colors };
|
|
16
|
+
},
|
|
17
|
+
(_, set, value: ColorMapping | undefined) => {
|
|
18
|
+
set(internalGraphQLColorsConfigAtom, value);
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const frontendConfigAtom = atom(
|
|
23
|
+
(get) => get(internalGraphQLFrontendConfigAtom),
|
|
24
|
+
(_, set, value: FrontendConfig | undefined) => {
|
|
25
|
+
set(internalGraphQLFrontendConfigAtom, value);
|
|
26
|
+
},
|
|
27
|
+
);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { atom } from "jotai";
|
|
2
|
+
import { ColorNames } from "src/contexts/types";
|
|
3
|
+
import { orgUIConfigAtom } from "src/atoms/org/orgUIConfig";
|
|
4
|
+
import { colorsConfigAtom } from "src/atoms/org/graphqlConfig";
|
|
5
|
+
|
|
6
|
+
export const orgMerchantCssAtom = atom(async (get) => {
|
|
7
|
+
const orgUIConfig = get(orgUIConfigAtom);
|
|
8
|
+
const colors = await get(colorsConfigAtom);
|
|
9
|
+
const merchantThemeCss = colors
|
|
10
|
+
? `
|
|
11
|
+
|
|
12
|
+
* {
|
|
13
|
+
--spiffy-colors-text-primary: ${colors[ColorNames.TextPrimary]};
|
|
14
|
+
--spiffy-colors-text-secondary: ${colors[ColorNames.TextSecondary]};
|
|
15
|
+
--spiffy-colors-text-accent: ${colors[ColorNames.TextAccent]};
|
|
16
|
+
--spiffy-colors-text-link: ${colors[ColorNames.TextLink]};
|
|
17
|
+
--spiffy-colors-text-light: ${colors[ColorNames.TextLight]};
|
|
18
|
+
--spiffy-colors-background-primary: ${colors[ColorNames.BackgroundPrimary]};
|
|
19
|
+
--spiffy-colors-background-secondary: ${
|
|
20
|
+
colors[ColorNames.BackgroundSecondary]
|
|
21
|
+
};
|
|
22
|
+
--spiffy-colors-background-secondary-dark: ${
|
|
23
|
+
colors[ColorNames.BackgroundSecondaryDark]
|
|
24
|
+
};
|
|
25
|
+
--spiffy-colors-background-tertiary: ${colors[ColorNames.BackgroundTertiary]};
|
|
26
|
+
--spiffy-colors-background-dark: ${colors[ColorNames.BackgroundDark]};
|
|
27
|
+
--spiffy-colors-background-light: ${colors[ColorNames.BackgroundLight]};
|
|
28
|
+
--spiffy-colors-background-saturated: ${
|
|
29
|
+
colors[ColorNames.BackgroundSaturated]
|
|
30
|
+
};
|
|
31
|
+
--spiffy-colors-border-light: ${colors[ColorNames.BorderLight]};
|
|
32
|
+
--spiffy-colors-border-medium: ${colors[ColorNames.BorderMedium]};
|
|
33
|
+
--spiffy-colors-border-dark: ${colors[ColorNames.BorderDark]};
|
|
34
|
+
--spiffy-colors-border-outline: ${colors[ColorNames.BorderOutline]};
|
|
35
|
+
--spiffy-colors-accent-primary: ${colors[ColorNames.AccentPrimary]};
|
|
36
|
+
--spiffy-colors-accent-secondary: ${colors[ColorNames.AccentSecondary]};
|
|
37
|
+
}`
|
|
38
|
+
: `
|
|
39
|
+
* {}`;
|
|
40
|
+
|
|
41
|
+
const merchantOverrideCss = orgUIConfig?.merchantOverrideCss;
|
|
42
|
+
|
|
43
|
+
return `${merchantThemeCss} ${merchantOverrideCss}`;
|
|
44
|
+
});
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
2
|
+
import { ContextSourceEnum } from "@spiffy-ai/commerce-api-client";
|
|
3
|
+
import { atom } from "jotai";
|
|
4
|
+
import { atomWithStorage, createJSONStorage } from "jotai/utils";
|
|
5
|
+
import CommerceApiClient from "src/adapters/spiffy/commerce/api";
|
|
6
|
+
import { GraphQLClient } from "src/adapters/spiffy/commerce/graphql";
|
|
7
|
+
import { OrgConfig } from "src/application/models/api/orgConfigResults";
|
|
8
|
+
import { EnvironmentService } from "src/application/service/environmentService";
|
|
9
|
+
import { FeatureFlagService } from "src/application/service/featureFlagService";
|
|
10
|
+
import { FeatureGates } from "src/application/models/featureGates";
|
|
11
|
+
import { UserIdentityService } from "src/application/service/userIdentityService";
|
|
12
|
+
import { AtomStore, getAtomStore } from "src/atoms/atomStore";
|
|
13
|
+
import { PerfMetricsEvents, logPerfMetricAtom } from "src/atoms/chat";
|
|
14
|
+
import { orgAnalyticsConfigAtom } from "src/atoms/org/orgAnalyticsConfig";
|
|
15
|
+
import { colorsConfigAtom, frontendConfigAtom } from "./graphqlConfig";
|
|
16
|
+
import { getOrgUIConfig } from "./orgUIConfig";
|
|
17
|
+
import Logger from "src/application/logging/logger";
|
|
18
|
+
import { useEnviveConfig } from "src/contexts/enviveConfigContext";
|
|
19
|
+
|
|
20
|
+
const internalApiKeyAtom = atom<string | undefined>(undefined);
|
|
21
|
+
const internalEndpointURLAtom = atom<string | undefined>(undefined);
|
|
22
|
+
const internalSourceAtom = atom<ContextSourceEnum>(
|
|
23
|
+
EnvironmentService.getContextSource()
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
export const getApiKeyEnvVar = (shortName: string): string =>
|
|
27
|
+
`VITE_${shortName.replace(/-/g, "_").toUpperCase()}_API_KEY`;
|
|
28
|
+
|
|
29
|
+
export const apiKeyAtom = atom(
|
|
30
|
+
(get) => {
|
|
31
|
+
const apiKey = get(internalApiKeyAtom);
|
|
32
|
+
|
|
33
|
+
if (apiKey) {
|
|
34
|
+
return apiKey;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const { orgLevelApiKey, orgShortName } = useEnviveConfig();
|
|
38
|
+
|
|
39
|
+
if (orgLevelApiKey) {
|
|
40
|
+
return orgLevelApiKey;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (
|
|
44
|
+
window._spiffy?.publicKey &&
|
|
45
|
+
typeof window._spiffy.publicKey === "string"
|
|
46
|
+
) {
|
|
47
|
+
return window._spiffy.publicKey;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!orgShortName) {
|
|
51
|
+
throw new Error("[spiffy-ai] orgShortName is required but is not set");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The merchant probably forgot to set the apiKey
|
|
55
|
+
throw new Error(`[spiffy-ai]: apiKey is missing`);
|
|
56
|
+
},
|
|
57
|
+
(_, set, newVal: string | undefined) => {
|
|
58
|
+
set(internalApiKeyAtom, newVal);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
export const endpointURLAtom = atom(
|
|
62
|
+
(get) => get(internalEndpointURLAtom) ?? EnvironmentService.getApiEndpoint(),
|
|
63
|
+
(_, set, newVal: string | undefined) => {
|
|
64
|
+
set(internalEndpointURLAtom, newVal);
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
export const sourceAtom = atom(
|
|
68
|
+
(get) => get(internalSourceAtom),
|
|
69
|
+
(_, set, newVal: ContextSourceEnum) => {
|
|
70
|
+
set(internalSourceAtom, newVal);
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const orgConfigStorageUtil = createJSONStorage<
|
|
75
|
+
Record<string, OrgConfig> | undefined
|
|
76
|
+
>(() => sessionStorage);
|
|
77
|
+
export const storedOrgConfigAtom = atomWithStorage(
|
|
78
|
+
"spiffy-org-config",
|
|
79
|
+
undefined,
|
|
80
|
+
orgConfigStorageUtil,
|
|
81
|
+
{
|
|
82
|
+
getOnInit: true,
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const internalFeatureFlagServiceAtom = atom<FeatureFlagService | undefined>(
|
|
87
|
+
undefined
|
|
88
|
+
);
|
|
89
|
+
const internalOrgConfigAtom = atom<OrgConfig | undefined>(undefined);
|
|
90
|
+
const internalOrgDomainAtom = atom<string | undefined>(undefined);
|
|
91
|
+
const internalOrgIdAtom = atom<string | undefined>(undefined);
|
|
92
|
+
const internalOrgShortNameAtom = atom<string | undefined>(undefined);
|
|
93
|
+
export const featureFlagServiceAtom = atom(
|
|
94
|
+
(get) => {
|
|
95
|
+
const featureFlagService = get(internalFeatureFlagServiceAtom);
|
|
96
|
+
if (featureFlagService) {
|
|
97
|
+
return featureFlagService;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const orgConfig = get(internalOrgConfigAtom);
|
|
101
|
+
if (orgConfig) {
|
|
102
|
+
return new FeatureFlagService(orgConfig.gates);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
throw new Error("FeatureFlagService is referenced before it is set");
|
|
106
|
+
},
|
|
107
|
+
(_, set, value: FeatureFlagService) => {
|
|
108
|
+
set(internalFeatureFlagServiceAtom, value);
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
export const orgConfigAtom = atom(
|
|
112
|
+
(get) => {
|
|
113
|
+
const orgConfig = get(internalOrgConfigAtom);
|
|
114
|
+
if (orgConfig) {
|
|
115
|
+
return orgConfig;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
throw new Error("OrgConfig is referenced before it is set");
|
|
119
|
+
},
|
|
120
|
+
(_, set, value: OrgConfig) => {
|
|
121
|
+
set(internalOrgConfigAtom, value);
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
export const orgShortNameAtom = atom(
|
|
125
|
+
(get) => {
|
|
126
|
+
const orgShortName = get(internalOrgShortNameAtom);
|
|
127
|
+
if (orgShortName) {
|
|
128
|
+
return orgShortName;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw new Error("Org short name is referenced before it is set");
|
|
132
|
+
},
|
|
133
|
+
(_, set, value: string) => {
|
|
134
|
+
set(internalOrgShortNameAtom, value);
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
export const orgDomainAtom = atom(
|
|
138
|
+
(get) => {
|
|
139
|
+
const orgDomain = get(internalOrgDomainAtom);
|
|
140
|
+
if (orgDomain) {
|
|
141
|
+
return orgDomain;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
throw new Error("Org domain is referenced before it is set");
|
|
145
|
+
},
|
|
146
|
+
(_, set, value: string) => {
|
|
147
|
+
set(internalOrgDomainAtom, value);
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
export const orgIdAtom = atom(
|
|
151
|
+
(get) => {
|
|
152
|
+
const orgId = get(internalOrgIdAtom);
|
|
153
|
+
if (orgId) {
|
|
154
|
+
return orgId;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
throw new Error("Org id is referenced before it is set");
|
|
158
|
+
},
|
|
159
|
+
(_, set, value: string) => {
|
|
160
|
+
set(internalOrgIdAtom, value);
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
export const resetStoredOrgConfigAtom = () => {
|
|
165
|
+
const atomStore = getAtomStore();
|
|
166
|
+
atomStore.set(storedOrgConfigAtom, {});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// eslint-disable-next-line
|
|
170
|
+
const getGraphQLConfig = async (atomStore: AtomStore) => {
|
|
171
|
+
const { colorsConfig, frontendConfig } =
|
|
172
|
+
(await GraphQLClient.getColorsAndFrontendConfig()) ?? {};
|
|
173
|
+
|
|
174
|
+
const rawFrontendConfig = atomStore.get(frontendConfigAtom);
|
|
175
|
+
|
|
176
|
+
atomStore.set(colorsConfigAtom, colorsConfig);
|
|
177
|
+
|
|
178
|
+
atomStore.set(frontendConfigAtom, {
|
|
179
|
+
...rawFrontendConfig,
|
|
180
|
+
pageVariants: frontendConfig?.pageVariants,
|
|
181
|
+
mountingConfigs: frontendConfig?.mountingConfigs,
|
|
182
|
+
widgetConfigs: frontendConfig?.widgetConfigs,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
await getOrgUIConfig(
|
|
186
|
+
frontendConfig?.uiConfigs,
|
|
187
|
+
frontendConfig?.merchantOverrideCss
|
|
188
|
+
);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* This function is used to return an orgConfig corresponding to a given API key
|
|
193
|
+
*
|
|
194
|
+
* @param apiKeyOverride an optional new api key to override the current key stored in apiKeyAtom
|
|
195
|
+
*
|
|
196
|
+
* @returns The OrgAnalyticsConfig object or throws an error if the config was not successfully retrieved
|
|
197
|
+
*/
|
|
198
|
+
export const getAsyncOrgConfig = async (
|
|
199
|
+
apiKeyOverride?: string
|
|
200
|
+
): Promise<OrgConfig> => {
|
|
201
|
+
const atomStore = getAtomStore();
|
|
202
|
+
const apiKey = apiKeyOverride ?? atomStore.get(apiKeyAtom);
|
|
203
|
+
atomStore.set(apiKeyAtom, apiKey);
|
|
204
|
+
atomStore.set(endpointURLAtom, EnvironmentService.getApiEndpoint());
|
|
205
|
+
atomStore.set(sourceAtom, EnvironmentService.getContextSource());
|
|
206
|
+
atomStore.set(logPerfMetricAtom, PerfMetricsEvents.OrgConfigLoadStarted);
|
|
207
|
+
const maybeOrgConfigByApiKey = atomStore.get(storedOrgConfigAtom);
|
|
208
|
+
let maybeOrgConfig = maybeOrgConfigByApiKey?.[apiKey];
|
|
209
|
+
if (!maybeOrgConfig) {
|
|
210
|
+
const userId = UserIdentityService.getUserIdOrDefault();
|
|
211
|
+
maybeOrgConfig = await CommerceApiClient.getOrgConfig(userId);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (!maybeOrgConfig) {
|
|
215
|
+
throw new Error("[spiffy-ai] Org config is not defined but is required");
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const latestConfig = maybeOrgConfig.configs?.find(
|
|
219
|
+
(config) => config.isLatest
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
if (!latestConfig) {
|
|
223
|
+
throw new Error("[spiffy-ai] no latest org config is found");
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const orgConfig: OrgConfig = {
|
|
227
|
+
...maybeOrgConfig,
|
|
228
|
+
configs: [{ ...latestConfig }],
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// TODO this should never be undefined, update the SDK to enforce this
|
|
232
|
+
if (!orgConfig.org) {
|
|
233
|
+
throw new Error("[spiffy-ai] orgConfig.org is not defined but is required");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
atomStore.set(logPerfMetricAtom, PerfMetricsEvents.OrgConfigLoadEnded);
|
|
237
|
+
atomStore.set(orgShortNameAtom, orgConfig.org.org.shortName);
|
|
238
|
+
atomStore.set(orgDomainAtom, orgConfig.org.org.domain);
|
|
239
|
+
atomStore.set(orgIdAtom, orgConfig.org.org.id);
|
|
240
|
+
atomStore.set(storedOrgConfigAtom, {
|
|
241
|
+
...maybeOrgConfigByApiKey,
|
|
242
|
+
[apiKey]: orgConfig,
|
|
243
|
+
});
|
|
244
|
+
atomStore.set(orgConfigAtom, orgConfig);
|
|
245
|
+
atomStore.set(orgAnalyticsConfigAtom, {
|
|
246
|
+
...latestConfig.config,
|
|
247
|
+
});
|
|
248
|
+
atomStore.set(
|
|
249
|
+
featureFlagServiceAtom,
|
|
250
|
+
new FeatureFlagService(orgConfig.gates)
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
await getGraphQLConfig(atomStore);
|
|
254
|
+
|
|
255
|
+
return orgConfig;
|
|
256
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import {
|
|
3
|
+
OrgAnalyticsConfig,
|
|
4
|
+
OrgAnalyticsAmplitudeConfig,
|
|
5
|
+
OrgAnalyticsCustomerServiceConfig,
|
|
6
|
+
OrgAnalyticsGoogleAnalyticsConfig,
|
|
7
|
+
} from 'src/application/models/api/orgAnalyticsConfig';
|
|
8
|
+
|
|
9
|
+
const internalOrgAnalyticsConfigAtom = atom<OrgAnalyticsConfig | undefined>(undefined);
|
|
10
|
+
|
|
11
|
+
export const orgAnalyticsConfigAtom = atom(
|
|
12
|
+
(get) => get(internalOrgAnalyticsConfigAtom),
|
|
13
|
+
(_, set, value: OrgAnalyticsConfig) => {
|
|
14
|
+
set(internalOrgAnalyticsConfigAtom, value);
|
|
15
|
+
},
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export const orgAnalyticsAmplitudeConfigAtom = atom<OrgAnalyticsAmplitudeConfig | undefined>(
|
|
19
|
+
(get) => get(orgAnalyticsConfigAtom)?.amplitude,
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const orgAnalyticsCustomerServiceConfigAtom = atom<
|
|
23
|
+
OrgAnalyticsCustomerServiceConfig | undefined
|
|
24
|
+
>((get) => get(orgAnalyticsConfigAtom)?.customerService);
|
|
25
|
+
|
|
26
|
+
export const orgAnalyticsGoogleAnalyticsConfigAtom = atom<
|
|
27
|
+
OrgAnalyticsGoogleAnalyticsConfig | undefined
|
|
28
|
+
>((get) => get(orgAnalyticsConfigAtom)?.googleAnalytics);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { getOrgInfo } from 'src/application/models';
|
|
3
|
+
import { frontendConfigAtom } from 'src/atoms/org/graphqlConfig';
|
|
4
|
+
import { orgConfigAtom } from 'src/atoms/org/org';
|
|
5
|
+
import { PageVariantConfig } from 'src/contexts/types';
|
|
6
|
+
|
|
7
|
+
const internalInjectedPageVariantsAtom = atom<PageVariantConfig[]>([]);
|
|
8
|
+
|
|
9
|
+
export const orgPageConfigAtom = atom(
|
|
10
|
+
async (get) => {
|
|
11
|
+
const orgConfig = get(orgConfigAtom);
|
|
12
|
+
const orgInfo = await getOrgInfo(orgConfig.org.org.shortName);
|
|
13
|
+
const frontendConfig = get(frontendConfigAtom);
|
|
14
|
+
const injectedPageVariants = get(internalInjectedPageVariantsAtom);
|
|
15
|
+
const localOrgPageConfig = orgInfo.orgPageConfig();
|
|
16
|
+
const OverridenOrgPageConfig = { ...localOrgPageConfig };
|
|
17
|
+
|
|
18
|
+
if (frontendConfig?.mountingConfigs) {
|
|
19
|
+
OverridenOrgPageConfig.mountingConfigs = frontendConfig.mountingConfigs;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (frontendConfig?.widgetConfigs) {
|
|
23
|
+
OverridenOrgPageConfig.widgetConfigs = frontendConfig.widgetConfigs;
|
|
24
|
+
}
|
|
25
|
+
if (frontendConfig?.pageVariants) {
|
|
26
|
+
OverridenOrgPageConfig.pageVariants = frontendConfig.pageVariants;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (injectedPageVariants.length > 0) {
|
|
30
|
+
OverridenOrgPageConfig.pageVariants = [...injectedPageVariants];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return OverridenOrgPageConfig;
|
|
34
|
+
},
|
|
35
|
+
(_, set, pageVariants: PageVariantConfig[]) => {
|
|
36
|
+
set(internalInjectedPageVariantsAtom, pageVariants);
|
|
37
|
+
},
|
|
38
|
+
);
|