@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,596 @@
|
|
|
1
|
+
import Logger from "src/application/logging/logger";
|
|
2
|
+
import {
|
|
3
|
+
Configuration,
|
|
4
|
+
CustomerServiceApi,
|
|
5
|
+
DefaultApi,
|
|
6
|
+
InferenceApi,
|
|
7
|
+
ReportSessionRequest,
|
|
8
|
+
ResponseError,
|
|
9
|
+
UserEventCategory,
|
|
10
|
+
V1GetSessionMessages200Response,
|
|
11
|
+
V1OrgConfigGetRequest,
|
|
12
|
+
ContextSourceEnum,
|
|
13
|
+
V1OrgConfigGetSourceEnum,
|
|
14
|
+
CustomerServiceProvider,
|
|
15
|
+
ResponseCategory,
|
|
16
|
+
FormType,
|
|
17
|
+
} from "@spiffy-ai/commerce-api-client";
|
|
18
|
+
import { validateSuggestion } from "src/application/models/validators/validateSuggestion";
|
|
19
|
+
import { validateUserEvent } from "src/application/models/validators/validateUserEvent";
|
|
20
|
+
import {
|
|
21
|
+
messageFromQueryEvent,
|
|
22
|
+
messageFromResponse,
|
|
23
|
+
messageFromSuggestionEvent,
|
|
24
|
+
} from "src/application/utils";
|
|
25
|
+
import {
|
|
26
|
+
Message,
|
|
27
|
+
NextMessageRequest,
|
|
28
|
+
Response,
|
|
29
|
+
Suggestion,
|
|
30
|
+
SupportedEventRequest,
|
|
31
|
+
UserEvent,
|
|
32
|
+
} from "src/application/models";
|
|
33
|
+
import { messageRequestToCommerceMessageRequest } from "src/application/utils/nextMessageRequestToApiRequest";
|
|
34
|
+
import { validateResponse } from "src/application/models/validators/validateResponse";
|
|
35
|
+
import { coreSupportedEventRequestToApiRequest } from "src/application/utils/supportedEventRequestToApiRequest";
|
|
36
|
+
import { SessionRestartRequired } from "src/adapters/spiffy/commerce/exceptions/sessionExceptions";
|
|
37
|
+
import { UnsupportedProductException } from "src/adapters/spiffy/commerce/exceptions/unsupportedProductExceptions";
|
|
38
|
+
import { ClientDetails } from "src/application/models/clientDetails";
|
|
39
|
+
import { getAtomStore } from "src/atoms/atomStore";
|
|
40
|
+
import { EnvironmentService } from "src/application/service/environmentService";
|
|
41
|
+
import { ProductExperiment } from "src/application/models/productExperiment";
|
|
42
|
+
import { FeatureGates } from "src/application/models/featureGates";
|
|
43
|
+
import { validateOrgConfigResults } from "src/application/models/validators/validateOrgConfigResults";
|
|
44
|
+
import { OrgConfig } from "src/application/models/api/orgConfigResults";
|
|
45
|
+
import { appDetailsAtom } from "src/atoms/app";
|
|
46
|
+
import { apiKeyAtom, featureFlagServiceAtom } from "src/atoms/org/org";
|
|
47
|
+
import { SupportedEvent } from "src/atoms/app/variant";
|
|
48
|
+
import { messageFromFormSubmittedEvent } from "src/application/utils/messageFromFormSubmittedEvent";
|
|
49
|
+
import type { Context } from "@spiffy-ai/commerce-api-client/dist/models/Context";
|
|
50
|
+
import { useEnviveConfig } from "src/contexts/enviveConfigContext";
|
|
51
|
+
|
|
52
|
+
async function errorResponseBody(error: ResponseError) {
|
|
53
|
+
try {
|
|
54
|
+
return await error.response.json();
|
|
55
|
+
} catch {
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function throwSessionRestartRequiredIf(errorMsg: string, error: unknown) {
|
|
61
|
+
if (!(error instanceof ResponseError)) {
|
|
62
|
+
Logger.logInfo(errorMsg, error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const errorResponse = await errorResponseBody(error);
|
|
67
|
+
if (
|
|
68
|
+
errorResponse?.message?.toLowerCase() === "unsupported product" || // for backward compatibility. newer versions of the API return sub_code instead of message
|
|
69
|
+
errorResponse?.app_code?.toUpperCase() === "PRODUCT_NOT_FOUND"
|
|
70
|
+
) {
|
|
71
|
+
throw new UnsupportedProductException();
|
|
72
|
+
} else if (
|
|
73
|
+
errorResponse?.app_code?.toUpperCase() === "RESTART_SESSION" ||
|
|
74
|
+
errorResponse?.sub_code?.toUpperCase() === "NOT_FOUND" // for backward compatibility. new API responses will contain "app_code"
|
|
75
|
+
) {
|
|
76
|
+
Logger.logInfo(
|
|
77
|
+
"Session does not exist. Re-start session",
|
|
78
|
+
error,
|
|
79
|
+
error.response,
|
|
80
|
+
errorResponse
|
|
81
|
+
);
|
|
82
|
+
throw new SessionRestartRequired();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Logger.logInfo(errorMsg, error);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
class CommerceApiClient {
|
|
90
|
+
private readonly defaultApi: DefaultApi;
|
|
91
|
+
|
|
92
|
+
private readonly customerServiceApi: CustomerServiceApi;
|
|
93
|
+
|
|
94
|
+
private readonly inferenceApi: InferenceApi;
|
|
95
|
+
|
|
96
|
+
private static instance: CommerceApiClient | undefined;
|
|
97
|
+
|
|
98
|
+
private suggestionsAbortController = new AbortController();
|
|
99
|
+
|
|
100
|
+
private responsesAbortController = new AbortController();
|
|
101
|
+
|
|
102
|
+
private static getInstance = (): CommerceApiClient => {
|
|
103
|
+
if (!CommerceApiClient.instance) {
|
|
104
|
+
const atomStore = getAtomStore();
|
|
105
|
+
const apiKey = atomStore.get(apiKeyAtom);
|
|
106
|
+
CommerceApiClient.instance = new CommerceApiClient(apiKey);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return CommerceApiClient.instance;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
private constructor(apiKey: string, basePath?: string) {
|
|
113
|
+
const { baseUrl } = useEnviveConfig();
|
|
114
|
+
const path = basePath || baseUrl;
|
|
115
|
+
const config: Configuration = new Configuration({
|
|
116
|
+
accessToken: apiKey,
|
|
117
|
+
basePath: path,
|
|
118
|
+
headers: {
|
|
119
|
+
"Content-Type": "application/json",
|
|
120
|
+
Accept: "application/json",
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
this.defaultApi = new DefaultApi(config);
|
|
124
|
+
this.inferenceApi = new InferenceApi(config);
|
|
125
|
+
this.customerServiceApi = new CustomerServiceApi(config);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static resolveUrl = async (url: string) => {
|
|
129
|
+
const atomStore = getAtomStore();
|
|
130
|
+
const appDetails = atomStore.get(appDetailsAtom);
|
|
131
|
+
const featureFlagService = atomStore.get(featureFlagServiceAtom);
|
|
132
|
+
|
|
133
|
+
const context: Context = {
|
|
134
|
+
user_id: appDetails.userId,
|
|
135
|
+
org_id: appDetails.orgId,
|
|
136
|
+
org_short_name: appDetails.orgShortName,
|
|
137
|
+
chat_id: appDetails.chatId,
|
|
138
|
+
source: appDetails.source,
|
|
139
|
+
env: appDetails.env,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const featureGates = featureFlagService.getFeatureFlags();
|
|
143
|
+
const urlResolvingRequest = {
|
|
144
|
+
url,
|
|
145
|
+
context,
|
|
146
|
+
feature_gates: featureGates,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const rawResponse =
|
|
150
|
+
await CommerceApiClient.getInstance().inferenceApi.v1UrlResolvingPostRaw({
|
|
151
|
+
UrlResolvingRequest: urlResolvingRequest,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const responseBody = await rawResponse.raw.json();
|
|
155
|
+
|
|
156
|
+
return responseBody;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
static reportSession = async (
|
|
160
|
+
reportRequest: ReportSessionRequest
|
|
161
|
+
): Promise<void> => {
|
|
162
|
+
await CommerceApiClient.getInstance().defaultApi.v1ChatsReportSessionIdPost(
|
|
163
|
+
{
|
|
164
|
+
ReportSessionRequest: reportRequest,
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
static getNextResponses = async (
|
|
170
|
+
payload: NextMessageRequest
|
|
171
|
+
): Promise<Message[]> => {
|
|
172
|
+
try {
|
|
173
|
+
const response =
|
|
174
|
+
await CommerceApiClient.getInstance().inferenceApi.v1NextResponsesPost({
|
|
175
|
+
NextMessageRequest: messageRequestToCommerceMessageRequest(payload),
|
|
176
|
+
});
|
|
177
|
+
const messages = response
|
|
178
|
+
.map((resp) => validateResponse(resp))
|
|
179
|
+
.map((resp) => messageFromResponse(resp));
|
|
180
|
+
|
|
181
|
+
return messages.filter((m): m is Message => m != null);
|
|
182
|
+
} catch (err: unknown) {
|
|
183
|
+
Logger.logInfo("Failed to get next responses", err, {
|
|
184
|
+
payloadContext: payload?.context,
|
|
185
|
+
userEvents: payload?.userEvents,
|
|
186
|
+
});
|
|
187
|
+
await throwSessionRestartRequiredIf("Failed to get next responses", err);
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
static getNextResponseStreaming = (
|
|
193
|
+
payload: NextMessageRequest
|
|
194
|
+
): AsyncGenerator<Response, void, unknown> => {
|
|
195
|
+
async function* generate(
|
|
196
|
+
inferenceApi: InferenceApi,
|
|
197
|
+
abortController: AbortController
|
|
198
|
+
) {
|
|
199
|
+
// make sure streaming is enabled
|
|
200
|
+
try {
|
|
201
|
+
const response = await inferenceApi.v1NextResponsesPostRaw(
|
|
202
|
+
{
|
|
203
|
+
NextMessageRequest: messageRequestToCommerceMessageRequest(payload),
|
|
204
|
+
},
|
|
205
|
+
{ signal: abortController.signal }
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
// Read the response as a stream of data
|
|
209
|
+
if (!response.raw.body) {
|
|
210
|
+
Logger.logError(
|
|
211
|
+
"[spiffy-ai] No body in the streamed response",
|
|
212
|
+
undefined,
|
|
213
|
+
{
|
|
214
|
+
response: response.raw,
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const reader = response.raw.body.getReader();
|
|
221
|
+
const decoder = new TextDecoder("utf-8");
|
|
222
|
+
|
|
223
|
+
let partial = "";
|
|
224
|
+
// TODO this function is recreated every time new data comes from the stream - define it outside of the generator
|
|
225
|
+
const safeParse = (line: string): unknown => {
|
|
226
|
+
try {
|
|
227
|
+
return JSON.parse(line); // Parse the JSON string
|
|
228
|
+
} catch (err) {
|
|
229
|
+
Logger.logError("[spiffy-ai] Error parsing streamed line", err, {
|
|
230
|
+
line,
|
|
231
|
+
partial,
|
|
232
|
+
});
|
|
233
|
+
// swallow the error and set the partial to our current chunk
|
|
234
|
+
partial = line;
|
|
235
|
+
return partial;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// TODO this function is recreated every time new data comes from the stream - define it outside of the generator
|
|
240
|
+
const processChunk = (chunk: string): unknown[] => {
|
|
241
|
+
// merge the partial with the incoming chunk
|
|
242
|
+
const lines = `${partial}${chunk}`.split("\n");
|
|
243
|
+
|
|
244
|
+
const parsedLines = lines
|
|
245
|
+
.map((line) => line.replace(/^data: /, "").trim()) // Remove the "data: " prefix
|
|
246
|
+
.filter((line) => line !== "" && line !== "[DONE]") // Remove empty lines and "[DONE]"
|
|
247
|
+
.map(safeParse)
|
|
248
|
+
.filter((v) => v); // and filter out the undefined values
|
|
249
|
+
return parsedLines;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
while (true) {
|
|
253
|
+
// eslint-disable-next-line no-await-in-loop
|
|
254
|
+
const { done, value } = await reader.read();
|
|
255
|
+
|
|
256
|
+
if (done) {
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Massage and parse the chunk of data
|
|
261
|
+
const chunk = decoder.decode(value);
|
|
262
|
+
const parsedLines = processChunk(chunk);
|
|
263
|
+
|
|
264
|
+
for (const parsedLine of parsedLines) {
|
|
265
|
+
const validatedResponse = validateResponse(parsedLine);
|
|
266
|
+
|
|
267
|
+
if (validatedResponse) {
|
|
268
|
+
yield validatedResponse;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
} catch (error: unknown) {
|
|
273
|
+
Logger.logError(
|
|
274
|
+
"[spiffy-ai] Failed to get next streaming responses",
|
|
275
|
+
error,
|
|
276
|
+
{
|
|
277
|
+
payloadContext: payload?.context,
|
|
278
|
+
userEvents: payload?.userEvents,
|
|
279
|
+
}
|
|
280
|
+
);
|
|
281
|
+
await throwSessionRestartRequiredIf(
|
|
282
|
+
"Failed to get next streaming responses",
|
|
283
|
+
error
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
CommerceApiClient.getInstance().responsesAbortController.abort();
|
|
289
|
+
CommerceApiClient.getInstance().responsesAbortController =
|
|
290
|
+
new AbortController();
|
|
291
|
+
|
|
292
|
+
return generate(
|
|
293
|
+
CommerceApiClient.getInstance().inferenceApi,
|
|
294
|
+
CommerceApiClient.getInstance().responsesAbortController
|
|
295
|
+
);
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
static getNextSuggestions = async (
|
|
299
|
+
payload: NextMessageRequest
|
|
300
|
+
): Promise<Suggestion[]> => {
|
|
301
|
+
try {
|
|
302
|
+
CommerceApiClient.getInstance().suggestionsAbortController.abort();
|
|
303
|
+
CommerceApiClient.getInstance().suggestionsAbortController =
|
|
304
|
+
new AbortController();
|
|
305
|
+
|
|
306
|
+
const response =
|
|
307
|
+
await CommerceApiClient.getInstance().inferenceApi.v1NextSuggestionsPost(
|
|
308
|
+
{
|
|
309
|
+
NextMessageRequest: messageRequestToCommerceMessageRequest(payload),
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
signal:
|
|
313
|
+
CommerceApiClient.getInstance().suggestionsAbortController.signal,
|
|
314
|
+
}
|
|
315
|
+
);
|
|
316
|
+
|
|
317
|
+
const suggestions = response
|
|
318
|
+
.map((resp) => validateSuggestion(resp))
|
|
319
|
+
.filter((suggestion): suggestion is Suggestion => suggestion != null);
|
|
320
|
+
|
|
321
|
+
return suggestions;
|
|
322
|
+
} catch (error: unknown) {
|
|
323
|
+
Logger.logInfo("Failed to get suggestions", error, {
|
|
324
|
+
payloadContext: payload?.context,
|
|
325
|
+
userEvents: payload?.userEvents,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
await throwSessionRestartRequiredIf("Failed to get suggestions", error);
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Fetches the existing chat data for a given session and transforms them to reconstruct the chat history.
|
|
335
|
+
*
|
|
336
|
+
* @param orgId The organization Id
|
|
337
|
+
* @param chatId The existing chat Id
|
|
338
|
+
* @param userId The user Id
|
|
339
|
+
*
|
|
340
|
+
* @returns A list of messages that were exchanged in the chat, throws an error if the chat session has expired.
|
|
341
|
+
*/
|
|
342
|
+
static getResponses = async (
|
|
343
|
+
orgId: string,
|
|
344
|
+
chatId: string,
|
|
345
|
+
userId: string
|
|
346
|
+
): Promise<{
|
|
347
|
+
responses: Response[][];
|
|
348
|
+
userEvents: UserEvent[];
|
|
349
|
+
suggestions: Suggestion[];
|
|
350
|
+
messages: Message[][];
|
|
351
|
+
}> => {
|
|
352
|
+
let data: V1GetSessionMessages200Response = {
|
|
353
|
+
responses: [],
|
|
354
|
+
suggestions: [],
|
|
355
|
+
user_events: [],
|
|
356
|
+
};
|
|
357
|
+
const request = {
|
|
358
|
+
org_id: orgId,
|
|
359
|
+
chat_id: chatId,
|
|
360
|
+
user_id: userId,
|
|
361
|
+
};
|
|
362
|
+
try {
|
|
363
|
+
data =
|
|
364
|
+
await CommerceApiClient.getInstance().defaultApi.v1GetSessionMessages(
|
|
365
|
+
request
|
|
366
|
+
);
|
|
367
|
+
} catch (error: unknown) {
|
|
368
|
+
await throwSessionRestartRequiredIf(
|
|
369
|
+
"Failed to get chat responses",
|
|
370
|
+
error
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const responses: Response[][] = data?.responses?.map((turn) =>
|
|
375
|
+
turn
|
|
376
|
+
.map((response) => validateResponse(response))
|
|
377
|
+
.filter((response): response is Response => response != null)
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
const suggestions: Suggestion[] = data?.suggestions
|
|
381
|
+
.map((suggestion) => validateSuggestion(suggestion))
|
|
382
|
+
.filter((suggestion): suggestion is Suggestion => suggestion != null);
|
|
383
|
+
|
|
384
|
+
const userEvents: UserEvent[] = data?.user_events
|
|
385
|
+
.map((event) => validateUserEvent(event))
|
|
386
|
+
.filter((event): event is UserEvent => event != null);
|
|
387
|
+
|
|
388
|
+
// if a form has already been submitted, don't show it in the chat history
|
|
389
|
+
const formSubmittedUserEventsFormIds = userEvents
|
|
390
|
+
.filter((event) => event.category === UserEventCategory.FormSubmitted)
|
|
391
|
+
.map((event) => event.attributes.formResponseId);
|
|
392
|
+
|
|
393
|
+
const assistantMessages: Message[][] = responses
|
|
394
|
+
.map((turn) =>
|
|
395
|
+
turn
|
|
396
|
+
.filter(
|
|
397
|
+
(response) =>
|
|
398
|
+
!(
|
|
399
|
+
response.category === ResponseCategory.Form &&
|
|
400
|
+
formSubmittedUserEventsFormIds.includes(response.id)
|
|
401
|
+
)
|
|
402
|
+
)
|
|
403
|
+
.map((response) => messageFromResponse(response))
|
|
404
|
+
.filter((message): message is Message => message != null)
|
|
405
|
+
)
|
|
406
|
+
.filter((turn) => turn.length > 0);
|
|
407
|
+
|
|
408
|
+
const userMessages: Message[][] = userEvents
|
|
409
|
+
.map((event) => {
|
|
410
|
+
if (
|
|
411
|
+
[UserEventCategory.QueryTyped, UserEventCategory.Search].includes(
|
|
412
|
+
event.category
|
|
413
|
+
)
|
|
414
|
+
) {
|
|
415
|
+
return [messageFromQueryEvent(event)];
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (event.category === UserEventCategory.SuggestionClicked) {
|
|
419
|
+
return [messageFromSuggestionEvent(event, suggestions)];
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
if (event.category === UserEventCategory.FormSubmitted) {
|
|
423
|
+
const formResponse = responses
|
|
424
|
+
.flat()
|
|
425
|
+
.find(
|
|
426
|
+
(response) =>
|
|
427
|
+
response.id === event.attributes.formResponseId &&
|
|
428
|
+
event.attributes.formType !== FormType.Escalation
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
if (formResponse && formResponse.category === ResponseCategory.Form) {
|
|
432
|
+
return [
|
|
433
|
+
messageFromFormSubmittedEvent(event, formResponse.attributes),
|
|
434
|
+
];
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
return [];
|
|
439
|
+
})
|
|
440
|
+
.filter((message): message is Message[] => message.length > 0);
|
|
441
|
+
|
|
442
|
+
// Sort the messages chronologically to reconstruct the chat history
|
|
443
|
+
const sortedMessages = [...assistantMessages, ...userMessages].sort(
|
|
444
|
+
(a, b) =>
|
|
445
|
+
new Date(a[0].createdAt).getTime() - new Date(b[0].createdAt).getTime()
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
return { responses, userEvents, suggestions, messages: sortedMessages };
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
*
|
|
453
|
+
* @param payload
|
|
454
|
+
* @returns
|
|
455
|
+
*/
|
|
456
|
+
static isSupportedEvent = async (
|
|
457
|
+
payload: SupportedEventRequest
|
|
458
|
+
): Promise<SupportedEvent> => {
|
|
459
|
+
try {
|
|
460
|
+
const rawResponse =
|
|
461
|
+
await CommerceApiClient.getInstance().inferenceApi.v1SupportedEventPostRaw(
|
|
462
|
+
{
|
|
463
|
+
SupportedEventRequest:
|
|
464
|
+
coreSupportedEventRequestToApiRequest(payload),
|
|
465
|
+
}
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
// Get the actual HTTP response JSON
|
|
469
|
+
const httpResponseText = await rawResponse.raw.text();
|
|
470
|
+
const httpResponseJson = JSON.parse(httpResponseText);
|
|
471
|
+
|
|
472
|
+
return {
|
|
473
|
+
...httpResponseJson,
|
|
474
|
+
numberOfReviews: httpResponseJson.num_of_reviews,
|
|
475
|
+
merchant_tags: httpResponseJson.merchant_tags || [],
|
|
476
|
+
};
|
|
477
|
+
} catch (err) {
|
|
478
|
+
Logger.logError("Failed to get response for v1SupportedEventPost", {
|
|
479
|
+
err,
|
|
480
|
+
});
|
|
481
|
+
return {
|
|
482
|
+
supported: false,
|
|
483
|
+
ready: false,
|
|
484
|
+
category: undefined,
|
|
485
|
+
collections: [],
|
|
486
|
+
numberOfReviews: undefined,
|
|
487
|
+
top_category: undefined,
|
|
488
|
+
merchant_tags: [],
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
static identifyUser = async (
|
|
494
|
+
spiffyUserId: string,
|
|
495
|
+
merchantUserId: string,
|
|
496
|
+
uaDetails: ClientDetails
|
|
497
|
+
): Promise<void> => {
|
|
498
|
+
try {
|
|
499
|
+
await CommerceApiClient.getInstance().defaultApi.v1AnalyticsIdentifyPost({
|
|
500
|
+
AnalyticsIdentifyRequest: {
|
|
501
|
+
user_id: spiffyUserId,
|
|
502
|
+
os_name: uaDetails.os,
|
|
503
|
+
os_version: uaDetails.osVersion,
|
|
504
|
+
platform: uaDetails.os,
|
|
505
|
+
device_id: uaDetails.deviceModel,
|
|
506
|
+
device_brand: uaDetails.deviceBrand,
|
|
507
|
+
device_manufacturer: uaDetails.deviceManufacturer,
|
|
508
|
+
device_model: uaDetails.deviceModel,
|
|
509
|
+
user_properties: {
|
|
510
|
+
cdp_user_id: merchantUserId,
|
|
511
|
+
browser: uaDetails.browser,
|
|
512
|
+
browser_version: uaDetails.browserVersion,
|
|
513
|
+
user_agent: uaDetails.userAgent,
|
|
514
|
+
},
|
|
515
|
+
},
|
|
516
|
+
});
|
|
517
|
+
} catch (err) {
|
|
518
|
+
Logger.logError("Failed to identify user", err);
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
private static mapContextSourceToV1OrgConfigGetSource = (
|
|
523
|
+
source: ContextSourceEnum | undefined
|
|
524
|
+
): V1OrgConfigGetSourceEnum | undefined => {
|
|
525
|
+
if (source === undefined) return undefined;
|
|
526
|
+
switch (source) {
|
|
527
|
+
case ContextSourceEnum.Fork:
|
|
528
|
+
return V1OrgConfigGetSourceEnum.Fork;
|
|
529
|
+
case ContextSourceEnum.Playground:
|
|
530
|
+
return V1OrgConfigGetSourceEnum.Playground;
|
|
531
|
+
case ContextSourceEnum.App:
|
|
532
|
+
return V1OrgConfigGetSourceEnum.App;
|
|
533
|
+
case ContextSourceEnum.Test:
|
|
534
|
+
return V1OrgConfigGetSourceEnum.Test;
|
|
535
|
+
default: {
|
|
536
|
+
// This ensures that if new values are added to ContextSourceEnum, we catch it
|
|
537
|
+
const exhaustiveCheck: never = source;
|
|
538
|
+
return exhaustiveCheck;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
static getOrgConfig = async (
|
|
544
|
+
user_id: string
|
|
545
|
+
): Promise<OrgConfig | undefined> => {
|
|
546
|
+
try {
|
|
547
|
+
const { reactAppName } = useEnviveConfig();
|
|
548
|
+
const request: V1OrgConfigGetRequest = {
|
|
549
|
+
namespace: reactAppName,
|
|
550
|
+
user_id,
|
|
551
|
+
source: this.mapContextSourceToV1OrgConfigGetSource(
|
|
552
|
+
EnvironmentService.getContextSource()
|
|
553
|
+
),
|
|
554
|
+
include_experiments: Object.values(ProductExperiment),
|
|
555
|
+
include_feature_gates: Object.values(FeatureGates),
|
|
556
|
+
};
|
|
557
|
+
const response =
|
|
558
|
+
await CommerceApiClient.getInstance().defaultApi.v1OrgConfigGet(
|
|
559
|
+
request
|
|
560
|
+
);
|
|
561
|
+
|
|
562
|
+
return validateOrgConfigResults(response);
|
|
563
|
+
} catch (err) {
|
|
564
|
+
Logger.logError(`Failed to get org config`, err, { err });
|
|
565
|
+
return undefined;
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
static addNoteToLatestConversation = async (
|
|
570
|
+
spiffyUserId: string,
|
|
571
|
+
email: string,
|
|
572
|
+
customerServiceProvider: CustomerServiceProvider
|
|
573
|
+
) => {
|
|
574
|
+
Logger.logInfo(
|
|
575
|
+
`addNoteToLatestConversation - user_id=${spiffyUserId} email=${email} customer_service_provider=${customerServiceProvider}`
|
|
576
|
+
);
|
|
577
|
+
try {
|
|
578
|
+
await CommerceApiClient.getInstance().customerServiceApi.v1CustserviceAddNoteToLatestConversationPost(
|
|
579
|
+
{
|
|
580
|
+
AddNoteToLatestConversationRequest: {
|
|
581
|
+
spiffy_user_id: spiffyUserId,
|
|
582
|
+
email,
|
|
583
|
+
customer_service_provider: customerServiceProvider,
|
|
584
|
+
},
|
|
585
|
+
}
|
|
586
|
+
);
|
|
587
|
+
} catch (err) {
|
|
588
|
+
Logger.logError("Failed to add note to latest conversation", { err });
|
|
589
|
+
}
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
static getCustomerServiceApi = () =>
|
|
593
|
+
CommerceApiClient.getInstance().customerServiceApi;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export default CommerceApiClient;
|