@envive-ai/react-hooks 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/dist/amplitudeContext-CHzas7Cf.d.cts +52 -0
  2. package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
  3. package/dist/amplitudeContext-hY3caPC6.js +322 -0
  4. package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
  5. package/dist/api-DjeZXxl_.js +207 -0
  6. package/dist/api-_JaUnIUj.cjs +292 -0
  7. package/dist/app-CjsQ2_n-.js +132 -0
  8. package/dist/app-CnKRZ9RW.cjs +178 -0
  9. package/dist/application/models/graphql/index.cjs +3 -12
  10. package/dist/application/models/graphql/index.d.cts +1 -1
  11. package/dist/application/models/graphql/index.d.ts +1 -1
  12. package/dist/application/models/graphql/index.js +1 -10
  13. package/dist/application/models/guards/api/index.cjs +1 -2
  14. package/dist/application/models/guards/api/index.d.cts +2 -2
  15. package/dist/application/models/guards/api/index.d.ts +2 -2
  16. package/dist/application/models/guards/api/index.js +1 -2
  17. package/dist/application/models/index.cjs +48 -54
  18. package/dist/application/models/index.d.cts +7 -9
  19. package/dist/application/models/index.d.ts +7 -9
  20. package/dist/application/models/index.js +7 -11
  21. package/dist/application/models/utilityTypes/index.cjs +1 -1
  22. package/dist/application/models/utilityTypes/index.d.cts +1 -1
  23. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  24. package/dist/application/models/utilityTypes/index.js +1 -1
  25. package/dist/application/models/variantInfo/index.cjs +1 -1
  26. package/dist/application/models/variantInfo/index.d.cts +1 -1
  27. package/dist/application/models/variantInfo/index.d.ts +1 -1
  28. package/dist/application/models/variantInfo/index.js +1 -1
  29. package/dist/application/utils/index.cjs +40 -37
  30. package/dist/application/utils/index.d.cts +18 -14
  31. package/dist/application/utils/index.d.ts +19 -15
  32. package/dist/application/utils/index.js +13 -10
  33. package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
  34. package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
  35. package/dist/atoms/app/index.cjs +14 -16
  36. package/dist/atoms/app/index.d.cts +20 -19
  37. package/dist/atoms/app/index.d.ts +20 -19
  38. package/dist/atoms/app/index.js +10 -11
  39. package/dist/atoms/atomStore/index.cjs +2 -1
  40. package/dist/atoms/atomStore/index.d.cts +24 -2
  41. package/dist/atoms/atomStore/index.d.ts +24 -2
  42. package/dist/atoms/atomStore/index.js +2 -1
  43. package/dist/atoms/chat/index.cjs +44 -40
  44. package/dist/atoms/chat/index.d.cts +35 -36
  45. package/dist/atoms/chat/index.d.ts +35 -36
  46. package/dist/atoms/chat/index.js +14 -10
  47. package/dist/atoms/globalSearch/index.cjs +1 -1
  48. package/dist/atoms/globalSearch/index.d.cts +5 -5
  49. package/dist/atoms/globalSearch/index.d.ts +6 -6
  50. package/dist/atoms/globalSearch/index.js +1 -1
  51. package/dist/atoms/org/index.cjs +26 -38
  52. package/dist/atoms/org/index.d.cts +35 -48
  53. package/dist/atoms/org/index.d.ts +35 -48
  54. package/dist/atoms/org/index.js +11 -11
  55. package/dist/atoms/search/index.cjs +47 -41
  56. package/dist/atoms/search/index.d.cts +7 -9
  57. package/dist/atoms/search/index.d.ts +7 -9
  58. package/dist/atoms/search/index.js +16 -10
  59. package/dist/bandolier-DYEz4-8C.js +1229 -0
  60. package/dist/bandolier-o_-xrbOV.cjs +1229 -0
  61. package/dist/carpe-CsG5jCcl.cjs +607 -0
  62. package/dist/carpe-DONk00bZ.js +605 -0
  63. package/dist/cdnUtils-32v8bDX9.cjs +16 -0
  64. package/dist/cdnUtils-E4tLBt2g.js +11 -0
  65. package/dist/{chat-_NzpO_Hn.cjs → chat-BubCW1as.cjs} +1 -1
  66. package/dist/chat-CO7cRkaq.cjs +506 -0
  67. package/dist/{chat-CHmD79E1.js → chat-CV6MXeID.js} +1 -1
  68. package/dist/chat-hcRc4RRd.js +285 -0
  69. package/dist/{components-Dl-TMD9k.js → components-B4T3Uzth.js} +1 -1
  70. package/dist/{components-D0XDRcaN.cjs → components-Cw9WjA6g.cjs} +1 -1
  71. package/dist/config/locators/components/chat/index.cjs +1 -1
  72. package/dist/config/locators/components/chat/index.d.cts +1 -1
  73. package/dist/config/locators/components/chat/index.d.ts +1 -1
  74. package/dist/config/locators/components/chat/index.js +1 -1
  75. package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
  76. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  77. package/dist/config/locators/components/index.cjs +1 -1
  78. package/dist/config/locators/components/index.d.cts +1 -1
  79. package/dist/config/locators/components/index.d.ts +1 -1
  80. package/dist/config/locators/components/index.js +1 -1
  81. package/dist/config/locators/components/search/index.d.ts +1 -1
  82. package/dist/config/locators/index.cjs +4 -4
  83. package/dist/config/locators/index.d.cts +2 -2
  84. package/dist/config/locators/index.d.ts +2 -2
  85. package/dist/config/locators/index.js +4 -4
  86. package/dist/contexts/index.cjs +45 -14
  87. package/dist/contexts/index.d.cts +10 -10
  88. package/dist/contexts/index.d.ts +10 -10
  89. package/dist/contexts/index.js +22 -11
  90. package/dist/contexts-B4ihTBsV.cjs +2980 -0
  91. package/dist/contexts-DGlr7M1o.js +2596 -0
  92. package/dist/coterie-CKB93qfz.cjs +239 -0
  93. package/dist/{coterie--MGvWeVh.cjs → coterie-DHcj2fRE.js} +64 -65
  94. package/dist/{custservice-types-C8-9vKWb.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
  95. package/dist/{custservice-types-CamCiXjq.js → custservice-types-mnIunabv.js} +1 -1
  96. package/dist/default-BnB4p0Se.cjs +234 -0
  97. package/dist/default-D6f5Dyt7.js +199 -0
  98. package/dist/default-ZKkE5zT4.cjs +4 -0
  99. package/dist/default-legGZJwI.js +4 -0
  100. package/dist/{divIds-CjceLRD9.cjs → divIds-2dJlU3z8.cjs} +1 -15
  101. package/dist/{divIds-0Vj9g-fM.js → divIds-BUrN2vY-.js} +2 -4
  102. package/dist/dreamlandBaby-BiRYYFav.js +346 -0
  103. package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
  104. package/dist/{embedded-_cLpd6FK.js → embedded-BJLWIriJ.js} +1 -1
  105. package/dist/{embedded-B5Wi9g0T.cjs → embedded-Dl79TJLC.cjs} +1 -1
  106. package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
  107. package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
  108. package/dist/enviveConfig-BccuzS2a.cjs +240 -0
  109. package/dist/enviveConfig-CzhTz8Aa.js +152 -0
  110. package/dist/events/index.cjs +1 -1
  111. package/dist/events/index.js +1 -1
  112. package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
  113. package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
  114. package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
  115. package/dist/fiveCbd-Dz2NouOF.js +613 -0
  116. package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
  117. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
  118. package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
  119. package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
  120. package/dist/graphql-BNW60InJ.cjs +128 -0
  121. package/dist/graphql-CjB8wHzm.js +74 -0
  122. package/dist/graphqlConfig-CYt6tWII.js +30 -0
  123. package/dist/graphqlConfig-DicykC-o.cjs +61 -0
  124. package/dist/greenpan-B_EbPkSP.js +397 -0
  125. package/dist/greenpan-kPE4fJgd.cjs +397 -0
  126. package/dist/grooveLife-Ckuir319.js +342 -0
  127. package/dist/grooveLife-DKSEQp1F.cjs +342 -0
  128. package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
  129. package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
  130. package/dist/hooks/index.cjs +39 -13
  131. package/dist/hooks/index.d.cts +127 -45
  132. package/dist/hooks/index.d.ts +124 -42
  133. package/dist/hooks/index.js +22 -11
  134. package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
  135. package/dist/{index-BdNKc2ix.d.cts → index-BDPWBU3h.d.cts} +1 -1
  136. package/dist/index-BMPtlgac.d.ts +191 -0
  137. package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
  138. package/dist/{index-BrXuc_Ck.d.cts → index-Byb45OPg.d.cts} +1 -1
  139. package/dist/{index-CSIOQD-A.d.ts → index-C6KdON7d.d.ts} +1 -1
  140. package/dist/index-C7pGDl1A.d.ts +1609 -0
  141. package/dist/{index-K2kNsOTw.d.cts → index-C9lgsCWp.d.cts} +32 -32
  142. package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
  143. package/dist/{index-CbJZOEU4.d.ts → index-Cc-wBCn6.d.ts} +32 -32
  144. package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
  145. package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
  146. package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
  147. package/dist/{index-Cr2y08f1.d.ts → index-DOii3C6b.d.ts} +1 -1
  148. package/dist/index-DTu2X-YS.d.cts +1609 -0
  149. package/dist/index-OEifcBsm.d.cts +191 -0
  150. package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
  151. package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
  152. package/dist/interceptors/index.cjs +2 -12
  153. package/dist/interceptors/index.d.cts +8 -13
  154. package/dist/interceptors/index.d.ts +8 -13
  155. package/dist/interceptors/index.js +2 -11
  156. package/dist/jackArcher-B39OEIj6.cjs +727 -0
  157. package/dist/{jackArcher-sO9EbgrZ.js → jackArcher-BwkWGybC.js} +24 -25
  158. package/dist/jordanCraig-CxRH_jLi.js +1786 -0
  159. package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
  160. package/dist/kindredBravely-D78VwL20.cjs +490 -0
  161. package/dist/kindredBravely-DQDpAzdl.js +490 -0
  162. package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
  163. package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
  164. package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
  165. package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
  166. package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
  167. package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
  168. package/dist/longevityrx-DdV3v26F.cjs +320 -0
  169. package/dist/longevityrx-DfPDfvAt.js +320 -0
  170. package/dist/lookOptic-DgXFGBPP.cjs +282 -0
  171. package/dist/{lookOptic-Jwf7EAU8.js → lookOptic-FgVW1afF.js} +19 -20
  172. package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
  173. package/dist/{mantraBrand-DoaVj837.js → mantraBrand-uV8HCDR8.js} +22 -23
  174. package/dist/medterra-BtDpr1Hw.cjs +583 -0
  175. package/dist/medterra-DgzE7-mj.js +583 -0
  176. package/dist/modells-CJjsxOIR.js +484 -0
  177. package/dist/modells-Ck5KbRFj.cjs +484 -0
  178. package/dist/models-BkXg5eIP.cjs +1534 -0
  179. package/dist/models-UZ6HszfZ.js +1281 -0
  180. package/dist/{nodeSelector-DybpVr-i.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
  181. package/dist/{nodeSelector-vKB44CDB.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
  182. package/dist/org-C2RrBVQR.cjs +81 -0
  183. package/dist/org-xMytX--e.js +38 -0
  184. package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
  185. package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
  186. package/dist/pressedFloral-Bteoboms.js +661 -0
  187. package/dist/pressedFloral-CexgV-xy.cjs +661 -0
  188. package/dist/search-BMOAmrmY.js +459 -0
  189. package/dist/search-Df0Ifneg.cjs +672 -0
  190. package/dist/{search-filter-types-9rTb3jMj.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
  191. package/dist/{search-filter-types-C-zZSpGo.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
  192. package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
  193. package/dist/skinPerfection-BlvcEcUE.js +334 -0
  194. package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
  195. package/dist/snapSupplements-kcsPAOm9.js +285 -0
  196. package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
  197. package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
  198. package/dist/spanx-B4WFA_rI.js +661 -0
  199. package/dist/spanx-BWoE4F8b.cjs +663 -0
  200. package/dist/spanxStaging-BOrOjhXn.js +845 -0
  201. package/dist/spanxStaging-BfdfIug4.cjs +848 -0
  202. package/dist/{suggestionBarV2-types-Penx3Y67.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
  203. package/dist/{suggestionBarV2-types-B3lwrENK.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
  204. package/dist/supergoop-22dd5_BS.js +323 -0
  205. package/dist/supergoop-B-a4cku2.cjs +323 -0
  206. package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
  207. package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
  208. package/dist/types/index.cjs +2 -2
  209. package/dist/types/index.d.cts +2 -2
  210. package/dist/types/index.d.ts +2 -2
  211. package/dist/types/index.js +2 -2
  212. package/dist/types--pr1GQQx.js +154 -0
  213. package/dist/types-BVSyY3Hk.cjs +196 -0
  214. package/dist/{uniqueVintage-BWkDgt1z.js → uniqueVintage-CJXiNNe7.js} +19 -20
  215. package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
  216. package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
  217. package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
  218. package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
  219. package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
  220. package/dist/utils-C9ZSCx12.js +888 -0
  221. package/dist/utils-D5HO61hG.cjs +1016 -0
  222. package/dist/variantInfo-DbVxA1yE.js +1 -0
  223. package/dist/variantInfo-orXoPBCU.cjs +0 -0
  224. package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
  225. package/dist/venaCbd-CanovPS_.js +365 -0
  226. package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
  227. package/dist/{westonJonBoucher-BAGXegsX.js → westonJonBoucher-BUu1_wP1.js} +19 -20
  228. package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
  229. package/dist/{wineEnthusiast-EJbhMeKQ.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
  230. package/dist/wolfMattress-D9Mjq-HP.js +372 -0
  231. package/dist/wolfMattress-JssghhC-.cjs +372 -0
  232. package/dist/wolfTactical-C6exYhL7.cjs +349 -0
  233. package/dist/wolfTactical-CnV3KQdI.js +349 -0
  234. package/package.json +100 -19
  235. package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
  236. package/src/application/models/colorsConfig.ts +18 -18
  237. package/src/application/models/frontendConfig.ts +3 -3
  238. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
  239. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
  240. package/src/application/models/index.ts +0 -2
  241. package/src/application/models/localStorageEventListener.ts +2 -2
  242. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  243. package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
  244. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
  245. package/src/application/utils/analyticsUtils.ts +53 -22
  246. package/src/application/utils/cdnUtils.ts +11 -0
  247. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
  248. package/src/atoms/app/index.ts +7 -17
  249. package/src/atoms/app/variant.ts +13 -4
  250. package/src/atoms/chat/chatState.ts +28 -18
  251. package/src/atoms/chat/messageQueue.ts +36 -5
  252. package/src/atoms/chat/replies.ts +45 -37
  253. package/src/atoms/envive/enviveConfig.ts +10 -6
  254. package/src/atoms/org/graphqlConfig.ts +7 -1
  255. package/src/atoms/org/index.ts +3 -3
  256. package/src/atoms/org/newOrgConfigAtom.ts +8 -0
  257. package/src/atoms/org/orgPageConfig.ts +6 -5
  258. package/src/atoms/search/chatSearch.ts +11 -5
  259. package/src/atoms/search/searchAPI.ts +22 -12
  260. package/src/atoms/search/searchServiceAdapter.ts +25 -0
  261. package/src/contexts/amplitudeContext.tsx +466 -0
  262. package/src/contexts/cdnContext.tsx +48 -0
  263. package/src/contexts/chatContext.tsx +15 -12
  264. package/src/contexts/enviveConfigContext.tsx +22 -17
  265. package/src/contexts/enviveCssContext.tsx +34 -5
  266. package/src/contexts/featureFlagContext.tsx +193 -0
  267. package/src/contexts/featureFlagServiceContext.tsx +87 -0
  268. package/src/contexts/graphqlContext.tsx +165 -0
  269. package/src/contexts/index.ts +13 -3
  270. package/src/contexts/localStorageContext.tsx +159 -0
  271. package/src/contexts/newOrgConfigContext.tsx +104 -0
  272. package/src/contexts/orgConfigContext.tsx +92 -92
  273. package/src/contexts/searchContext.tsx +187 -0
  274. package/src/contexts/sessionStorageContext.tsx +80 -0
  275. package/src/contexts/shopifyUrlContext.tsx +97 -0
  276. package/src/contexts/types.ts +12 -8
  277. package/src/contexts/userIdentityContext.tsx +197 -0
  278. package/src/events/registerAnalyticsListeners.ts +32 -38
  279. package/src/hooks/index.ts +10 -4
  280. package/src/hooks/useAmplitudeOperations.ts +35 -0
  281. package/src/hooks/useAppDetails.ts +49 -0
  282. package/src/hooks/useCdnOperations.ts +16 -0
  283. package/src/hooks/useChatToggle.ts +5 -4
  284. package/src/hooks/useChatToggleAnalytics.ts +15 -0
  285. package/src/hooks/useGraphQLConfig.ts +63 -0
  286. package/src/hooks/useIdentifyUser.ts +33 -0
  287. package/src/hooks/useImageResolver.ts +7 -7
  288. package/src/hooks/useLocalStorageOperations.ts +92 -0
  289. package/src/hooks/useNewOrgConfig.ts +3 -76
  290. package/src/hooks/useSearch.tsx +21 -18
  291. package/src/hooks/useSearchOperations.ts +97 -0
  292. package/src/hooks/useSessionStorageOperations.ts +28 -0
  293. package/src/hooks/useShopifyUrlOperations.ts +45 -0
  294. package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
  295. package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
  296. package/src/interceptors/index.ts +0 -1
  297. package/src/interceptors/useMessageInterceptor.ts +5 -8
  298. package/src/merchants/bandolier/bandolier.ts +10 -28
  299. package/src/merchants/carpe/carpe.ts +5 -8
  300. package/src/merchants/coterie/coterie.ts +3 -6
  301. package/src/merchants/default.ts +73 -70
  302. package/src/merchants/domInsertion.ts +30 -0
  303. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
  304. package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
  305. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
  306. package/src/merchants/greenpan/greenpan.ts +6 -12
  307. package/src/merchants/gridInsertion.ts +19 -0
  308. package/src/merchants/grooveLife/grooveLife.ts +13 -7
  309. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
  310. package/src/merchants/jackArcher/jackArcher.ts +26 -11
  311. package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
  312. package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
  313. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
  314. package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
  315. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
  316. package/src/merchants/longevityrx/longevityrx.ts +14 -8
  317. package/src/merchants/lookOptic/lookOptic.ts +6 -6
  318. package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
  319. package/src/merchants/medterra/medterra.ts +14 -11
  320. package/src/merchants/modells/modells.ts +6 -9
  321. package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
  322. package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
  323. package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
  324. package/src/merchants/spanx/spanx.ts +6 -6
  325. package/src/merchants/spanx/spanxStaging.ts +6 -12
  326. package/src/merchants/supergoop/supergoop.ts +11 -12
  327. package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
  328. package/src/merchants/venaCbd/venaCbd.ts +6 -9
  329. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
  330. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
  331. package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
  332. package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
  333. package/src/types/config-versions.ts +6 -0
  334. package/src/types.ts +0 -53
  335. package/dist/adapters/amplitude/index.cjs +0 -14
  336. package/dist/adapters/amplitude/index.d.cts +0 -6
  337. package/dist/adapters/amplitude/index.d.ts +0 -6
  338. package/dist/adapters/amplitude/index.js +0 -12
  339. package/dist/api-B2euFL-5.cjs +0 -269
  340. package/dist/api-XRr_lAG6.js +0 -190
  341. package/dist/application/config/index.cjs +0 -43
  342. package/dist/application/config/index.d.cts +0 -15
  343. package/dist/application/config/index.d.ts +0 -15
  344. package/dist/application/config/index.js +0 -41
  345. package/dist/application/service/customerService/index.cjs +0 -4
  346. package/dist/application/service/customerService/index.d.cts +0 -3
  347. package/dist/application/service/customerService/index.d.ts +0 -3
  348. package/dist/application/service/customerService/index.js +0 -4
  349. package/dist/application/service/index.cjs +0 -42
  350. package/dist/application/service/index.d.cts +0 -413
  351. package/dist/application/service/index.d.ts +0 -413
  352. package/dist/application/service/index.js +0 -12
  353. package/dist/atomStore-ONYy0XuA.d.cts +0 -24
  354. package/dist/atomStore-kOKiEcNl.d.ts +0 -24
  355. package/dist/bandolier-Da4wt6sm.cjs +0 -1230
  356. package/dist/bandolier-DzEmYWcz.js +0 -1230
  357. package/dist/carpe-AXipz0Xl.cjs +0 -608
  358. package/dist/carpe-CaUKwcEa.js +0 -606
  359. package/dist/contexts-CtRlNXaS.js +0 -7674
  360. package/dist/contexts-CtgmnYNn.cjs +0 -9088
  361. package/dist/coterie-oKHAT0lx.js +0 -240
  362. package/dist/customerService-BG1uNZZ1.cjs +0 -36
  363. package/dist/customerService-BHQRnLhC.js +0 -23
  364. package/dist/default-B4fINY5_.cjs +0 -4
  365. package/dist/default-BrTQxA0c.js +0 -4
  366. package/dist/default-C3LrcbZB.cjs +0 -199
  367. package/dist/default-CXkYrLEr.js +0 -176
  368. package/dist/dreamlandBaby-BEqt0eKF.js +0 -347
  369. package/dist/dreamlandBaby-DBDjEJCc.cjs +0 -347
  370. package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
  371. package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
  372. package/dist/fiveCbd-CdqNt16h.cjs +0 -614
  373. package/dist/fiveCbd-D6B-sgnX.js +0 -614
  374. package/dist/forLoveAndLemons-C7GsJG7f.cjs +0 -668
  375. package/dist/forLoveAndLemons-gNDlMtPR.js +0 -666
  376. package/dist/greenpan-B5AaW4M_.js +0 -398
  377. package/dist/greenpan-DrORpYms.cjs +0 -398
  378. package/dist/grooveLife-BJqsfH2H.cjs +0 -343
  379. package/dist/grooveLife-xIUmDM8s.js +0 -343
  380. package/dist/homegrownCannabis-8TZ21u6L.cjs +0 -411
  381. package/dist/homegrownCannabis-BtMuEvbZ.js +0 -411
  382. package/dist/index-CKUpnyJQ.d.ts +0 -72
  383. package/dist/index-DFL1dIT_.d.ts +0 -7
  384. package/dist/index-DXpgMVpp.d.ts +0 -749
  385. package/dist/index-MFbPQ8Ji.d.ts +0 -95
  386. package/dist/index-VHFMGkO-.d.cts +0 -72
  387. package/dist/index-VSFakgAI.d.cts +0 -95
  388. package/dist/index-aNW5V9fh.d.cts +0 -749
  389. package/dist/index-zZjcds15.d.cts +0 -7
  390. package/dist/jackArcher-WtkbLBZj.cjs +0 -728
  391. package/dist/jordanCraig-471FcgqF.cjs +0 -1787
  392. package/dist/jordanCraig-DNOncplU.js +0 -1787
  393. package/dist/kindredBravely-BlLyHGMX.cjs +0 -491
  394. package/dist/kindredBravely-cqZ4OvXp.js +0 -491
  395. package/dist/kutFromTheKloth-3mOIryvt.cjs +0 -370
  396. package/dist/kutFromTheKloth-DtVNCMKa.js +0 -370
  397. package/dist/larryAndSerges-88Bvq-Us.cjs +0 -262
  398. package/dist/larryAndSerges-cvak6May.js +0 -262
  399. package/dist/leapsAndRebounds-Dmf8eUPq.js +0 -361
  400. package/dist/leapsAndRebounds-iWKc923H.cjs +0 -361
  401. package/dist/logger-Dln20ans.cjs +0 -26
  402. package/dist/logger-pdEEY8T2.js +0 -20
  403. package/dist/longevityrx-BTMI9vn-.js +0 -321
  404. package/dist/longevityrx-CobPyigd.cjs +0 -321
  405. package/dist/lookOptic-C4H_c0JZ.cjs +0 -283
  406. package/dist/mantraBrand-CySGqbn6.cjs +0 -751
  407. package/dist/medterra-BnZ5p27n.cjs +0 -584
  408. package/dist/medterra-DaICcPPp.js +0 -584
  409. package/dist/modells-CZ1L6dD_.js +0 -485
  410. package/dist/modells-DF0SndHr.cjs +0 -485
  411. package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
  412. package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
  413. package/dist/pressedFloral-B3t2cYzs.cjs +0 -662
  414. package/dist/pressedFloral-Dsws2Kfb.js +0 -662
  415. package/dist/skinPerfection-CILQM2bR.cjs +0 -335
  416. package/dist/skinPerfection-DmQCntRf.js +0 -335
  417. package/dist/snapSupplements--X_v0KRM.js +0 -286
  418. package/dist/snapSupplements-Djuzl0Ed.cjs +0 -286
  419. package/dist/spanx-Bo81yXSF.cjs +0 -664
  420. package/dist/spanx-DauxB8KE.js +0 -662
  421. package/dist/spanxStaging-BucYQvR1.cjs +0 -849
  422. package/dist/spanxStaging-CfXUukdP.js +0 -846
  423. package/dist/supergoop-8qa_NV3F.cjs +0 -338
  424. package/dist/supergoop-DOaui-A6.js +0 -336
  425. package/dist/types-CD4LFta-.d.cts +0 -33
  426. package/dist/types-CGC6Oozp.cjs +0 -231
  427. package/dist/types-CnTCkyvK.js +0 -177
  428. package/dist/types-DBdI0j89.d.ts +0 -33
  429. package/dist/uniqueVintage-DAne8XcL.cjs +0 -1214
  430. package/dist/variant-CC1nrywd.d.ts +0 -13
  431. package/dist/variant-CQTuQQSq.d.cts +0 -13
  432. package/dist/venaCbd-B1HO_Pkr.cjs +0 -366
  433. package/dist/venaCbd-CnByO-5R.js +0 -366
  434. package/dist/westonJonBoucher-BRfHWMbs.cjs +0 -423
  435. package/dist/wineEnthusiast-DW8JVwV8.cjs +0 -941
  436. package/dist/wolfMattress-B6INZNRJ.cjs +0 -373
  437. package/dist/wolfMattress-D9P7ErH_.js +0 -373
  438. package/dist/wolfTactical-C5Pupi3J.js +0 -350
  439. package/dist/wolfTactical-TMthZM93.cjs +0 -350
  440. package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
  441. package/src/adapters/amplitude/index.ts +0 -2
  442. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
  443. package/src/adapters/spiffy/commerce/graphql.ts +0 -219
  444. package/src/application/config/generalStaticConfig.ts +0 -40
  445. package/src/application/config/index.ts +0 -1
  446. package/src/application/models/domMutationContinuation.ts +0 -7
  447. package/src/application/models/domObservationStrategy.ts +0 -9
  448. package/src/application/service/cachingService.ts +0 -84
  449. package/src/application/service/cdnService.ts +0 -20
  450. package/src/application/service/customerService/index.ts +0 -8
  451. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
  452. package/src/application/service/domMutationObserver.ts +0 -320
  453. package/src/application/service/domMutations/GridInsertionService.ts +0 -123
  454. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
  455. package/src/application/service/domMutations/domInsertionService.ts +0 -90
  456. package/src/application/service/domMutations/domMutationListener.ts +0 -15
  457. package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
  458. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
  459. package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
  460. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
  461. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
  462. package/src/application/service/featureFlagService.ts +0 -130
  463. package/src/application/service/graphqlConfigService.ts +0 -59
  464. package/src/application/service/index.ts +0 -32
  465. package/src/application/service/kustomerIntegrationService.ts +0 -111
  466. package/src/application/service/localStorageService.ts +0 -77
  467. package/src/application/service/pageVariantService.ts +0 -866
  468. package/src/application/service/searchService.ts +0 -147
  469. package/src/application/service/sessionStorageService.ts +0 -27
  470. package/src/application/service/shopifyUrlService.ts +0 -63
  471. package/src/application/service/userIdentityService.ts +0 -114
  472. package/src/application/service/windowChatToggleService.ts +0 -80
  473. package/src/application/service/windowDataLayerService.ts +0 -181
  474. package/src/application/service/windowFrontendConfigService.ts +0 -129
  475. package/src/atoms/org/merchantCss.ts +0 -161
  476. package/src/atoms/org/org.ts +0 -251
  477. package/src/atoms/org/orgUIConfig.ts +0 -142
  478. package/src/enabled-features.ts +0 -83
  479. package/src/hooks/useDynamicVariants.ts +0 -226
  480. package/src/hooks/useFileUpload.ts +0 -63
  481. package/src/hooks/useHideElements.ts +0 -85
  482. package/src/interceptors/useFormEscalation.ts +0 -57
  483. /package/dist/{locators-DnKpajbY.js → atomStore-CZnUUsrr.js} +0 -0
  484. /package/dist/{locators-CugndTUM.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
  485. /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
  486. /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
  487. /package/dist/{variantInfo-CzhR5W6h.js → utilityTypes-8sETsYPk.js} +0 -0
  488. /package/dist/{variantInfo-CNRTY0gH.cjs → utilityTypes-COShxVir.cjs} +0 -0
  489. /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
  490. /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
  491. /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
@@ -1,6 +1,5 @@
1
1
  import React, { ReactNode } from "react";
2
- import { useAtomValue } from "jotai";
3
- import { orgMerchantCssAtom } from "src/atoms/org/merchantCss";
2
+ import { useNewOrgConfig } from "src/hooks";
4
3
 
5
4
  interface EnviveCssProviderProps {
6
5
  children: ReactNode;
@@ -9,11 +8,41 @@ interface EnviveCssProviderProps {
9
8
  export const EnviveCssProvider: React.FC<EnviveCssProviderProps> = ({
10
9
  children,
11
10
  }) => {
12
- const enviveCss = useAtomValue(orgMerchantCssAtom);
13
-
11
+ const { colorsConfig, frontendConfig, loading } = useNewOrgConfig();
12
+ let merchantThemeCss = `* {}`;
13
+ if (colorsConfig && !loading) {
14
+ merchantThemeCss = `
15
+ * {
16
+ --spiffy-colors-text-primary: ${colorsConfig.textPrimary};
17
+ --spiffy-colors-text-secondary: ${colorsConfig.textSecondary};
18
+ --spiffy-colors-text-accent: ${colorsConfig.textAccent};
19
+ --spiffy-colors-text-link: ${colorsConfig.textLink};
20
+ --spiffy-colors-text-light: ${colorsConfig.textLight};
21
+ --spiffy-colors-background-primary: ${colorsConfig.backgroundPrimary};
22
+ --spiffy-colors-background-secondary: ${colorsConfig.backgroundSecondary};
23
+ --spiffy-colors-background-secondary-dark: ${colorsConfig.backgroundSecondaryDark};
24
+ --spiffy-colors-background-tertiary: ${colorsConfig.backgroundTertiary};
25
+ --spiffy-colors-background-dark: ${colorsConfig.backgroundDark};
26
+ --spiffy-colors-background-light: ${colorsConfig.backgroundLight};
27
+ --spiffy-colors-background-saturated: ${colorsConfig.backgroundSaturated};
28
+ --spiffy-colors-border-light: ${colorsConfig.borderLight};
29
+ --spiffy-colors-border-medium: ${colorsConfig.borderMedium};
30
+ --spiffy-colors-border-dark: ${colorsConfig.borderDark};
31
+ --spiffy-colors-border-outline: ${colorsConfig.borderOutline};
32
+ --spiffy-colors-accent-primary: ${colorsConfig.accentPrimary};
33
+ --spiffy-colors-accent-secondary: ${colorsConfig.accentSecondary};
34
+ }`;
35
+ }
36
+ console.log(frontendConfig);
14
37
  return (
15
38
  <>
16
- {enviveCss && <style id="merchant-css-styles">{enviveCss}</style>}
39
+ {frontendConfig ? (
40
+ <style id="merchant-css-overrides">{`${frontendConfig.merchantOverrideCss}`}</style>
41
+ ) : null}
42
+ {colorsConfig ? (
43
+ <style id="merchant-css-colors">{`${merchantThemeCss}`}</style>
44
+ ) : null}
45
+
17
46
  {children}
18
47
  </>
19
48
  );
@@ -0,0 +1,193 @@
1
+ import React, { createContext, useContext, useCallback, useMemo } from "react";
2
+ import Logger from "src/application/logging/logger";
3
+ import { StatsigFeatureGate } from "@spiffy-ai/commerce-api-client";
4
+ import { FeatureGates } from "src/application/models/featureGates";
5
+ import { useSessionStorage } from "src/contexts/sessionStorageContext";
6
+ import { OrgConfigFeatureGate } from "src/application/models/api/orgConfigResults";
7
+ import { useEnviveConfig } from "src/contexts/enviveConfigContext";
8
+
9
+ const FEATURE_FLAGS_STORAGE_KEY = "spiffy-feature-flags";
10
+
11
+ export interface FeatureFlagContextType {
12
+ isFeatureGateEnabled: (featureGate: FeatureGates) => boolean;
13
+ isClientSessionEnabled: () => boolean;
14
+ getFeatureFlags: () => Record<string, boolean>;
15
+ persistFeatureGateOverrides: () => void;
16
+ }
17
+
18
+ const FeatureFlagContext = createContext<FeatureFlagContextType | undefined>(
19
+ undefined
20
+ );
21
+
22
+ export const FeatureFlagProvider: React.FC<{
23
+ featureGates: OrgConfigFeatureGate[];
24
+ children: React.ReactNode;
25
+ }> = ({ featureGates, children }) => {
26
+ const { getItem, setItem } = useSessionStorage();
27
+ const { featureOverrides } = useEnviveConfig();
28
+
29
+ const getQueryParamFeatureGateOverrides = useCallback(
30
+ (featureGate: FeatureGates): boolean | undefined => {
31
+ const urlObj = new URL(window.location.href);
32
+ const params = new URLSearchParams(urlObj.search);
33
+ const paramsObj = Object.fromEntries(params.entries());
34
+ const value = paramsObj[featureGate];
35
+
36
+ if (value != null) {
37
+ return value === "true";
38
+ }
39
+
40
+ return undefined;
41
+ },
42
+ []
43
+ );
44
+
45
+ const getWindowFeatureGateOverrides = useCallback(
46
+ (featureGate: FeatureGates): boolean | undefined => {
47
+ const value = featureOverrides?.[String(featureGate)];
48
+ if (value != null) {
49
+ return value;
50
+ }
51
+
52
+ return undefined;
53
+ },
54
+ [featureOverrides]
55
+ );
56
+
57
+ const getStoredFeatureGateOverrides = useCallback(
58
+ (featureGate: FeatureGates): boolean | undefined => {
59
+ const featureFlags = getItem(FEATURE_FLAGS_STORAGE_KEY);
60
+
61
+ if (featureFlags) {
62
+ try {
63
+ const featureFlagsObj = JSON.parse(featureFlags);
64
+ return featureFlagsObj[featureGate];
65
+ } catch (err) {
66
+ Logger.logError(
67
+ "[spiffy-ai] getStoredFeatureGateOverrides: error parsing feature flags",
68
+ err
69
+ );
70
+ }
71
+ }
72
+
73
+ return undefined;
74
+ },
75
+ []
76
+ );
77
+
78
+ const getFeatureFlagOverride = useCallback(
79
+ (featureGate: FeatureGates): boolean | undefined => {
80
+ const queryOverride = getQueryParamFeatureGateOverrides(featureGate);
81
+ if (queryOverride != null) {
82
+ Logger.logDebug(
83
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by URL param. New value: ${queryOverride}`
84
+ );
85
+ return queryOverride;
86
+ }
87
+
88
+ const windowOverride = getWindowFeatureGateOverrides(featureGate);
89
+ if (windowOverride != null) {
90
+ Logger.logDebug(
91
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by window param. New value: ${windowOverride}`
92
+ );
93
+ return windowOverride;
94
+ }
95
+
96
+ const storedOverride = getStoredFeatureGateOverrides(featureGate);
97
+ if (storedOverride != null) {
98
+ Logger.logDebug(
99
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by stored value. New value: ${storedOverride}`
100
+ );
101
+ return storedOverride;
102
+ }
103
+
104
+ return undefined;
105
+ },
106
+ [
107
+ getQueryParamFeatureGateOverrides,
108
+ getWindowFeatureGateOverrides,
109
+ getStoredFeatureGateOverrides,
110
+ ]
111
+ );
112
+
113
+ const isFeatureGateEnabled = useCallback(
114
+ (featureGate: FeatureGates): boolean => {
115
+ const gateValue = featureGates.find((gate) => gate.name === featureGate);
116
+
117
+ const featureFlagOverride = getFeatureFlagOverride(featureGate);
118
+ if (featureFlagOverride !== undefined) {
119
+ return featureFlagOverride;
120
+ }
121
+
122
+ if (gateValue == null || gateValue.value == null) {
123
+ Logger.logDebug(
124
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} value is undefined - returning false`
125
+ );
126
+
127
+ return false;
128
+ }
129
+
130
+ return gateValue.value;
131
+ },
132
+ [featureGates, getFeatureFlagOverride]
133
+ );
134
+
135
+ const isClientSessionEnabled = useCallback((): boolean => {
136
+ const gates: Array<StatsigFeatureGate> | undefined = featureGates;
137
+ const isEnabled =
138
+ gates == null ||
139
+ gates?.filter(
140
+ (gate) =>
141
+ gate.name === FeatureGates.IsClientSessionEnabled &&
142
+ gate.value === true
143
+ ).length > 0;
144
+
145
+ return isEnabled;
146
+ }, [featureGates]);
147
+
148
+ const getFeatureFlags = useCallback((): Record<string, boolean> => {
149
+ return Object.fromEntries(
150
+ Object.values(FeatureGates).map((featureGate: FeatureGates) => [
151
+ featureGate,
152
+ isFeatureGateEnabled(featureGate),
153
+ ])
154
+ );
155
+ }, [isFeatureGateEnabled]);
156
+
157
+ const persistFeatureGateOverrides = useCallback(() => {
158
+ const featureFlags = Object.values(FeatureGates)
159
+ .map((featureGate) => [featureGate, getFeatureFlagOverride(featureGate)])
160
+ .filter(([, val]) => val !== undefined)
161
+ .reduce((acc, [key, val]) => ({ ...acc, [key as string]: val }), {});
162
+ setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(featureFlags));
163
+ }, [getFeatureFlagOverride, setItem]);
164
+
165
+ const value = useMemo(
166
+ () => ({
167
+ isFeatureGateEnabled,
168
+ isClientSessionEnabled,
169
+ getFeatureFlags,
170
+ persistFeatureGateOverrides,
171
+ }),
172
+ [
173
+ isFeatureGateEnabled,
174
+ isClientSessionEnabled,
175
+ getFeatureFlags,
176
+ persistFeatureGateOverrides,
177
+ ]
178
+ );
179
+
180
+ return (
181
+ <FeatureFlagContext.Provider value={value}>
182
+ {children}
183
+ </FeatureFlagContext.Provider>
184
+ );
185
+ };
186
+
187
+ export const useFeatureFlag = () => {
188
+ const context = useContext(FeatureFlagContext);
189
+ if (context === undefined) {
190
+ throw new Error("useFeatureFlag must be used within a FeatureFlagProvider");
191
+ }
192
+ return context;
193
+ };
@@ -0,0 +1,87 @@
1
+ import React, { createContext, useContext, useMemo, ReactNode } from "react";
2
+ import { OrgConfigFeatureGate } from "src/application/models/api/orgConfigResults";
3
+ import { FeatureGates } from "src/application/models/featureGates";
4
+ import Logger from "src/application/logging/logger";
5
+
6
+ // This is the class that was previously implicitly used or defined elsewhere
7
+ class FeatureFlagService {
8
+ private featureGates: OrgConfigFeatureGate[];
9
+
10
+ constructor(featureGates: OrgConfigFeatureGate[]) {
11
+ this.featureGates = featureGates;
12
+ }
13
+
14
+ isFeatureGateEnabled = (featureGate: FeatureGates): boolean => {
15
+ const gateValue = this.featureGates.find(
16
+ (gate) => gate.name === featureGate
17
+ );
18
+
19
+ // TODO: Add logic for overrides (query params, window, stored) if needed, similar to the old FeatureFlagContext.tsx
20
+ // For now, direct value from config is used.
21
+
22
+ if (gateValue == null || gateValue.value == null) {
23
+ Logger.logDebug(
24
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} value is undefined - returning false`
25
+ );
26
+ return false;
27
+ }
28
+ return gateValue.value;
29
+ };
30
+
31
+ isClientSessionEnabled = (): boolean => {
32
+ const isEnabled =
33
+ this.featureGates.filter(
34
+ (gate) =>
35
+ gate.name === FeatureGates.IsClientSessionEnabled &&
36
+ gate.value === true
37
+ ).length > 0;
38
+ return isEnabled;
39
+ };
40
+
41
+ getFeatureFlags = (): Record<string, boolean> => {
42
+ return Object.fromEntries(
43
+ Object.values(FeatureGates).map((featureGate: FeatureGates) => [
44
+ featureGate,
45
+ this.isFeatureGateEnabled(featureGate),
46
+ ])
47
+ );
48
+ };
49
+ }
50
+
51
+ export interface FeatureFlagContextType {
52
+ featureFlagService: FeatureFlagService | undefined;
53
+ }
54
+
55
+ const FeatureFlagServiceContext = createContext<
56
+ FeatureFlagContextType | undefined
57
+ >(undefined);
58
+
59
+ interface FeatureFlagServiceProviderProps {
60
+ featureGates: OrgConfigFeatureGate[];
61
+ children: ReactNode;
62
+ }
63
+
64
+ export const FeatureFlagServiceProvider: React.FC<
65
+ FeatureFlagServiceProviderProps
66
+ > = ({ featureGates, children }) => {
67
+ const featureFlagService = useMemo(
68
+ () => new FeatureFlagService(featureGates),
69
+ [featureGates]
70
+ );
71
+
72
+ return (
73
+ <FeatureFlagServiceContext.Provider value={{ featureFlagService }}>
74
+ {children}
75
+ </FeatureFlagServiceContext.Provider>
76
+ );
77
+ };
78
+
79
+ export const useFeatureFlagService = () => {
80
+ const context = useContext(FeatureFlagServiceContext);
81
+ if (context === undefined) {
82
+ throw new Error(
83
+ "useFeatureFlagService must be used within a FeatureFlagServiceProvider"
84
+ );
85
+ }
86
+ return context;
87
+ };
@@ -0,0 +1,165 @@
1
+ import React, {
2
+ createContext,
3
+ useContext,
4
+ useCallback,
5
+ useMemo,
6
+ ReactNode,
7
+ } from "react";
8
+ import { useAtomValue } from "jotai";
9
+ import { baseUrlAtom, orgLevelApiKeyAtom } from "src/atoms/envive/enviveConfig";
10
+ import { getMerchantOrgIdQuery } from "src/application/models/graphql/queries/getMerchantOrgIdQuery";
11
+ import { validateGraphQLOrgId } from "src/application/models/validators/validateGraphQLOrgId";
12
+ import {
13
+ getMerchantColorsQuery,
14
+ GetMerchantColorsQueryData,
15
+ getMerchantFrontendConfigQuery,
16
+ GetMerchantFrontendConfigQueryData,
17
+ } from "src/application/models/graphql";
18
+ import { validateGraphQLColorsConfig } from "src/application/models/validators/validateGraphQLColorsConfig";
19
+ import { validateGraphQLFrontendConfig } from "src/application/models/validators/validateGraphQLFrontendConfig";
20
+ import { ColorMapping } from "src/application/models/colorsConfig";
21
+ import { FrontendConfig } from "src/application/models/frontendConfig";
22
+ import Logger from "src/application/logging/logger";
23
+ import { configVersion } from "src/types/config-versions";
24
+ import {
25
+ CamelCasedPropertiesDeep,
26
+ transformSnakeToCamel,
27
+ } from "src/application/models";
28
+
29
+ interface BaseMeConfigQueryResponse {
30
+ me: {
31
+ org?: {
32
+ id: string;
33
+ };
34
+ getProductsConfigByVersion?: {
35
+ frontend?: {
36
+ values: CamelCasedPropertiesDeep<GetMerchantFrontendConfigQueryData>;
37
+ };
38
+ colors?: { values: CamelCasedPropertiesDeep<GetMerchantColorsQueryData> };
39
+ };
40
+ };
41
+ }
42
+ export type ColorsConfigResponse = CamelCasedPropertiesDeep<ColorMapping>;
43
+ export type FrontendConfigResponse = CamelCasedPropertiesDeep<FrontendConfig>;
44
+
45
+ export type GraphQlConfigValues = {
46
+ colorsConfig?: ColorsConfigResponse;
47
+ frontendConfig?: CamelCasedPropertiesDeep<FrontendConfig>;
48
+ };
49
+
50
+ interface GraphQLContextValue {
51
+ executeQuery: <T>(
52
+ query: string,
53
+ variables?: Record<string, unknown>
54
+ ) => Promise<T>;
55
+ getOrgId: () => Promise<string | undefined>;
56
+ getColorsAndFrontendConfig: () => Promise<GraphQlConfigValues>;
57
+ isReady: boolean;
58
+ }
59
+
60
+ const GraphQLContext = createContext<GraphQLContextValue | null>(null);
61
+
62
+ const colorsAndFrontendConfigQuery = () => `
63
+ query ($version: String = "${configVersion()}") {
64
+ me {
65
+ getProductsConfigByVersion(version: $version) {
66
+ frontend { values }
67
+ colors { values }
68
+ }
69
+ }
70
+ }
71
+ `;
72
+
73
+ type GraphQLProviderProps = {
74
+ children: ReactNode;
75
+ };
76
+
77
+ export const GraphQLProvider = ({ children }: GraphQLProviderProps) => {
78
+ const apiKey = useAtomValue(orgLevelApiKeyAtom);
79
+ const baseUrl = useAtomValue(baseUrlAtom);
80
+
81
+ const isReady = Boolean(apiKey && baseUrl);
82
+
83
+ const executeQuery = useCallback(
84
+ async (query: string, variables?: Record<string, unknown>) => {
85
+ if (!isReady) {
86
+ throw new Error("GraphQL client not ready - missing apiKey or baseUrl");
87
+ }
88
+
89
+ const response = await fetch(`${baseUrl}/v1/graphql`, {
90
+ method: "POST",
91
+ headers: {
92
+ "Content-Type": "application/json",
93
+ Authorization: `Bearer ${apiKey}`,
94
+ },
95
+ body: JSON.stringify({ query, variables }),
96
+ });
97
+
98
+ if (!response.ok) {
99
+ throw new Error(`GraphQL request failed: ${response.statusText}`);
100
+ }
101
+
102
+ const result = await response.json();
103
+ if (result.errors) {
104
+ throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
105
+ }
106
+
107
+ return result.data;
108
+ },
109
+ [apiKey, baseUrl, isReady]
110
+ );
111
+
112
+ const getOrgId = useCallback(async () => {
113
+ const response = await executeQuery(getMerchantOrgIdQuery);
114
+ return validateGraphQLOrgId(response.me.org?.id);
115
+ }, [executeQuery]);
116
+
117
+ const getColorsAndFrontendConfig =
118
+ useCallback(async (): Promise<GraphQlConfigValues> => {
119
+ try {
120
+ const query = await colorsAndFrontendConfigQuery();
121
+ if (!query) {
122
+ throw new Error("Colors and frontend config query is not defined");
123
+ }
124
+ const response = await executeQuery(query);
125
+ const colorsConfig =
126
+ response.me.getProductsConfigByVersion?.colors?.values;
127
+ const frontendConfig =
128
+ response.me.getProductsConfigByVersion?.frontend?.values;
129
+ const transformedColorConfig = transformSnakeToCamel(colorsConfig);
130
+ const transformedFrontendConfig = transformSnakeToCamel(frontendConfig);
131
+ return {
132
+ colorsConfig: transformedColorConfig as ColorsConfigResponse,
133
+ frontendConfig: transformedFrontendConfig as FrontendConfigResponse,
134
+ };
135
+ } catch (err) {
136
+ Logger.logError(
137
+ "Error fetching graphql colors and frontend config",
138
+ err
139
+ );
140
+ return { colorsConfig: undefined, frontendConfig: undefined };
141
+ }
142
+ }, [executeQuery]);
143
+
144
+ const value = useMemo(
145
+ () => ({
146
+ executeQuery,
147
+ getOrgId,
148
+ getColorsAndFrontendConfig,
149
+ isReady,
150
+ }),
151
+ [executeQuery, getOrgId, getColorsAndFrontendConfig, isReady]
152
+ );
153
+
154
+ return (
155
+ <GraphQLContext.Provider value={value}>{children}</GraphQLContext.Provider>
156
+ );
157
+ };
158
+
159
+ export const useGraphQLClient = () => {
160
+ const context = useContext(GraphQLContext);
161
+ if (!context) {
162
+ throw new Error("useGraphQLClient must be used within a GraphQLProvider");
163
+ }
164
+ return context;
165
+ };
@@ -1,6 +1,16 @@
1
+ export * from "./amplitudeContext";
2
+ export * from "./cdnContext";
1
3
  export * from "./chatContext";
2
- export * from "./systemSettingsContext";
3
4
  export * from "./enviveConfigContext";
4
- export * from "./types";
5
- export * from "./orgConfigContext";
6
5
  export * from "./enviveCssContext";
6
+ // export * from "./featureFlagContext"; // Deprecated in favor of featureFlagServiceContext
7
+ export * from "./graphqlContext";
8
+ export * from "./localStorageContext";
9
+ export * from "./searchContext";
10
+ export * from "./sessionStorageContext";
11
+ export * from "./shopifyUrlContext";
12
+ export * from "./systemSettingsContext";
13
+ export * from "./types";
14
+ export * from "./userIdentityContext";
15
+ export * from "./newOrgConfigContext";
16
+ export * from "./featureFlagServiceContext";
@@ -0,0 +1,159 @@
1
+ import React, {
2
+ createContext,
3
+ useContext,
4
+ useCallback,
5
+ useMemo,
6
+ useEffect,
7
+ } from "react";
8
+ import Logger from "../application/logging/logger";
9
+ import { LocalStorageEventListener } from "../application/models/localStorageEventListener";
10
+
11
+ export enum LocalStorageKeys {
12
+ ChatId = "v1-spiffy-chat-session-id",
13
+ SpiffyOnOverride = "spiffy_on",
14
+ EnviveOnOverride = "envive_on",
15
+ }
16
+
17
+ interface LocalStorageContextType {
18
+ setItem: (key: string, value: string) => void;
19
+ getItem: (key: string) => string | null;
20
+ setSpiffyOnFeatureFlag: (value: boolean | null) => void;
21
+ getSpiffyOnFeatureFlag: () => string | null;
22
+ attachListener: (listener: LocalStorageEventListener) => void;
23
+ detachListener: (listener: LocalStorageEventListener) => void;
24
+ isAvailable: boolean;
25
+ }
26
+
27
+ const LocalStorageContext = createContext<LocalStorageContextType | null>(null);
28
+
29
+ export const LocalStorageProvider: React.FC<{ children: React.ReactNode }> = ({
30
+ children,
31
+ }) => {
32
+ const isAvailable = useMemo(() => {
33
+ try {
34
+ return typeof window !== "undefined" && !!window.localStorage;
35
+ } catch {
36
+ return false;
37
+ }
38
+ }, []);
39
+
40
+ useEffect(() => {
41
+ if (!isAvailable) {
42
+ Logger.logError("localStorage is not available", undefined);
43
+ }
44
+ }, [isAvailable]);
45
+
46
+ const setItem = useCallback(
47
+ (key: string, value: string) => {
48
+ if (!isAvailable) return;
49
+ localStorage.setItem(key, value);
50
+ window.dispatchEvent(
51
+ new StorageEvent("storage", { key, newValue: value })
52
+ );
53
+ },
54
+ [isAvailable]
55
+ );
56
+
57
+ const getItem = useCallback(
58
+ (key: string) => {
59
+ if (!isAvailable) return null;
60
+ return localStorage.getItem(key);
61
+ },
62
+ [isAvailable]
63
+ );
64
+
65
+ const setSpiffyOnFeatureFlag = useCallback(
66
+ (value: boolean | null): void => {
67
+ if (!isAvailable) return;
68
+ if (value === true) {
69
+ localStorage.setItem(LocalStorageKeys.SpiffyOnOverride, "true");
70
+ } else if (value === false) {
71
+ localStorage.setItem(LocalStorageKeys.SpiffyOnOverride, "false");
72
+ }
73
+ },
74
+ [isAvailable]
75
+ );
76
+
77
+ const getSpiffyOnFeatureFlag = useCallback((): string | null => {
78
+ if (!isAvailable) return null;
79
+ return localStorage.getItem(LocalStorageKeys.SpiffyOnOverride);
80
+ }, [isAvailable]);
81
+
82
+ const listenersCache = useMemo(
83
+ () => new Map<string, (event: StorageEvent) => void>(),
84
+ []
85
+ );
86
+
87
+ const listenerForKey = useCallback(
88
+ (listener: LocalStorageEventListener): ((event: StorageEvent) => void) => {
89
+ if (!listenersCache.has(listener.storageKey)) {
90
+ const handler = (event: StorageEvent) => {
91
+ if (event.key !== listener.storageKey) {
92
+ return;
93
+ }
94
+ Logger.logDebug(
95
+ `[spiffy-ai] Storage event key=${event.key}, value=`,
96
+ event.newValue
97
+ );
98
+ listener.listener(event);
99
+ };
100
+ listenersCache.set(listener.storageKey, handler);
101
+ }
102
+ return listenersCache.get(listener.storageKey)!;
103
+ },
104
+ [listenersCache]
105
+ );
106
+
107
+ const attachListener = useCallback(
108
+ (listener: LocalStorageEventListener): void => {
109
+ if (!isAvailable) return;
110
+ window.addEventListener("storage", listenerForKey(listener));
111
+ },
112
+ [isAvailable, listenerForKey]
113
+ );
114
+
115
+ const detachListener = useCallback(
116
+ (listener: LocalStorageEventListener): void => {
117
+ if (!isAvailable) return;
118
+ window.removeEventListener("storage", listenerForKey(listener));
119
+ },
120
+ [isAvailable, listenerForKey]
121
+ );
122
+
123
+ const value = useMemo(
124
+ () => ({
125
+ setItem,
126
+ getItem,
127
+ setSpiffyOnFeatureFlag,
128
+ getSpiffyOnFeatureFlag,
129
+ attachListener,
130
+ detachListener,
131
+ isAvailable,
132
+ }),
133
+ [
134
+ setItem,
135
+ getItem,
136
+ setSpiffyOnFeatureFlag,
137
+ getSpiffyOnFeatureFlag,
138
+ attachListener,
139
+ detachListener,
140
+ isAvailable,
141
+ ]
142
+ );
143
+
144
+ return (
145
+ <LocalStorageContext.Provider value={value}>
146
+ {children}
147
+ </LocalStorageContext.Provider>
148
+ );
149
+ };
150
+
151
+ export const useLocalStorage = () => {
152
+ const context = useContext(LocalStorageContext);
153
+ if (!context) {
154
+ throw new Error(
155
+ "useLocalStorage must be used within a LocalStorageProvider"
156
+ );
157
+ }
158
+ return context;
159
+ };