@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.
Files changed (385) hide show
  1. package/LICENSE +2 -0
  2. package/README.md +2 -0
  3. package/dist/GridInsertionService-CEYo9pGj.js +22 -0
  4. package/dist/GridInsertionService-CS_bnPh0.cjs +28 -0
  5. package/dist/bandolier-Ble8jEa8.js +1221 -0
  6. package/dist/bandolier-Bm2xAt_j.cjs +1221 -0
  7. package/dist/carpe-Da7b-LCW.cjs +599 -0
  8. package/dist/carpe-W13mhRRP.js +597 -0
  9. package/dist/cdnService-CZ-aXcY6.cjs +23 -0
  10. package/dist/cdnService-zQfKk3Eb.js +18 -0
  11. package/dist/chatElementDisplayLocation-CX8fuNao.d.cts +239 -0
  12. package/dist/chatElementDisplayLocation-CwptS9tx.d.ts +239 -0
  13. package/dist/chunk-CUT6urMc.cjs +30 -0
  14. package/dist/contexts/index.cjs +13 -0
  15. package/dist/contexts/index.d.cts +65 -0
  16. package/dist/contexts/index.d.ts +66 -0
  17. package/dist/contexts/index.js +7 -0
  18. package/dist/contexts-BRjfVq_k.js +5064 -0
  19. package/dist/contexts-BYArqZtK.cjs +5164 -0
  20. package/dist/coterie-3y0D9ko4.cjs +229 -0
  21. package/dist/coterie-DOWcJAYv.js +229 -0
  22. package/dist/custservice-types-CFIFwZ-r.js +10 -0
  23. package/dist/custservice-types-CkfxZiHY.cjs +16 -0
  24. package/dist/default-C2fEZKXk.js +175 -0
  25. package/dist/default-CBUq6Q6G.cjs +4 -0
  26. package/dist/default-CGIFZK6m.js +4 -0
  27. package/dist/default-D_KPZdPJ.cjs +198 -0
  28. package/dist/divIds-Bss-btao.js +49 -0
  29. package/dist/divIds-DnZNd7rA.cjs +223 -0
  30. package/dist/dreamlandBaby-DCIsuU9R.cjs +338 -0
  31. package/dist/dreamlandBaby-DvSaZGrz.js +338 -0
  32. package/dist/entrypoints-D_JUvkgy.cjs +18 -0
  33. package/dist/entrypoints-YLQsbBRD.js +6 -0
  34. package/dist/enviveConfigContext-CUGLpPGU.js +34 -0
  35. package/dist/enviveConfigContext-Dfr2VH6u.cjs +48 -0
  36. package/dist/fiveCbd-B1SESMCO.js +605 -0
  37. package/dist/fiveCbd-CkOlVby_.cjs +605 -0
  38. package/dist/forLoveAndLemons-CfYPMnKS.cjs +660 -0
  39. package/dist/forLoveAndLemons-DmwYZIk0.js +658 -0
  40. package/dist/greenpan-Bsl3ir59.cjs +389 -0
  41. package/dist/greenpan-BtOi45lf.js +389 -0
  42. package/dist/grooveLife-6_dtYsRk.js +334 -0
  43. package/dist/grooveLife-Cmm1PSCL.cjs +334 -0
  44. package/dist/homegrownCannabis-C-kw-74X.js +400 -0
  45. package/dist/homegrownCannabis-CO0uY_mp.cjs +400 -0
  46. package/dist/hooks/index.cjs +16 -0
  47. package/dist/hooks/index.d.cts +357 -0
  48. package/dist/hooks/index.d.ts +357 -0
  49. package/dist/hooks/index.js +7 -0
  50. package/dist/jackArcher-CLVmwwpI.js +719 -0
  51. package/dist/jackArcher-DdYTIzAV.cjs +719 -0
  52. package/dist/jordanCraig-Am-Oor-O.js +1778 -0
  53. package/dist/jordanCraig-_u3-w4Hp.cjs +1778 -0
  54. package/dist/kindredBravely-CWovIDSc.cjs +482 -0
  55. package/dist/kindredBravely-eWp-ud_E.js +482 -0
  56. package/dist/kutFromTheKloth-BMV4BuGQ.js +361 -0
  57. package/dist/kutFromTheKloth-Q589bAOC.cjs +361 -0
  58. package/dist/larryAndSerges-BMUlTgI-.js +252 -0
  59. package/dist/larryAndSerges-CEau764j.cjs +252 -0
  60. package/dist/leapsAndRebounds-DGMzPO7T.js +352 -0
  61. package/dist/leapsAndRebounds-DHAtRTJD.cjs +352 -0
  62. package/dist/logger-Dln20ans.cjs +25 -0
  63. package/dist/logger-pdEEY8T2.js +19 -0
  64. package/dist/longevityrx-CZW8Hxzi.cjs +312 -0
  65. package/dist/longevityrx-jH2JLhNH.js +312 -0
  66. package/dist/lookOptic-BGXP5P_V.js +274 -0
  67. package/dist/lookOptic-CA6RwLbG.cjs +274 -0
  68. package/dist/mantraBrand-Cm9_PBCT.js +742 -0
  69. package/dist/mantraBrand-DByNqpnL.cjs +742 -0
  70. package/dist/medterra-B0wxj_PV.js +575 -0
  71. package/dist/medterra-DnPN2ksU.cjs +575 -0
  72. package/dist/modells-Bmz8Ag5M.js +476 -0
  73. package/dist/modells-CoYgkLSp.cjs +476 -0
  74. package/dist/models-DHdb7QWn.js +51 -0
  75. package/dist/models-ixxUsGL_.cjs +69 -0
  76. package/dist/pressedFloral-DSKs_oVG.js +653 -0
  77. package/dist/pressedFloral-DjBiSoUl.cjs +653 -0
  78. package/dist/skinPerfection-B_3xzVNS.cjs +326 -0
  79. package/dist/skinPerfection-IDrBuAPt.js +326 -0
  80. package/dist/snapSupplements-BJk5T5ba.js +277 -0
  81. package/dist/snapSupplements-BStTsdOZ.cjs +277 -0
  82. package/dist/socialProofClasses-Bhv2Vulz.js +9 -0
  83. package/dist/socialProofClasses-CrQBWdSA.cjs +39 -0
  84. package/dist/spanx-BYg0LE7R.js +653 -0
  85. package/dist/spanx-LwU1zSzq.cjs +655 -0
  86. package/dist/spanxStaging-CfSmuKYB.js +837 -0
  87. package/dist/spanxStaging-OZLV9qix.cjs +840 -0
  88. package/dist/suggestionBarV2-types-BllzwsBD.js +34 -0
  89. package/dist/suggestionBarV2-types-CaovchMP.cjs +46 -0
  90. package/dist/supergoop-BqPXDnKk.cjs +327 -0
  91. package/dist/supergoop-CIlrHND_.js +325 -0
  92. package/dist/types-C4T5UOIW.cjs +230 -0
  93. package/dist/types-CYNvLeSA.js +176 -0
  94. package/dist/uniqueVintage-B30mOqbH.cjs +1205 -0
  95. package/dist/uniqueVintage-CFueJOhO.js +1203 -0
  96. package/dist/venaCbd-DHGZy49P.cjs +357 -0
  97. package/dist/venaCbd-T0CqVD4k.js +357 -0
  98. package/dist/westonJonBoucher-BdMzs_Yg.cjs +414 -0
  99. package/dist/westonJonBoucher-b4TCQ4ev.js +414 -0
  100. package/dist/wineEnthusiast-BLGlOjgr.cjs +932 -0
  101. package/dist/wineEnthusiast-BqR0i_54.js +932 -0
  102. package/dist/wolfMattress-CyyO-LoC.js +362 -0
  103. package/dist/wolfMattress-DNGZOivg.cjs +362 -0
  104. package/dist/wolfTactical-3Mm2fvVF.js +341 -0
  105. package/dist/wolfTactical-BmXYlFjr.cjs +341 -0
  106. package/package.json +66 -0
  107. package/src/adapters/amplitude/amplitudeAdapter.ts +454 -0
  108. package/src/adapters/amplitude/index.ts +2 -0
  109. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +34 -0
  110. package/src/adapters/spiffy/commerce/api.ts +596 -0
  111. package/src/adapters/spiffy/commerce/exceptions/sessionExceptions.ts +6 -0
  112. package/src/adapters/spiffy/commerce/exceptions/unsupportedProductExceptions.ts +6 -0
  113. package/src/adapters/spiffy/commerce/graphql.ts +184 -0
  114. package/src/application/config/generalStaticConfig.ts +37 -0
  115. package/src/application/logging/logger.ts +29 -0
  116. package/src/application/models/api/context.ts +4 -0
  117. package/src/application/models/api/generationParams.ts +4 -0
  118. package/src/application/models/api/nextMessageRequest.ts +11 -0
  119. package/src/application/models/api/orgAnalyticsConfig.ts +19 -0
  120. package/src/application/models/api/orgConfigResults.ts +40 -0
  121. package/src/application/models/api/organizationConfig.ts +12 -0
  122. package/src/application/models/api/response.ts +132 -0
  123. package/src/application/models/api/responseGenerics.ts +67 -0
  124. package/src/application/models/api/search.ts +26 -0
  125. package/src/application/models/api/suggestion.ts +4 -0
  126. package/src/application/models/api/supportedEventRequest.ts +8 -0
  127. package/src/application/models/api/userEvent.ts +101 -0
  128. package/src/application/models/cachedValue.ts +8 -0
  129. package/src/application/models/chatElementDisplayLocation.ts +22 -0
  130. package/src/application/models/clientDetails.ts +18 -0
  131. package/src/application/models/colorsConfig.ts +28 -0
  132. package/src/application/models/conversationalSearchIds.ts +5 -0
  133. package/src/application/models/dataLayer.ts +45 -0
  134. package/src/application/models/domMutationContinuation.ts +7 -0
  135. package/src/application/models/domObservationStrategy.ts +9 -0
  136. package/src/application/models/events.ts +5 -0
  137. package/src/application/models/featureGates.ts +23 -0
  138. package/src/application/models/frontendConfig.ts +14 -0
  139. package/src/application/models/googleAnalyticsEvents.ts +8 -0
  140. package/src/application/models/graphql/index.ts +2 -0
  141. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +37 -0
  142. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +103 -0
  143. package/src/application/models/graphql/queries/getMerchantOrgIdQuery.ts +11 -0
  144. package/src/application/models/guards/api/index.ts +12 -0
  145. package/src/application/models/guards/api/isApiFormResponse.ts +90 -0
  146. package/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts +37 -0
  147. package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +155 -0
  148. package/src/application/models/guards/api/isApiOrgConfigResults.ts +277 -0
  149. package/src/application/models/guards/api/isApiOrganizationConfig.ts +207 -0
  150. package/src/application/models/guards/api/isApiPDPEventAttributes.ts +21 -0
  151. package/src/application/models/guards/api/isApiPLPEventAttributes.ts +41 -0
  152. package/src/application/models/guards/api/isApiPageResponseAttributes.ts +21 -0
  153. package/src/application/models/guards/api/isApiProductResponseAttributes.ts +85 -0
  154. package/src/application/models/guards/api/isApiProductSearchAttributes.ts +23 -0
  155. package/src/application/models/guards/api/isApiProductSearchFilterAttributes.ts +15 -0
  156. package/src/application/models/guards/api/isApiQueryTypedEventAttributes.ts +4 -0
  157. package/src/application/models/guards/api/isApiResponse.ts +39 -0
  158. package/src/application/models/guards/api/isApiReviewResponseAttributes.ts +30 -0
  159. package/src/application/models/guards/api/isApiReviewRichInformation.ts +37 -0
  160. package/src/application/models/guards/api/isApiSearchEventAttributes.ts +28 -0
  161. package/src/application/models/guards/api/isApiSuggestion.ts +36 -0
  162. package/src/application/models/guards/api/isApiSuggestionClickedEventAttributes.ts +9 -0
  163. package/src/application/models/guards/api/isApiTextResponseAttributes.ts +9 -0
  164. package/src/application/models/guards/api/isApiUserEvent.ts +25 -0
  165. package/src/application/models/guards/graphQL/isGraphQLColorsConfig.ts +50 -0
  166. package/src/application/models/guards/isBaseEcommerceEvent.ts +17 -0
  167. package/src/application/models/guards/isGA4EcommerceEvent.ts +17 -0
  168. package/src/application/models/guards/isLegacyUAEcommerceEvent.ts +17 -0
  169. package/src/application/models/guards/isMobilePLPChatPlacementParameter.ts +11 -0
  170. package/src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts +4 -0
  171. package/src/application/models/guards/isVariantInfo.ts +37 -0
  172. package/src/application/models/guards/utils.ts +43 -0
  173. package/src/application/models/index.ts +20 -0
  174. package/src/application/models/localStorageEventListener.ts +4 -0
  175. package/src/application/models/message.ts +146 -0
  176. package/src/application/models/mobilePLPChatPlacementParameter.ts +3 -0
  177. package/src/application/models/orgsEnum.ts +36 -0
  178. package/src/application/models/productExperiment.ts +5 -0
  179. package/src/application/models/spanxTakeAQuizCtaParameter.ts +4 -0
  180. package/src/application/models/spiffyWidgets.ts +16 -0
  181. package/src/application/models/supportedOrgs.ts +137 -0
  182. package/src/application/models/utilityTypes/camelCase.ts +87 -0
  183. package/src/application/models/utilityTypes/camelCasedPropertiesDeep.ts +80 -0
  184. package/src/application/models/utilityTypes/delimiterCase.ts +121 -0
  185. package/src/application/models/utilityTypes/delimiterCasedPropertiesDeep.ts +98 -0
  186. package/src/application/models/utilityTypes/index.ts +1 -0
  187. package/src/application/models/utilityTypes/internal.ts +93 -0
  188. package/src/application/models/utilityTypes/primitive.ts +8 -0
  189. package/src/application/models/utilityTypes/snakeCasedPropertiesDeep.ts +49 -0
  190. package/src/application/models/utilityTypes/splitWords.ts +76 -0
  191. package/src/application/models/utilityTypes/trim.ts +28 -0
  192. package/src/application/models/utilityTypes/unknownArray.ts +25 -0
  193. package/src/application/models/utils/snakeToCamelTransformer.ts +90 -0
  194. package/src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts +68 -0
  195. package/src/application/models/validators/validateGraphQLColorsConfig.ts +29 -0
  196. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +594 -0
  197. package/src/application/models/validators/validateGraphQLOrgId.ts +7 -0
  198. package/src/application/models/validators/validateMobilePLPChatPlacementParameter.ts +14 -0
  199. package/src/application/models/validators/validateOrgConfigResults.ts +47 -0
  200. package/src/application/models/validators/validateOrganizationConfig.ts +37 -0
  201. package/src/application/models/validators/validateResponse.ts +187 -0
  202. package/src/application/models/validators/validateSuggestion.ts +16 -0
  203. package/src/application/models/validators/validateUserEvent.ts +110 -0
  204. package/src/application/models/variantInfo/index.ts +1 -0
  205. package/src/application/models/variantInfo/pageVisitInfo.ts +6 -0
  206. package/src/application/models/variantInfo/plpInfo.ts +3 -0
  207. package/src/application/models/variantInfo/productInfo.ts +5 -0
  208. package/src/application/models/variantInfo/variantInfo.ts +23 -0
  209. package/src/application/service/cachingService.ts +84 -0
  210. package/src/application/service/cdnService.ts +18 -0
  211. package/src/application/service/customerService/index.ts +8 -0
  212. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +15 -0
  213. package/src/application/service/customerService/types.ts +31 -0
  214. package/src/application/service/domMutationObserver.ts +320 -0
  215. package/src/application/service/domMutations/GridInsertionService.ts +123 -0
  216. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +99 -0
  217. package/src/application/service/domMutations/domInsertionService.ts +90 -0
  218. package/src/application/service/domMutations/domMutationListener.ts +15 -0
  219. package/src/application/service/domMutations/domMutationListenerState.ts +52 -0
  220. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +41 -0
  221. package/src/application/service/domMutations/gladly/gladlyListener.ts +61 -0
  222. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +41 -0
  223. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +119 -0
  224. package/src/application/service/environmentService.ts +51 -0
  225. package/src/application/service/featureFlagService.ts +130 -0
  226. package/src/application/service/kustomerIntegrationService.ts +111 -0
  227. package/src/application/service/localStorageService.ts +77 -0
  228. package/src/application/service/pageVariantService.ts +779 -0
  229. package/src/application/service/searchService.ts +140 -0
  230. package/src/application/service/sessionStorageService.ts +27 -0
  231. package/src/application/service/shopifyUrlService.ts +63 -0
  232. package/src/application/service/userIdentityService.ts +114 -0
  233. package/src/application/service/windowChatToggleService.ts +71 -0
  234. package/src/application/service/windowDataLayerService.ts +181 -0
  235. package/src/application/service/windowFrontendConfigService.ts +104 -0
  236. package/src/application/utils/__tests__/divideArrays.test.ts +14 -0
  237. package/src/application/utils/analyticsUtils.ts +110 -0
  238. package/src/application/utils/coreContextToApiContext.ts +11 -0
  239. package/src/application/utils/coreUserEventToApiUserEvent.ts +106 -0
  240. package/src/application/utils/divideArray.ts +7 -0
  241. package/src/application/utils/domObserver.ts +96 -0
  242. package/src/application/utils/elementObserver.ts +246 -0
  243. package/src/application/utils/imageFilter.ts +12 -0
  244. package/src/application/utils/index.ts +3 -0
  245. package/src/application/utils/merchantUtils.ts +16 -0
  246. package/src/application/utils/messageFromFormSubmittedEvent.ts +31 -0
  247. package/src/application/utils/messageFromQueryEvent.ts +38 -0
  248. package/src/application/utils/messageFromResponse.ts +133 -0
  249. package/src/application/utils/messageFromSuggestionEvent.ts +32 -0
  250. package/src/application/utils/mouseEventTypes.ts +1 -0
  251. package/src/application/utils/mutationHelper.ts +51 -0
  252. package/src/application/utils/nextMessageRequestToApiRequest.ts +31 -0
  253. package/src/application/utils/nodeSelector.ts +133 -0
  254. package/src/application/utils/overrides.ts +196 -0
  255. package/src/application/utils/stringUtils.ts +55 -0
  256. package/src/application/utils/supportedEventRequestToApiRequest.ts +12 -0
  257. package/src/application/utils/urlsParser.ts +53 -0
  258. package/src/application/utils/validation.ts +5 -0
  259. package/src/atoms/app/index.ts +57 -0
  260. package/src/atoms/app/variant.ts +261 -0
  261. package/src/atoms/atomStore.ts +34 -0
  262. package/src/atoms/chat/chatState.ts +44 -0
  263. package/src/atoms/chat/form.ts +19 -0
  264. package/src/atoms/chat/index.ts +38 -0
  265. package/src/atoms/chat/lastMessage.ts +11 -0
  266. package/src/atoms/chat/messageQueue.ts +65 -0
  267. package/src/atoms/chat/performanceMetrics.ts +84 -0
  268. package/src/atoms/chat/renderedWidgetRefs.ts +28 -0
  269. package/src/atoms/chat/replies.ts +51 -0
  270. package/src/atoms/chat/suggestions.ts +36 -0
  271. package/src/atoms/globalSearch.ts +12 -0
  272. package/src/atoms/index.ts +5 -0
  273. package/src/atoms/org/customerService.ts +13 -0
  274. package/src/atoms/org/graphqlConfig.ts +27 -0
  275. package/src/atoms/org/index.ts +7 -0
  276. package/src/atoms/org/merchantCss.ts +44 -0
  277. package/src/atoms/org/org.ts +256 -0
  278. package/src/atoms/org/orgAnalyticsConfig.ts +28 -0
  279. package/src/atoms/org/orgPageConfig.ts +38 -0
  280. package/src/atoms/org/orgUIConfig.ts +122 -0
  281. package/src/atoms/search/chatSearch.ts +293 -0
  282. package/src/atoms/search/index.ts +2 -0
  283. package/src/atoms/search/productFilters.ts +207 -0
  284. package/src/atoms/search/productSorter.ts +23 -0
  285. package/src/atoms/search/searchAPI.ts +194 -0
  286. package/src/atoms/search/types.ts +55 -0
  287. package/src/atoms/search/utils.ts +18 -0
  288. package/src/config/divIds.ts +27 -0
  289. package/src/config/locators/components/chat/entrypoints.ts +13 -0
  290. package/src/config/locators/components/chat/index.ts +23 -0
  291. package/src/config/locators/components/chat/preview.ts +13 -0
  292. package/src/config/locators/components/chat/variants/index.ts +16 -0
  293. package/src/config/locators/components/common/buttons.ts +6 -0
  294. package/src/config/locators/components/common/cards.ts +18 -0
  295. package/src/config/locators/components/common/links.ts +1 -0
  296. package/src/config/locators/components/common/tables.ts +2 -0
  297. package/src/config/locators/components/floating-button.ts +2 -0
  298. package/src/config/locators/components/index.ts +3 -0
  299. package/src/config/locators/components/report-issue.ts +21 -0
  300. package/src/config/locators/components/search/index.ts +5 -0
  301. package/src/config/locators/components/shadow-dom.ts +1 -0
  302. package/src/config/locators/embedded.ts +21 -0
  303. package/src/config/locators/index.ts +3 -0
  304. package/src/config/socialProofClasses.ts +17 -0
  305. package/src/contexts/chatContext.tsx +451 -0
  306. package/src/contexts/enviveConfigContext.tsx +70 -0
  307. package/src/contexts/index.ts +4 -0
  308. package/src/contexts/systemSettingsContext.tsx +61 -0
  309. package/src/contexts/types.ts +1059 -0
  310. package/src/enabled-features.ts +83 -0
  311. package/src/events/event-types.ts +11 -0
  312. package/src/events/index.ts +52 -0
  313. package/src/events/registerAnalyticsListeners.ts +49 -0
  314. package/src/extension.ts +63 -0
  315. package/src/hooks/index.ts +22 -0
  316. package/src/hooks/useBlockBackButton.ts +29 -0
  317. package/src/hooks/useChatToggle.ts +66 -0
  318. package/src/hooks/useCustomerSupportHandoff.ts +39 -0
  319. package/src/hooks/useDebounce.ts +17 -0
  320. package/src/hooks/useDynamicVariants.ts +210 -0
  321. package/src/hooks/useElementObserver.ts +245 -0
  322. package/src/hooks/useFileUpload.ts +61 -0
  323. package/src/hooks/useGrabAndScroll.ts +133 -0
  324. package/src/hooks/useHideElements.ts +82 -0
  325. package/src/hooks/useHorizontalScrollAnimation.ts +115 -0
  326. package/src/hooks/useImageResolver.ts +51 -0
  327. package/src/hooks/useIntersection.ts +28 -0
  328. package/src/hooks/useIsSmallScreen.ts +23 -0
  329. package/src/hooks/useMessageFilter.ts +49 -0
  330. package/src/hooks/useMessageScrollObserver.ts +47 -0
  331. package/src/hooks/useReducedMotionWithOverride.ts +15 -0
  332. package/src/hooks/useSearch.tsx +433 -0
  333. package/src/hooks/useSnapCalculator.ts +38 -0
  334. package/src/hooks/useSnapControl.ts +155 -0
  335. package/src/hooks/useSystemSettingsContext.ts +12 -0
  336. package/src/hooks/useTrackComponentVisibleEvent.ts +52 -0
  337. package/src/hooks/useUpdateAnalyticsProps.ts +56 -0
  338. package/src/hooks/utils.ts +153 -0
  339. package/src/index.ts +31 -0
  340. package/src/initialize.ts +163 -0
  341. package/src/interceptors/types.ts +6 -0
  342. package/src/interceptors/useFormEscalation.ts +40 -0
  343. package/src/interceptors/useMessageInterceptor.ts +32 -0
  344. package/src/main.ts +85 -0
  345. package/src/main.tsx +123 -0
  346. package/src/merchants/bandolier/bandolier.ts +1389 -0
  347. package/src/merchants/carpe/carpe.ts +656 -0
  348. package/src/merchants/coterie/coterie.ts +280 -0
  349. package/src/merchants/default.ts +193 -0
  350. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +375 -0
  351. package/src/merchants/fiveCbd/fiveCbd.ts +697 -0
  352. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +721 -0
  353. package/src/merchants/greenpan/greenpan.ts +440 -0
  354. package/src/merchants/grooveLife/grooveLife.ts +386 -0
  355. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +468 -0
  356. package/src/merchants/init-merchant.sh +53 -0
  357. package/src/merchants/jackArcher/jackArcher.ts +974 -0
  358. package/src/merchants/jordanCraig/jordanCraig.ts +1927 -0
  359. package/src/merchants/kindredBravely/kindredBravely.ts +529 -0
  360. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +418 -0
  361. package/src/merchants/larryAndSerges/larryAndSerges.ts +314 -0
  362. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +424 -0
  363. package/src/merchants/longevityrx/longevityrx.ts +368 -0
  364. package/src/merchants/lookOptic/lookOptic.ts +323 -0
  365. package/src/merchants/mantraBrand/mantraBrand.ts +838 -0
  366. package/src/merchants/medterra/medterra.ts +670 -0
  367. package/src/merchants/modells/modells.ts +546 -0
  368. package/src/merchants/pressedFloral/pressedFloral.ts +734 -0
  369. package/src/merchants/skinPerfection/skinPerfection.ts +379 -0
  370. package/src/merchants/snapSupplements/snapSupplements.ts +325 -0
  371. package/src/merchants/spanx/spanx.ts +810 -0
  372. package/src/merchants/spanx/spanxStaging.ts +942 -0
  373. package/src/merchants/supergoop/supergoop.ts +376 -0
  374. package/src/merchants/uniqueVintage/uniqueVintage.ts +1314 -0
  375. package/src/merchants/uniqueVintage/views/useUniqueVintageChatSearch.ts +147 -0
  376. package/src/merchants/venaCbd/venaCbd.ts +410 -0
  377. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +473 -0
  378. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +990 -0
  379. package/src/merchants/wolfMattress/wolfMattress.ts +411 -0
  380. package/src/merchants/wolfTactical/wolfTactical.ts +389 -0
  381. package/src/types/custservice-types.ts +28 -0
  382. package/src/types/search-filter-types.ts +111 -0
  383. package/src/types/suggestionBarV2-types.ts +4 -0
  384. package/src/types/test-types.ts +3 -0
  385. 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,5 @@
1
+ export * from "./atomStore";
2
+ export * from "./app";
3
+ export * from "./chat";
4
+ export * from "./org";
5
+ export * from "./search";
@@ -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,7 @@
1
+ export * from './customerService';
2
+ export * from './graphqlConfig';
3
+ export * from './merchantCss';
4
+ export * from './org';
5
+ export * from './orgAnalyticsConfig';
6
+ export * from './orgPageConfig';
7
+ export * from './orgUIConfig';
@@ -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
+ );