@envive-ai/react-hooks 0.1.4 → 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 (488) 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 +17 -13
  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 +1 -1
  41. package/dist/atoms/atomStore/index.js +2 -1
  42. package/dist/atoms/chat/index.cjs +44 -40
  43. package/dist/atoms/chat/index.d.cts +35 -36
  44. package/dist/atoms/chat/index.d.ts +35 -36
  45. package/dist/atoms/chat/index.js +14 -10
  46. package/dist/atoms/globalSearch/index.cjs +1 -1
  47. package/dist/atoms/globalSearch/index.d.cts +5 -5
  48. package/dist/atoms/globalSearch/index.d.ts +5 -5
  49. package/dist/atoms/globalSearch/index.js +1 -1
  50. package/dist/atoms/org/index.cjs +26 -37
  51. package/dist/atoms/org/index.d.cts +37 -47
  52. package/dist/atoms/org/index.d.ts +37 -47
  53. package/dist/atoms/org/index.js +11 -11
  54. package/dist/atoms/search/index.cjs +47 -41
  55. package/dist/atoms/search/index.d.cts +7 -9
  56. package/dist/atoms/search/index.d.ts +7 -9
  57. package/dist/atoms/search/index.js +16 -10
  58. package/dist/bandolier-DYEz4-8C.js +1229 -0
  59. package/dist/bandolier-o_-xrbOV.cjs +1229 -0
  60. package/dist/carpe-CsG5jCcl.cjs +607 -0
  61. package/dist/carpe-DONk00bZ.js +605 -0
  62. package/dist/cdnUtils-32v8bDX9.cjs +16 -0
  63. package/dist/cdnUtils-E4tLBt2g.js +11 -0
  64. package/dist/{chat-BgONoYU7.cjs → chat-BubCW1as.cjs} +1 -1
  65. package/dist/chat-CO7cRkaq.cjs +506 -0
  66. package/dist/{chat-CLJ4NWcN.js → chat-CV6MXeID.js} +1 -1
  67. package/dist/chat-hcRc4RRd.js +285 -0
  68. package/dist/{components-CV1fhAkj.js → components-B4T3Uzth.js} +1 -1
  69. package/dist/{components-BKZbet67.cjs → components-Cw9WjA6g.cjs} +1 -1
  70. package/dist/config/locators/components/chat/index.cjs +1 -1
  71. package/dist/config/locators/components/chat/index.d.cts +1 -1
  72. package/dist/config/locators/components/chat/index.d.ts +1 -1
  73. package/dist/config/locators/components/chat/index.js +1 -1
  74. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  75. package/dist/config/locators/components/index.cjs +1 -1
  76. package/dist/config/locators/components/index.d.cts +1 -1
  77. package/dist/config/locators/components/index.d.ts +1 -1
  78. package/dist/config/locators/components/index.js +1 -1
  79. package/dist/config/locators/index.cjs +4 -4
  80. package/dist/config/locators/index.d.cts +2 -2
  81. package/dist/config/locators/index.d.ts +3 -3
  82. package/dist/config/locators/index.js +4 -4
  83. package/dist/contexts/index.cjs +45 -14
  84. package/dist/contexts/index.d.cts +10 -78
  85. package/dist/contexts/index.d.ts +10 -78
  86. package/dist/contexts/index.js +22 -11
  87. package/dist/contexts-B4ihTBsV.cjs +2980 -0
  88. package/dist/contexts-DGlr7M1o.js +2596 -0
  89. package/dist/coterie-CKB93qfz.cjs +239 -0
  90. package/dist/{coterie-yQ-_JXSw.cjs → coterie-DHcj2fRE.js} +64 -65
  91. package/dist/{custservice-types-C83itZmy.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
  92. package/dist/{custservice-types-DPQ-4TI6.js → custservice-types-mnIunabv.js} +1 -1
  93. package/dist/default-BnB4p0Se.cjs +234 -0
  94. package/dist/default-D6f5Dyt7.js +199 -0
  95. package/dist/default-ZKkE5zT4.cjs +4 -0
  96. package/dist/default-legGZJwI.js +4 -0
  97. package/dist/{divIds-DEL_-qU0.cjs → divIds-2dJlU3z8.cjs} +1 -15
  98. package/dist/{divIds-CWkntTsx.js → divIds-BUrN2vY-.js} +2 -4
  99. package/dist/dreamlandBaby-BiRYYFav.js +346 -0
  100. package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
  101. package/dist/{embedded-C5uJqmuD.js → embedded-BJLWIriJ.js} +1 -1
  102. package/dist/{embedded--2L0F4b5.cjs → embedded-Dl79TJLC.cjs} +1 -1
  103. package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
  104. package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
  105. package/dist/enviveConfig-BccuzS2a.cjs +240 -0
  106. package/dist/enviveConfig-CzhTz8Aa.js +152 -0
  107. package/dist/events/index.cjs +1 -1
  108. package/dist/events/index.d.cts +1 -1
  109. package/dist/events/index.js +1 -1
  110. package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
  111. package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
  112. package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
  113. package/dist/fiveCbd-Dz2NouOF.js +613 -0
  114. package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
  115. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
  116. package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
  117. package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
  118. package/dist/graphql-BNW60InJ.cjs +128 -0
  119. package/dist/graphql-CjB8wHzm.js +74 -0
  120. package/dist/graphqlConfig-CYt6tWII.js +30 -0
  121. package/dist/graphqlConfig-DicykC-o.cjs +61 -0
  122. package/dist/greenpan-B_EbPkSP.js +397 -0
  123. package/dist/greenpan-kPE4fJgd.cjs +397 -0
  124. package/dist/grooveLife-Ckuir319.js +342 -0
  125. package/dist/grooveLife-DKSEQp1F.cjs +342 -0
  126. package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
  127. package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
  128. package/dist/hooks/index.cjs +40 -16
  129. package/dist/hooks/index.d.cts +122 -95
  130. package/dist/hooks/index.d.ts +122 -95
  131. package/dist/hooks/index.js +22 -11
  132. package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
  133. package/dist/{index-jBATkcc_.d.cts → index-BDPWBU3h.d.cts} +1 -1
  134. package/dist/index-BMPtlgac.d.ts +191 -0
  135. package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
  136. package/dist/{index-C62lPpy4.d.cts → index-Byb45OPg.d.cts} +1 -1
  137. package/dist/{index-DPx8s5YH.d.ts → index-C6KdON7d.d.ts} +1 -1
  138. package/dist/index-C7pGDl1A.d.ts +1609 -0
  139. package/dist/{index-CYtsPztZ.d.cts → index-C9lgsCWp.d.cts} +32 -32
  140. package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
  141. package/dist/{index-C_C0tLeD.d.ts → index-Cc-wBCn6.d.ts} +32 -32
  142. package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
  143. package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
  144. package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
  145. package/dist/{index-CExtydIH.d.ts → index-DOii3C6b.d.ts} +1 -1
  146. package/dist/index-DTu2X-YS.d.cts +1609 -0
  147. package/dist/index-OEifcBsm.d.cts +191 -0
  148. package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
  149. package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
  150. package/dist/interceptors/index.cjs +2 -12
  151. package/dist/interceptors/index.d.cts +8 -13
  152. package/dist/interceptors/index.d.ts +8 -13
  153. package/dist/interceptors/index.js +2 -11
  154. package/dist/jackArcher-B39OEIj6.cjs +727 -0
  155. package/dist/{jackArcher-CXf_IAmC.js → jackArcher-BwkWGybC.js} +24 -25
  156. package/dist/jordanCraig-CxRH_jLi.js +1786 -0
  157. package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
  158. package/dist/kindredBravely-D78VwL20.cjs +490 -0
  159. package/dist/kindredBravely-DQDpAzdl.js +490 -0
  160. package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
  161. package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
  162. package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
  163. package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
  164. package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
  165. package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
  166. package/dist/longevityrx-DdV3v26F.cjs +320 -0
  167. package/dist/longevityrx-DfPDfvAt.js +320 -0
  168. package/dist/lookOptic-DgXFGBPP.cjs +282 -0
  169. package/dist/{lookOptic-BGhU4910.js → lookOptic-FgVW1afF.js} +19 -20
  170. package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
  171. package/dist/{mantraBrand-DrqG9uqO.js → mantraBrand-uV8HCDR8.js} +22 -23
  172. package/dist/medterra-BtDpr1Hw.cjs +583 -0
  173. package/dist/medterra-DgzE7-mj.js +583 -0
  174. package/dist/modells-CJjsxOIR.js +484 -0
  175. package/dist/modells-Ck5KbRFj.cjs +484 -0
  176. package/dist/models-BkXg5eIP.cjs +1534 -0
  177. package/dist/models-UZ6HszfZ.js +1281 -0
  178. package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
  179. package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
  180. package/dist/org-C2RrBVQR.cjs +81 -0
  181. package/dist/org-xMytX--e.js +38 -0
  182. package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
  183. package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
  184. package/dist/pressedFloral-Bteoboms.js +661 -0
  185. package/dist/pressedFloral-CexgV-xy.cjs +661 -0
  186. package/dist/search-BMOAmrmY.js +459 -0
  187. package/dist/search-Df0Ifneg.cjs +672 -0
  188. package/dist/{search-filter-types-BNTLVXqQ.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
  189. package/dist/{search-filter-types-DkmH1TxJ.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
  190. package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
  191. package/dist/skinPerfection-BlvcEcUE.js +334 -0
  192. package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
  193. package/dist/snapSupplements-kcsPAOm9.js +285 -0
  194. package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
  195. package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
  196. package/dist/spanx-B4WFA_rI.js +661 -0
  197. package/dist/spanx-BWoE4F8b.cjs +663 -0
  198. package/dist/spanxStaging-BOrOjhXn.js +845 -0
  199. package/dist/spanxStaging-BfdfIug4.cjs +848 -0
  200. package/dist/{suggestionBarV2-types-CwOXzIKq.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
  201. package/dist/{suggestionBarV2-types-Dc4-zJlV.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
  202. package/dist/supergoop-22dd5_BS.js +323 -0
  203. package/dist/supergoop-B-a4cku2.cjs +323 -0
  204. package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
  205. package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
  206. package/dist/types/index.cjs +2 -2
  207. package/dist/types/index.d.cts +2 -2
  208. package/dist/types/index.d.ts +2 -2
  209. package/dist/types/index.js +2 -2
  210. package/dist/types--pr1GQQx.js +154 -0
  211. package/dist/types-BVSyY3Hk.cjs +196 -0
  212. package/dist/{uniqueVintage-Cui74mlJ.js → uniqueVintage-CJXiNNe7.js} +19 -20
  213. package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
  214. package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
  215. package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
  216. package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
  217. package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
  218. package/dist/utils-C9ZSCx12.js +888 -0
  219. package/dist/utils-D5HO61hG.cjs +1016 -0
  220. package/dist/variantInfo-DbVxA1yE.js +1 -0
  221. package/dist/variantInfo-orXoPBCU.cjs +0 -0
  222. package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
  223. package/dist/venaCbd-CanovPS_.js +365 -0
  224. package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
  225. package/dist/{westonJonBoucher-C95EuCl-.js → westonJonBoucher-BUu1_wP1.js} +19 -20
  226. package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
  227. package/dist/{wineEnthusiast-DeTFY8Gm.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
  228. package/dist/wolfMattress-D9Mjq-HP.js +372 -0
  229. package/dist/wolfMattress-JssghhC-.cjs +372 -0
  230. package/dist/wolfTactical-C6exYhL7.cjs +349 -0
  231. package/dist/wolfTactical-CnV3KQdI.js +349 -0
  232. package/package.json +101 -19
  233. package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
  234. package/src/application/models/colorsConfig.ts +18 -18
  235. package/src/application/models/frontendConfig.ts +3 -3
  236. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
  237. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
  238. package/src/application/models/index.ts +0 -2
  239. package/src/application/models/localStorageEventListener.ts +2 -2
  240. package/src/application/models/supportedOrgs.ts +1 -1
  241. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  242. package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
  243. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
  244. package/src/application/utils/analyticsUtils.ts +53 -22
  245. package/src/application/utils/cdnUtils.ts +11 -0
  246. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
  247. package/src/atoms/app/index.ts +7 -17
  248. package/src/atoms/app/variant.ts +13 -4
  249. package/src/atoms/chat/chatState.ts +28 -18
  250. package/src/atoms/chat/messageQueue.ts +36 -5
  251. package/src/atoms/chat/replies.ts +45 -37
  252. package/src/atoms/envive/enviveConfig.ts +10 -6
  253. package/src/atoms/org/graphqlConfig.ts +21 -4
  254. package/src/atoms/org/index.ts +7 -7
  255. package/src/atoms/org/newOrgConfigAtom.ts +8 -0
  256. package/src/atoms/org/orgPageConfig.ts +6 -5
  257. package/src/atoms/search/chatSearch.ts +11 -5
  258. package/src/atoms/search/searchAPI.ts +68 -48
  259. package/src/atoms/search/searchServiceAdapter.ts +25 -0
  260. package/src/contexts/amplitudeContext.tsx +466 -0
  261. package/src/contexts/cdnContext.tsx +48 -0
  262. package/src/contexts/chatContext.tsx +15 -12
  263. package/src/contexts/enviveConfigContext.tsx +22 -17
  264. package/src/contexts/enviveCssContext.tsx +34 -5
  265. package/src/contexts/featureFlagContext.tsx +193 -0
  266. package/src/contexts/featureFlagServiceContext.tsx +87 -0
  267. package/src/contexts/graphqlContext.tsx +165 -0
  268. package/src/contexts/index.ts +13 -3
  269. package/src/contexts/localStorageContext.tsx +159 -0
  270. package/src/contexts/newOrgConfigContext.tsx +104 -0
  271. package/src/contexts/orgConfigContext.tsx +92 -92
  272. package/src/contexts/searchContext.tsx +187 -0
  273. package/src/contexts/sessionStorageContext.tsx +80 -0
  274. package/src/contexts/shopifyUrlContext.tsx +97 -0
  275. package/src/contexts/types.ts +12 -8
  276. package/src/contexts/userIdentityContext.tsx +197 -0
  277. package/src/events/registerAnalyticsListeners.ts +32 -38
  278. package/src/hooks/index.ts +10 -6
  279. package/src/hooks/useAmplitudeOperations.ts +35 -0
  280. package/src/hooks/useAppDetails.ts +49 -0
  281. package/src/hooks/useCdnOperations.ts +16 -0
  282. package/src/hooks/useChatToggle.ts +5 -4
  283. package/src/hooks/useChatToggleAnalytics.ts +15 -0
  284. package/src/hooks/useGraphQLConfig.ts +63 -0
  285. package/src/hooks/useIdentifyUser.ts +33 -0
  286. package/src/hooks/useImageResolver.ts +18 -10
  287. package/src/hooks/useLocalStorageOperations.ts +92 -0
  288. package/src/hooks/useNewOrgConfig.ts +7 -0
  289. package/src/hooks/useSearch.tsx +21 -18
  290. package/src/hooks/useSearchOperations.ts +97 -0
  291. package/src/hooks/useSessionStorageOperations.ts +28 -0
  292. package/src/hooks/useShopifyUrlOperations.ts +45 -0
  293. package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
  294. package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
  295. package/src/interceptors/index.ts +0 -1
  296. package/src/interceptors/useMessageInterceptor.ts +5 -8
  297. package/src/merchants/bandolier/bandolier.ts +10 -28
  298. package/src/merchants/carpe/carpe.ts +5 -8
  299. package/src/merchants/coterie/coterie.ts +3 -6
  300. package/src/merchants/default.ts +73 -70
  301. package/src/merchants/domInsertion.ts +30 -0
  302. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
  303. package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
  304. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
  305. package/src/merchants/greenpan/greenpan.ts +6 -12
  306. package/src/merchants/gridInsertion.ts +19 -0
  307. package/src/merchants/grooveLife/grooveLife.ts +13 -7
  308. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
  309. package/src/merchants/jackArcher/jackArcher.ts +26 -11
  310. package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
  311. package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
  312. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
  313. package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
  314. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
  315. package/src/merchants/longevityrx/longevityrx.ts +14 -8
  316. package/src/merchants/lookOptic/lookOptic.ts +6 -6
  317. package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
  318. package/src/merchants/medterra/medterra.ts +14 -11
  319. package/src/merchants/modells/modells.ts +6 -9
  320. package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
  321. package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
  322. package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
  323. package/src/merchants/spanx/spanx.ts +6 -6
  324. package/src/merchants/spanx/spanxStaging.ts +6 -12
  325. package/src/merchants/supergoop/supergoop.ts +11 -12
  326. package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
  327. package/src/merchants/venaCbd/venaCbd.ts +6 -9
  328. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
  329. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
  330. package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
  331. package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
  332. package/src/types/config-versions.ts +6 -0
  333. package/src/types.ts +0 -53
  334. package/dist/adapters/amplitude/index.cjs +0 -14
  335. package/dist/adapters/amplitude/index.d.cts +0 -6
  336. package/dist/adapters/amplitude/index.d.ts +0 -6
  337. package/dist/adapters/amplitude/index.js +0 -12
  338. package/dist/api-B2euFL-5.cjs +0 -269
  339. package/dist/api-XRr_lAG6.js +0 -190
  340. package/dist/application/config/index.cjs +0 -43
  341. package/dist/application/config/index.d.cts +0 -15
  342. package/dist/application/config/index.d.ts +0 -15
  343. package/dist/application/config/index.js +0 -41
  344. package/dist/application/service/customerService/index.cjs +0 -4
  345. package/dist/application/service/customerService/index.d.cts +0 -3
  346. package/dist/application/service/customerService/index.d.ts +0 -3
  347. package/dist/application/service/customerService/index.js +0 -4
  348. package/dist/application/service/index.cjs +0 -41
  349. package/dist/application/service/index.d.cts +0 -399
  350. package/dist/application/service/index.d.ts +0 -399
  351. package/dist/application/service/index.js +0 -12
  352. package/dist/bandolier-B76-OE75.cjs +0 -1230
  353. package/dist/bandolier-DRn_x1g1.js +0 -1230
  354. package/dist/carpe-kHi4RLB5.cjs +0 -608
  355. package/dist/carpe-qrSU99gq.js +0 -606
  356. package/dist/contexts-CQDwe3rK.cjs +0 -14333
  357. package/dist/contexts-e2sM-B9g.js +0 -12919
  358. package/dist/coterie-mMirPcHP.js +0 -240
  359. package/dist/customerService-BG1uNZZ1.cjs +0 -36
  360. package/dist/customerService-BHQRnLhC.js +0 -23
  361. package/dist/default-8Jfv8ehQ.cjs +0 -199
  362. package/dist/default-C8PQf-38.js +0 -176
  363. package/dist/default-LukSiCz1.js +0 -4
  364. package/dist/default-rJSJ887P.cjs +0 -4
  365. package/dist/dreamlandBaby-DHltv12Z.cjs +0 -347
  366. package/dist/dreamlandBaby-cG0HM9bt.js +0 -347
  367. package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
  368. package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
  369. package/dist/fiveCbd-Cvnwh03g.cjs +0 -614
  370. package/dist/fiveCbd-DhYMlsf9.js +0 -614
  371. package/dist/forLoveAndLemons-C8DuUexW.js +0 -666
  372. package/dist/forLoveAndLemons-DR6a1zjJ.cjs +0 -668
  373. package/dist/greenpan-B4Pu65kV.js +0 -398
  374. package/dist/greenpan-BL5p6j7f.cjs +0 -398
  375. package/dist/grooveLife-DjKWHoN3.cjs +0 -343
  376. package/dist/grooveLife-JK0TyaPz.js +0 -343
  377. package/dist/homegrownCannabis-DxqSDkmS.js +0 -411
  378. package/dist/homegrownCannabis-ZnfCqW-m.cjs +0 -411
  379. package/dist/index-BfuO9b0Q.d.ts +0 -749
  380. package/dist/index-CNsGWfS6.d.cts +0 -749
  381. package/dist/index-DFL1dIT_.d.ts +0 -7
  382. package/dist/index-MFbPQ8Ji.d.ts +0 -95
  383. package/dist/index-VSFakgAI.d.cts +0 -95
  384. package/dist/index-zZjcds15.d.cts +0 -7
  385. package/dist/jackArcher-mGkojXek.cjs +0 -728
  386. package/dist/jordanCraig-BvCvPRoR.js +0 -1787
  387. package/dist/jordanCraig-Dv8pVCiS.cjs +0 -1787
  388. package/dist/kindredBravely-UQP7wiNu.cjs +0 -491
  389. package/dist/kindredBravely-X8F_LNph.js +0 -491
  390. package/dist/kutFromTheKloth-BhYKk3CN.cjs +0 -370
  391. package/dist/kutFromTheKloth-D1xsTSJr.js +0 -370
  392. package/dist/larryAndSerges-1411NuZa.cjs +0 -262
  393. package/dist/larryAndSerges-DVIRLItu.js +0 -262
  394. package/dist/leapsAndRebounds-BJ8mwr33.js +0 -361
  395. package/dist/leapsAndRebounds-UcP9EJVO.cjs +0 -361
  396. package/dist/logger-Dln20ans.cjs +0 -26
  397. package/dist/logger-pdEEY8T2.js +0 -20
  398. package/dist/longevityrx-BFSv9GF5.cjs +0 -321
  399. package/dist/longevityrx-Cp6wleWr.js +0 -321
  400. package/dist/lookOptic-KieSqskd.cjs +0 -283
  401. package/dist/mantraBrand-CHQw-0nw.cjs +0 -751
  402. package/dist/medterra-CLG6Co1C.cjs +0 -584
  403. package/dist/medterra-D8ZX9NZC.js +0 -584
  404. package/dist/modells-BzyPwN2m.cjs +0 -485
  405. package/dist/modells-CAfqOCW4.js +0 -485
  406. package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
  407. package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
  408. package/dist/pressedFloral-DULBuQwR.cjs +0 -662
  409. package/dist/pressedFloral-Dp-7Fk3S.js +0 -662
  410. package/dist/skinPerfection-BxuYCeJX.js +0 -335
  411. package/dist/skinPerfection-Cd3XZ6By.cjs +0 -335
  412. package/dist/snapSupplements-Bf6htPM0.js +0 -286
  413. package/dist/snapSupplements-ZFnXyMuZ.cjs +0 -286
  414. package/dist/spanx-CwDPQaGj.js +0 -662
  415. package/dist/spanx-Cyd4qDlK.cjs +0 -664
  416. package/dist/spanxStaging-D43nyAGy.js +0 -846
  417. package/dist/spanxStaging-ijbYnHzr.cjs +0 -849
  418. package/dist/supergoop-BnbFG7hm.cjs +0 -338
  419. package/dist/supergoop-CY043wIg.js +0 -336
  420. package/dist/types-BF_CJeck.js +0 -177
  421. package/dist/types-CD4LFta-.d.cts +0 -33
  422. package/dist/types-CNH4sfF-.cjs +0 -231
  423. package/dist/types-DBdI0j89.d.ts +0 -33
  424. package/dist/uniqueVintage-R2Jcu1y1.cjs +0 -1214
  425. package/dist/variant-CKVRF2-W.d.ts +0 -13
  426. package/dist/variant-raYuOP4L.d.cts +0 -13
  427. package/dist/venaCbd-o5_vOp4e.js +0 -366
  428. package/dist/venaCbd-r-IxEVc1.cjs +0 -366
  429. package/dist/westonJonBoucher-DjGEW3ZB.cjs +0 -423
  430. package/dist/wineEnthusiast-DvfcV5B3.cjs +0 -941
  431. package/dist/wolfMattress-6xPfOJt3.js +0 -373
  432. package/dist/wolfMattress-BjGnGKjP.cjs +0 -373
  433. package/dist/wolfTactical-Bi3WZu0m.cjs +0 -350
  434. package/dist/wolfTactical-C_F9-oPX.js +0 -350
  435. package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
  436. package/src/adapters/amplitude/index.ts +0 -2
  437. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
  438. package/src/adapters/spiffy/commerce/graphql.ts +0 -219
  439. package/src/application/config/generalStaticConfig.ts +0 -40
  440. package/src/application/config/index.ts +0 -1
  441. package/src/application/models/domMutationContinuation.ts +0 -7
  442. package/src/application/models/domObservationStrategy.ts +0 -9
  443. package/src/application/service/cachingService.ts +0 -84
  444. package/src/application/service/cdnService.ts +0 -20
  445. package/src/application/service/customerService/index.ts +0 -8
  446. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
  447. package/src/application/service/domMutationObserver.ts +0 -320
  448. package/src/application/service/domMutations/GridInsertionService.ts +0 -123
  449. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
  450. package/src/application/service/domMutations/domInsertionService.ts +0 -90
  451. package/src/application/service/domMutations/domMutationListener.ts +0 -15
  452. package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
  453. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
  454. package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
  455. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
  456. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
  457. package/src/application/service/featureFlagService.ts +0 -130
  458. package/src/application/service/index.ts +0 -31
  459. package/src/application/service/kustomerIntegrationService.ts +0 -111
  460. package/src/application/service/localStorageService.ts +0 -77
  461. package/src/application/service/pageVariantService.ts +0 -866
  462. package/src/application/service/searchService.ts +0 -147
  463. package/src/application/service/sessionStorageService.ts +0 -27
  464. package/src/application/service/shopifyUrlService.ts +0 -63
  465. package/src/application/service/userIdentityService.ts +0 -114
  466. package/src/application/service/windowChatToggleService.ts +0 -80
  467. package/src/application/service/windowDataLayerService.ts +0 -181
  468. package/src/application/service/windowFrontendConfigService.ts +0 -129
  469. package/src/atoms/org/merchantCss.ts +0 -158
  470. package/src/atoms/org/org.ts +0 -291
  471. package/src/atoms/org/orgUIConfig.ts +0 -142
  472. package/src/enabled-features.ts +0 -83
  473. package/src/hooks/useDynamicVariants.ts +0 -210
  474. package/src/hooks/useFileUpload.ts +0 -63
  475. package/src/hooks/useHideElements.ts +0 -82
  476. package/src/hooks/useHorizontalScrollAnimation.ts +0 -115
  477. package/src/hooks/useReducedMotionWithOverride.ts +0 -15
  478. package/src/hooks/useSnapControl.ts +0 -155
  479. package/src/interceptors/useFormEscalation.ts +0 -57
  480. /package/dist/{variantInfo-CzhR5W6h.js → atomStore-CZnUUsrr.js} +0 -0
  481. /package/dist/{variantInfo-CNRTY0gH.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
  482. /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
  483. /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
  484. /package/dist/{locators-Dc5ZT0aF.js → utilityTypes-8sETsYPk.js} +0 -0
  485. /package/dist/{locators-lQMJj830.cjs → utilityTypes-COShxVir.cjs} +0 -0
  486. /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
  487. /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
  488. /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
+ };