@envive-ai/react-hooks 0.1.1 → 0.1.2

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 (301) hide show
  1. package/dist/adapters/amplitude/index.cjs +14 -0
  2. package/dist/adapters/amplitude/index.d.cts +4 -0
  3. package/dist/adapters/amplitude/index.d.ts +4 -0
  4. package/dist/adapters/amplitude/index.js +12 -0
  5. package/dist/api-B2euFL-5.cjs +268 -0
  6. package/dist/api-CxGedDxj.cjs +5057 -0
  7. package/dist/api-NJEaveju.js +4113 -0
  8. package/dist/api-XRr_lAG6.js +189 -0
  9. package/dist/application/config/index.cjs +34 -0
  10. package/dist/application/config/index.d.cts +14 -0
  11. package/dist/application/config/index.d.ts +14 -0
  12. package/dist/application/config/index.js +32 -0
  13. package/dist/application/models/graphql/index.cjs +13 -0
  14. package/dist/application/models/graphql/index.d.cts +2 -0
  15. package/dist/application/models/graphql/index.d.ts +2 -0
  16. package/dist/application/models/graphql/index.js +12 -0
  17. package/dist/application/models/guards/api/index.cjs +15 -0
  18. package/dist/application/models/guards/api/index.d.cts +3 -0
  19. package/dist/application/models/guards/api/index.d.ts +3 -0
  20. package/dist/application/models/guards/api/index.js +4 -0
  21. package/dist/application/models/index.cjs +72 -0
  22. package/dist/application/models/index.d.cts +10 -0
  23. package/dist/application/models/index.d.ts +10 -0
  24. package/dist/application/models/index.js +12 -0
  25. package/dist/application/models/utilityTypes/index.cjs +1 -0
  26. package/dist/application/models/utilityTypes/index.d.cts +2 -0
  27. package/dist/application/models/utilityTypes/index.d.ts +2 -0
  28. package/dist/application/models/utilityTypes/index.js +3 -0
  29. package/dist/application/models/variantInfo/index.cjs +1 -0
  30. package/dist/application/models/variantInfo/index.d.cts +2 -0
  31. package/dist/application/models/variantInfo/index.d.ts +2 -0
  32. package/dist/application/models/variantInfo/index.js +3 -0
  33. package/dist/application/service/customerService/index.cjs +4 -0
  34. package/dist/application/service/customerService/index.d.cts +3 -0
  35. package/dist/application/service/customerService/index.d.ts +3 -0
  36. package/dist/application/service/customerService/index.js +4 -0
  37. package/dist/application/service/index.cjs +761 -0
  38. package/dist/application/service/index.d.cts +407 -0
  39. package/dist/application/service/index.d.ts +407 -0
  40. package/dist/application/service/index.js +727 -0
  41. package/dist/application/utils/index.cjs +38 -0
  42. package/dist/application/utils/index.d.cts +254 -0
  43. package/dist/application/utils/index.d.ts +254 -0
  44. package/dist/application/utils/index.js +12 -0
  45. package/dist/atomStore-B3tsg6mF.cjs +0 -0
  46. package/dist/atomStore-BFtpknLM.js +31 -0
  47. package/dist/atomStore-CeJm9Llb.cjs +57 -0
  48. package/dist/atomStore-FSZd_20F.js +1 -0
  49. package/dist/atoms/app/index.cjs +17 -0
  50. package/dist/atoms/app/index.d.cts +33 -0
  51. package/dist/atoms/app/index.d.ts +33 -0
  52. package/dist/atoms/app/index.js +12 -0
  53. package/dist/atoms/atomStore/index.cjs +7 -0
  54. package/dist/atoms/atomStore/index.d.cts +23 -0
  55. package/dist/atoms/atomStore/index.d.ts +23 -0
  56. package/dist/atoms/atomStore/index.js +4 -0
  57. package/dist/atoms/chat/index.cjs +41 -0
  58. package/dist/atoms/chat/index.d.cts +159 -0
  59. package/dist/atoms/chat/index.d.ts +159 -0
  60. package/dist/atoms/chat/index.js +12 -0
  61. package/dist/atoms/globalSearch/index.cjs +6 -0
  62. package/dist/atoms/globalSearch/index.d.cts +23 -0
  63. package/dist/atoms/globalSearch/index.d.ts +23 -0
  64. package/dist/atoms/globalSearch/index.js +3 -0
  65. package/dist/atoms/org/index.cjs +41 -0
  66. package/dist/atoms/org/index.d.cts +93 -0
  67. package/dist/atoms/org/index.d.ts +93 -0
  68. package/dist/atoms/org/index.js +13 -0
  69. package/dist/atoms/search/index.cjs +44 -0
  70. package/dist/atoms/search/index.d.cts +11 -0
  71. package/dist/atoms/search/index.d.ts +11 -0
  72. package/dist/atoms/search/index.js +14 -0
  73. package/dist/{bandolier-DpF-HUG_.js → bandolier-C7PAIw02.js} +17 -7
  74. package/dist/{bandolier-3rHPPhkF.cjs → bandolier-oMkFDJMF.cjs} +56 -46
  75. package/dist/{carpe-BG7Q_KCG.cjs → carpe-C0ccKuR9.cjs} +35 -25
  76. package/dist/{carpe-DLuc07V7.js → carpe-DFc78_lJ.js} +17 -7
  77. package/dist/chat-CCgyDehy.cjs +151 -0
  78. package/dist/chat-Dk6KPb1K.js +25 -0
  79. package/dist/components-CScS7Ii-.cjs +28 -0
  80. package/dist/components-DAQxVIn9.js +10 -0
  81. package/dist/config/locators/components/chat/index.cjs +23 -0
  82. package/dist/config/locators/components/chat/index.d.cts +2 -0
  83. package/dist/config/locators/components/chat/index.d.ts +2 -0
  84. package/dist/config/locators/components/chat/index.js +3 -0
  85. package/dist/config/locators/components/chat/variants/index.cjs +28 -0
  86. package/dist/config/locators/components/chat/variants/index.d.cts +15 -0
  87. package/dist/config/locators/components/chat/variants/index.d.ts +15 -0
  88. package/dist/config/locators/components/chat/variants/index.js +16 -0
  89. package/dist/config/locators/components/index.cjs +5 -0
  90. package/dist/config/locators/components/index.d.cts +2 -0
  91. package/dist/config/locators/components/index.d.ts +2 -0
  92. package/dist/config/locators/components/index.js +3 -0
  93. package/dist/config/locators/components/search/index.cjs +12 -0
  94. package/dist/config/locators/components/search/index.d.cts +7 -0
  95. package/dist/config/locators/components/search/index.d.ts +7 -0
  96. package/dist/config/locators/components/search/index.js +8 -0
  97. package/dist/config/locators/index.cjs +47 -0
  98. package/dist/config/locators/index.d.cts +24 -0
  99. package/dist/config/locators/index.d.ts +24 -0
  100. package/dist/config/locators/index.js +6 -0
  101. package/dist/contexts/index.cjs +15 -4
  102. package/dist/contexts/index.d.cts +9 -1
  103. package/dist/contexts/index.d.ts +12 -4
  104. package/dist/contexts/index.js +15 -4
  105. package/dist/{contexts-Dq7tO_0y.js → contexts-DO75-Kmx.js} +19 -4326
  106. package/dist/{contexts-C4Iz162H.cjs → contexts-iAzSvZjb.cjs} +188 -4488
  107. package/dist/{coterie-FybYN_xE.js → coterie-BGT8hqFR.js} +18 -7
  108. package/dist/{coterie-DUdvJvAs.cjs → coterie-Cp9FAJTQ.cjs} +25 -14
  109. package/dist/customerService-CUyZzowx.js +22 -0
  110. package/dist/customerService-DqPw_XKf.cjs +35 -0
  111. package/dist/custservice-types-D8Npo-5Z.js +22 -0
  112. package/dist/custservice-types-E9_OSaZ7.cjs +34 -0
  113. package/dist/{default-CKyjzyLc.cjs → default-BAXPatxf.cjs} +1 -1
  114. package/dist/default-BR3225LZ.js +4 -0
  115. package/dist/default-DR6YjE9B.cjs +4 -0
  116. package/dist/{default-CL94oJfj.js → default-wf_IORgo.js} +1 -1
  117. package/dist/divIds-BWvq-i6I.js +22 -0
  118. package/dist/{divIds-BOqjn3bE.cjs → divIds-CFyAjjp3.cjs} +6 -79
  119. package/dist/{dreamlandBaby-C8yzW4Nl.cjs → dreamlandBaby-BzuMvUFS.cjs} +28 -18
  120. package/dist/{dreamlandBaby-WXcbsTXO.js → dreamlandBaby-DZvM81LQ.js} +17 -7
  121. package/dist/embedded-BlXJUbik.cjs +130 -0
  122. package/dist/embedded-C1jvFj3v.js +22 -0
  123. package/dist/events/index.cjs +4 -0
  124. package/dist/events/index.d.cts +45 -0
  125. package/dist/events/index.d.ts +45 -0
  126. package/dist/events/index.js +3 -0
  127. package/dist/events-ClCDFK7t.js +77 -0
  128. package/dist/events-Da7gpmGv.cjs +89 -0
  129. package/dist/featureFlagService-CroFRxvD.d.cts +17 -0
  130. package/dist/featureFlagService-NkJ2fuEj.d.ts +17 -0
  131. package/dist/featureGates-BMWXU0dS.d.ts +90 -0
  132. package/dist/featureGates-N_gyHCTn.d.cts +90 -0
  133. package/dist/{fiveCbd-CZYzZPl3.cjs → fiveCbd-DE-tDY3d.cjs} +32 -22
  134. package/dist/{fiveCbd-kl6CoxoF.js → fiveCbd-HNBPqPtX.js} +17 -7
  135. package/dist/{forLoveAndLemons-BD2qh-6B.js → forLoveAndLemons-BKmJJ9pq.js} +13 -5
  136. package/dist/{forLoveAndLemons-BNu-PfFB.cjs → forLoveAndLemons-BeVEBOiu.cjs} +17 -9
  137. package/dist/{types-DGoFEos_.d.cts → frontendConfig-KeNqU1wa.d.cts} +39 -275
  138. package/dist/{types-D4vlfTd0.d.ts → frontendConfig-cPvCTWm6.d.ts} +39 -275
  139. package/dist/globalSearch-BC0rOX3E.js +13 -0
  140. package/dist/globalSearch-hxbXekus.cjs +38 -0
  141. package/dist/{greenpan-LDDXZTsh.js → greenpan-BX1viAZB.js} +17 -7
  142. package/dist/{greenpan-D6fDmjU8.cjs → greenpan-chd3aa5I.cjs} +30 -20
  143. package/dist/{grooveLife-D-1qfxwj.js → grooveLife-CHot3rZw.js} +18 -8
  144. package/dist/{grooveLife-CcylXabB.cjs → grooveLife-DEob7rK0.cjs} +29 -19
  145. package/dist/{homegrownCannabis-BEZzwFlm.cjs → homegrownCannabis-CoIjcehi.cjs} +27 -16
  146. package/dist/{homegrownCannabis-BScZhy9v.js → homegrownCannabis-CwkS1qDA.js} +17 -6
  147. package/dist/hooks/index.cjs +15 -4
  148. package/dist/hooks/index.d.cts +15 -305
  149. package/dist/hooks/index.d.ts +15 -306
  150. package/dist/hooks/index.js +15 -4
  151. package/dist/index-BdNKc2ix.d.cts +8 -0
  152. package/dist/index-BkhvV8RZ.d.cts +202 -0
  153. package/dist/index-BrXuc_Ck.d.cts +24 -0
  154. package/dist/index-C4zjAR1c.d.cts +227 -0
  155. package/dist/index-CGB6CAmr.d.ts +6 -0
  156. package/dist/index-CIco0cCQ.d.ts +183 -0
  157. package/dist/index-COG1kOZG.d.ts +749 -0
  158. package/dist/index-CVxe7FpL.d.cts +6 -0
  159. package/dist/index-Cn1SeI5y.d.cts +183 -0
  160. package/dist/index-Cqg6ltII.d.ts +38 -0
  161. package/dist/index-CzMrMKx-.d.ts +202 -0
  162. package/dist/index-DE_7Q8qK.d.ts +94 -0
  163. package/dist/index-Da0UzyI9.d.ts +24 -0
  164. package/dist/index-DbWWcYax.d.cts +749 -0
  165. package/dist/index-DtoVXd6O.d.cts +97 -0
  166. package/dist/index-JClBRnSX.d.cts +94 -0
  167. package/dist/index-ghzD_356.d.ts +8 -0
  168. package/dist/index-hdbCEjYy.d.cts +38 -0
  169. package/dist/index-luJrHgPN.d.ts +97 -0
  170. package/dist/index-tfRj22E1.d.ts +227 -0
  171. package/dist/interceptors/index.cjs +14 -0
  172. package/dist/interceptors/index.d.cts +25 -0
  173. package/dist/interceptors/index.d.ts +25 -0
  174. package/dist/interceptors/index.js +13 -0
  175. package/dist/{jackArcher-cJJVulZ9.js → jackArcher-BA-pkB4A.js} +17 -7
  176. package/dist/{jackArcher-BwMClqMP.cjs → jackArcher-bewC0q1T.cjs} +34 -24
  177. package/dist/{jordanCraig-DGsCO2o1.cjs → jordanCraig-B5k9nlAw.cjs} +77 -67
  178. package/dist/{jordanCraig-DNDMT0hn.js → jordanCraig-BsQ1mYbt.js} +17 -7
  179. package/dist/{kindredBravely-ROyesnVk.js → kindredBravely-BxYkCpGY.js} +16 -6
  180. package/dist/{kindredBravely-wV2XT1r_.cjs → kindredBravely-DsN0fo3s.cjs} +27 -17
  181. package/dist/{kutFromTheKloth-B6GR8tO9.cjs → kutFromTheKloth-BQTCu3ct.cjs} +28 -18
  182. package/dist/{kutFromTheKloth-BCUOHegv.js → kutFromTheKloth-bukOQM3P.js} +17 -7
  183. package/dist/{larryAndSerges-CqS02fnX.js → larryAndSerges-D1ecaT5a.js} +14 -5
  184. package/dist/{larryAndSerges-CIqB9tKz.cjs → larryAndSerges-bj7fgy9b.cjs} +21 -12
  185. package/dist/{leapsAndRebounds-CFj9F_z1.cjs → leapsAndRebounds-BfneG_0c.cjs} +30 -20
  186. package/dist/{leapsAndRebounds-j4YqSvNb.js → leapsAndRebounds-DhNpZETg.js} +17 -7
  187. package/dist/locators-C2DX_nX6.js +1 -0
  188. package/dist/locators-CUpyd9Wt.cjs +0 -0
  189. package/dist/logger-Dln20ans.cjs +25 -0
  190. package/dist/logger-pdEEY8T2.js +19 -0
  191. package/dist/{longevityrx-9sUQZCVZ.js → longevityrx-CnoGcw0w.js} +17 -7
  192. package/dist/{longevityrx-C-Yc5LPR.cjs → longevityrx-D0goIuX0.cjs} +25 -15
  193. package/dist/{lookOptic-dbaaorhR.cjs → lookOptic-C4afLPZP.cjs} +25 -15
  194. package/dist/{lookOptic-CQryypdM.js → lookOptic-uJWIKpER.js} +17 -7
  195. package/dist/{mantraBrand-D5MTZ6Mj.cjs → mantraBrand-8JUlYtCE.cjs} +46 -36
  196. package/dist/{mantraBrand-CifBQtHp.js → mantraBrand-DuwKHM26.js} +18 -8
  197. package/dist/{medterra-DhENCf-m.js → medterra-BQec8rzn.js} +17 -7
  198. package/dist/{medterra-BCrXdmFE.cjs → medterra-DH067P-V.cjs} +37 -27
  199. package/dist/{modells-aQrV10D7.js → modells-DAgLE2xo.js} +17 -7
  200. package/dist/{modells-C_P_894S.cjs → modells-DUFnLmAz.cjs} +31 -21
  201. package/dist/nodeSelector-DpKXszfU.d.ts +30 -0
  202. package/dist/nodeSelector-vKB44CDB.d.cts +30 -0
  203. package/dist/org-C11APG3v.js +63 -0
  204. package/dist/org-CnHL2I9B.cjs +106 -0
  205. package/dist/{pressedFloral-DErfwwl0.cjs → pressedFloral-DVZVfOSQ.cjs} +36 -26
  206. package/dist/{pressedFloral-D-amnTQK.js → pressedFloral-MdbuoRyA.js} +17 -7
  207. package/dist/search-CvHb1M3S.js +542 -0
  208. package/dist/search-bSYdOBhY.cjs +743 -0
  209. package/dist/search-filter-types-BsJjrxk0.d.ts +101 -0
  210. package/dist/search-filter-types-CqaGK3nM.d.cts +101 -0
  211. package/dist/{skinPerfection-DF6nQXjh.cjs → skinPerfection-BcEWICQN.cjs} +25 -15
  212. package/dist/{skinPerfection-DRVPJp3h.js → skinPerfection-bGiYxq1i.js} +17 -7
  213. package/dist/{snapSupplements-CLZjItJi.cjs → snapSupplements-BXSXTjqF.cjs} +25 -15
  214. package/dist/{snapSupplements-Yxs4jgC-.js → snapSupplements-D7hHhdC9.js} +17 -7
  215. package/dist/{spanx-DVDyAyFC.js → spanx-5-0yX3iK.js} +19 -9
  216. package/dist/{spanx-Cpbot5J5.cjs → spanx-lUzP6Lva.cjs} +31 -21
  217. package/dist/{spanxStaging-DAiFEMRU.js → spanxStaging-HglCMJag.js} +19 -9
  218. package/dist/{spanxStaging-DbaVonN6.cjs → spanxStaging-hreMR0MS.cjs} +35 -25
  219. package/dist/suggestionBarV2-types-B0RbMStE.js +9 -0
  220. package/dist/suggestionBarV2-types-DG3Ekk44.cjs +15 -0
  221. package/dist/{supergoop-C4McrZPT.js → supergoop-C9DDT3lY.js} +18 -7
  222. package/dist/{supergoop-B5VQlsoe.cjs → supergoop-CkjtuRck.cjs} +29 -18
  223. package/dist/test-types-C9b_OdfO.d.ts +39 -0
  224. package/dist/test-types-CpKCxk8U.d.cts +39 -0
  225. package/dist/types/index.cjs +6 -0
  226. package/dist/types/index.d.cts +3 -0
  227. package/dist/types/index.d.ts +3 -0
  228. package/dist/types/index.js +4 -0
  229. package/dist/types-BE4faOO_.d.cts +32 -0
  230. package/dist/{types-QJObznro.cjs → types-BUjohkXp.cjs} +58 -58
  231. package/dist/{types-DZzSQ5a6.js → types-BVsTRyxL.js} +58 -58
  232. package/dist/types-TD8g7LnH.d.ts +32 -0
  233. package/dist/{uniqueVintage-BLp_UtBR.cjs → uniqueVintage-DIMGtYAU.cjs} +47 -37
  234. package/dist/{uniqueVintage-CS4TgOJW.js → uniqueVintage-DPWA5Ed6.js} +17 -7
  235. package/dist/useMessageInterceptor-B-P_rw73.cjs +72 -0
  236. package/dist/useMessageInterceptor-C2RZM-fo.js +57 -0
  237. package/dist/utilityTypes-BVikejDo.js +1 -0
  238. package/dist/utilityTypes-C4h2wgAK.cjs +0 -0
  239. package/dist/variant-BGjOVpY3.d.cts +12 -0
  240. package/dist/variant-XITncuI3.d.ts +12 -0
  241. package/dist/variantInfo-CNRTY0gH.cjs +0 -0
  242. package/dist/variantInfo-CzhR5W6h.js +1 -0
  243. package/dist/{venaCbd-DfnFV7Qp.js → venaCbd-B-znfAsl.js} +17 -7
  244. package/dist/{venaCbd-BxmadOeJ.cjs → venaCbd-BOwOtpOz.cjs} +30 -20
  245. package/dist/{westonJonBoucher-BZdusJgo.cjs → westonJonBoucher-CraTzRVt.cjs} +30 -20
  246. package/dist/{westonJonBoucher-C0FE4Wup.js → westonJonBoucher-DCRagGu3.js} +17 -7
  247. package/dist/{wineEnthusiast-CmhNg47M.js → wineEnthusiast-Bv7umajk.js} +17 -7
  248. package/dist/{wineEnthusiast-DQxdV8Yg.cjs → wineEnthusiast-sVuATrq6.cjs} +29 -19
  249. package/dist/{wolfMattress-vMvqmwgI.js → wolfMattress-BUH-Rhov.js} +17 -6
  250. package/dist/{wolfMattress-CqyOUgPB.cjs → wolfMattress-DpVHIEnJ.cjs} +29 -18
  251. package/dist/{wolfTactical-q3TVDP85.cjs → wolfTactical-BcvF_sy-.cjs} +29 -19
  252. package/dist/{wolfTactical-DvqxZtoA.js → wolfTactical-Q14A1fpw.js} +17 -7
  253. package/package.json +101 -3
  254. package/src/adapters/amplitude/amplitudeAdapter.ts +1 -1
  255. package/src/adapters/spiffy/commerce/api.ts +1 -1
  256. package/src/adapters/spiffy/commerce/graphql.ts +61 -37
  257. package/src/application/config/index.ts +1 -0
  258. package/src/application/models/index.ts +102 -17
  259. package/src/application/models/supportedOrgs.ts +89 -65
  260. package/src/application/service/index.ts +32 -0
  261. package/src/application/service/pageVariantService.ts +201 -114
  262. package/src/application/service/searchService.ts +1 -1
  263. package/src/application/service/windowFrontendConfigService.ts +40 -18
  264. package/src/application/utils/index.ts +22 -3
  265. package/src/atoms/app/variant.ts +48 -29
  266. package/src/atoms/atomStore/index.ts +1 -0
  267. package/src/atoms/chat/messageQueue.ts +34 -17
  268. package/src/atoms/chat/performanceMetrics.ts +51 -38
  269. package/src/atoms/chat/renderedWidgetRefs.ts +14 -15
  270. package/src/atoms/globalSearch/index.ts +1 -0
  271. package/src/atoms/org/org.ts +1 -3
  272. package/src/atoms/org/orgUIConfig.ts +31 -24
  273. package/src/contexts/chatContext.tsx +124 -72
  274. package/src/events/registerAnalyticsListeners.ts +13 -9
  275. package/src/hooks/useFileUpload.ts +9 -7
  276. package/src/hooks/useSearch.tsx +3 -3
  277. package/src/initialize.ts +1 -1
  278. package/src/interceptors/index.ts +3 -0
  279. package/src/main.tsx +1 -1
  280. package/src/types/index.ts +4 -0
  281. package/dist/GridInsertionService-C00upKLB.js +0 -40
  282. package/dist/GridInsertionService-CMJVhD6q.cjs +0 -52
  283. package/dist/custservice-types-BgjGHCtD.cjs +0 -16
  284. package/dist/custservice-types-V6FWABp4.js +0 -10
  285. package/dist/default-DMtAjA62.cjs +0 -4
  286. package/dist/default-zcmT2032.js +0 -4
  287. package/dist/divIds-Cfp3v_rG.js +0 -35
  288. package/dist/domInsertionService-BtzuH2Sc.js +0 -65
  289. package/dist/domInsertionService-Cb9814oM.cjs +0 -89
  290. package/dist/suggestionBarV2-types-XHYD3j8E.cjs +0 -46
  291. package/dist/suggestionBarV2-types-aiQmVx5m.js +0 -34
  292. package/src/atoms/index.ts +0 -5
  293. package/src/index.ts +0 -31
  294. /package/dist/{cdnService-CAyO3axV.js → cdnService-DvDSpfVJ.js} +0 -0
  295. /package/dist/{cdnService-DIF1i7VC.cjs → cdnService-dJU3sHpF.cjs} +0 -0
  296. /package/dist/{entrypoints-RmIbdYxh.js → entrypoints-CmmOszXO.js} +0 -0
  297. /package/dist/{entrypoints-C8JwiMYA.cjs → entrypoints-fowCLUT2.cjs} +0 -0
  298. /package/dist/{socialProofClasses-CaA83vI4.cjs → socialProofClasses-BYLiEXpU.cjs} +0 -0
  299. /package/dist/{socialProofClasses-KB7zOMmg.js → socialProofClasses-CkJufEGb.js} +0 -0
  300. /package/src/atoms/{atomStore.ts → atomStore/atomStore.ts} +0 -0
  301. /package/src/atoms/{globalSearch.ts → globalSearch/globalSearch.ts} +0 -0
@@ -1,11 +1,11 @@
1
- import { atom } from 'jotai';
2
- import { FeatureGates, getOrgInfo } from 'src/application/models';
3
- import { findCustomerServiceImpl } from 'src/application/service/customerService';
4
- import { CustomerServiceIntegrationMode } from 'src/application/service/customerService/types';
5
- import { featureFlagServiceAtom, orgShortNameAtom } from 'src/atoms/org/org';
6
- import { OrgUIConfig } from 'src/contexts/types';
7
- import { getAtomStore } from 'src/atoms/atomStore';
8
- import Logger from 'src/application/logging/logger';
1
+ import { atom } from "jotai";
2
+ import { FeatureGates, getOrgInfo } from "src/application/models";
3
+ import { findCustomerServiceImpl } from "src/application/service/customerService";
4
+ import { CustomerServiceIntegrationMode } from "src/application/service/customerService/types";
5
+ import { featureFlagServiceAtom, orgShortNameAtom } from "src/atoms/org/org";
6
+ import { OrgUIConfig } from "src/contexts/types";
7
+ import { getAtomStore } from "src/atoms/atomStore/atomStore";
8
+ import Logger from "src/application/logging/logger";
9
9
 
10
10
  const getCustomerServiceIntegrationMode = ({
11
11
  integrationMode,
@@ -18,7 +18,9 @@ const getCustomerServiceIntegrationMode = ({
18
18
  return integrationMode;
19
19
  }
20
20
  // Only allow CustomerServiceIntegrationMode.full if `isNewFeatureEnabled` is also true
21
- return isNewFeatureEnabled ? integrationMode : CustomerServiceIntegrationMode.simple;
21
+ return isNewFeatureEnabled
22
+ ? integrationMode
23
+ : CustomerServiceIntegrationMode.simple;
22
24
  };
23
25
 
24
26
  const internalOrgUIConfigAtom = atom<OrgUIConfig | undefined>(undefined);
@@ -30,16 +32,16 @@ export const orgUIConfigAtom = atom(
30
32
  return orgUIConfig;
31
33
  }
32
34
 
33
- throw new Error('OrgUIConfig is referenced before it is set');
35
+ throw new Error("OrgUIConfig is referenced before it is set");
34
36
  },
35
37
  (_, set, value: OrgUIConfig) => {
36
38
  set(internalOrgUIConfigAtom, value);
37
- },
39
+ }
38
40
  );
39
41
 
40
42
  export const getOrgUIConfig = async (
41
- graphqlOrgUIConfig?: Omit<OrgUIConfig, 'merchantOverrideCss'>,
42
- graphqlMerchantOverrideCss?: string,
43
+ graphqlOrgUIConfig?: Omit<OrgUIConfig, "merchantOverrideCss">,
44
+ graphqlMerchantOverrideCss?: string
43
45
  ) => {
44
46
  const atomStore = getAtomStore();
45
47
  const orgShortName = atomStore.get(orgShortNameAtom);
@@ -47,18 +49,21 @@ export const getOrgUIConfig = async (
47
49
  const localOrgUIConfig = orgInfo.orgUIConfig() ?? {};
48
50
  const featureFlagService = atomStore.get(featureFlagServiceAtom);
49
51
  const isNewFeatureEnabled = featureFlagService.isFeatureGateEnabled(
50
- FeatureGates.IsNewFeatureEnabled,
52
+ FeatureGates.IsNewFeatureEnabled
53
+ );
54
+ const enableWatermark = featureFlagService.isFeatureGateEnabled(
55
+ FeatureGates.IsWatermarkEnabled
51
56
  );
52
- const enableWatermark = featureFlagService.isFeatureGateEnabled(FeatureGates.IsWatermarkEnabled);
53
57
  const userQueryAwaysEnabled = featureFlagService.isFeatureGateEnabled(
54
- FeatureGates.IsUserQueryAlwaysEnabled,
58
+ FeatureGates.IsUserQueryAlwaysEnabled
55
59
  );
56
60
  const isGraphQLUIConfigsEnabled = featureFlagService.isFeatureGateEnabled(
57
- FeatureGates.IsGraphQLUIConfigsEnabled,
58
- );
59
- const isGraphQLComponentConfigsEnabled = featureFlagService.isFeatureGateEnabled(
60
- FeatureGates.IsGraphQLComponentConfigsEnabled,
61
+ FeatureGates.IsGraphQLUIConfigsEnabled
61
62
  );
63
+ const isGraphQLComponentConfigsEnabled =
64
+ featureFlagService.isFeatureGateEnabled(
65
+ FeatureGates.IsGraphQLComponentConfigsEnabled
66
+ );
62
67
 
63
68
  let orgUIConfig: Partial<OrgUIConfig> = { ...localOrgUIConfig };
64
69
 
@@ -76,7 +81,7 @@ export const getOrgUIConfig = async (
76
81
  };
77
82
  }
78
83
 
79
- Logger.logInfo('[spiffy-ai] Feature gate enableWatermark check', {
84
+ Logger.logInfo("[spiffy-ai] Feature gate enableWatermark check", {
80
85
  enableWatermark,
81
86
  floatingChatConfig: orgUIConfig.floatingChatConfig,
82
87
  });
@@ -103,9 +108,11 @@ export const getOrgUIConfig = async (
103
108
  // Only enable the watermark if it is enabled in config and through featureFlag.
104
109
  // This enables a quick "off-switch" in case a merchant tells us to turn it off
105
110
  // quickly. This can be removed once the config is moved to the backend
106
- enableWatermark: orgUIConfig.floatingChatConfig?.enableWatermark && enableWatermark,
111
+ enableWatermark:
112
+ orgUIConfig.floatingChatConfig?.enableWatermark && enableWatermark,
107
113
  userQueryInputEnabled:
108
- orgUIConfig.floatingChatConfig?.userQueryInputEnabled || userQueryAwaysEnabled,
114
+ orgUIConfig.floatingChatConfig?.userQueryInputEnabled ||
115
+ userQueryAwaysEnabled,
109
116
  },
110
117
  } as OrgUIConfig;
111
118
 
@@ -113,7 +120,7 @@ export const getOrgUIConfig = async (
113
120
  };
114
121
 
115
122
  export const orgCustomerServiceConfig = atom(
116
- (get) => get(orgUIConfigAtom).customerServiceIntegration,
123
+ (get) => get(orgUIConfigAtom).customerServiceIntegration
117
124
  );
118
125
 
119
126
  export const orgCustomerServiceService = atom((get) => {
@@ -1,20 +1,30 @@
1
- import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
2
- import { useAtom, useAtomValue, useSetAtom } from 'jotai';
3
- import { createContext, useEffect, useState, ReactNode, useCallback, useMemo } from 'react';
4
- import CommerceApiClient from 'src/adapters/spiffy/commerce/api';
5
- import { v4 as uuid } from 'uuid';
6
- import { SessionRestartRequired } from 'src/adapters/spiffy/commerce/exceptions/sessionExceptions';
7
- import Logger from 'src/application/logging/logger';
1
+ import { UserEventCategory } from "@spiffy-ai/commerce-api-client";
2
+ import { useAtom, useAtomValue, useSetAtom } from "jotai";
3
+ import {
4
+ createContext,
5
+ useEffect,
6
+ useState,
7
+ ReactNode,
8
+ useCallback,
9
+ useMemo,
10
+ } from "react";
11
+ import CommerceApiClient from "src/adapters/spiffy/commerce/api";
12
+ import { v4 as uuid } from "uuid";
13
+ import { SessionRestartRequired } from "src/adapters/spiffy/commerce/exceptions/sessionExceptions";
14
+ import Logger from "src/application/logging/logger";
8
15
  import {
9
16
  Message,
10
17
  MessageRole,
11
18
  MessageType,
12
19
  NextMessageRequest,
13
20
  Response,
14
- } from 'src/application/models';
15
- import { AmplitudeAdapter, SpiffyMetricsEventName } from 'src/adapters/amplitude';
16
- import { messageFromResponse } from 'src/application/utils';
17
- import { chatIdAtom, userIdAtom, variantInfoAtom } from 'src/atoms/app';
21
+ } from "src/application/models";
22
+ import {
23
+ AmplitudeAdapter,
24
+ SpiffyMetricsEventName,
25
+ } from "src/adapters/amplitude";
26
+ import { messageFromResponse } from "src/application/utils";
27
+ import { chatIdAtom, userIdAtom, variantInfoAtom } from "src/atoms/app";
18
28
  import {
19
29
  messagesAtom,
20
30
  requestFailureAtom,
@@ -25,27 +35,28 @@ import {
25
35
  userEventsAtom,
26
36
  suggestionsLoadingAtom,
27
37
  suggestionsAtom,
28
- } from 'src/atoms/chat';
38
+ } from "src/atoms/chat";
29
39
  import {
30
40
  chatSearchProductSortingAtom,
31
41
  chatSearchProducts,
32
42
  chatSearchStateAtom,
33
43
  handleSearchResultsAtom,
34
44
  chatSearchIsLoadingAtom,
35
- } from 'src/atoms/search/chatSearch';
36
- import { orgIdAtom } from 'src/atoms/org/org';
37
- import { useSystemSettingsContext } from 'src/hooks';
38
- import { createAppLoadedEvent, createVisitUserEvent } from 'src/hooks/utils';
39
- import { useMessageInterceptor } from 'src/interceptors/useMessageInterceptor';
40
- import { supportedEventAtom } from 'src/atoms/app/variant';
41
- import { chatAtom, getAtomStore } from 'src/atoms';
45
+ } from "src/atoms/search/chatSearch";
46
+ import { orgIdAtom } from "src/atoms/org/org";
47
+ import { useSystemSettingsContext } from "src/hooks";
48
+ import { createAppLoadedEvent, createVisitUserEvent } from "src/hooks/utils";
49
+ import { useMessageInterceptor } from "src/interceptors/useMessageInterceptor";
50
+ import { supportedEventAtom } from "src/atoms/app/variant";
51
+ import { chatAtom } from "src/atoms/chat";
52
+ import { getAtomStore } from "src/atoms/atomStore";
42
53
  import {
43
54
  clearUserEventAtom,
44
55
  createResponsePayload,
45
56
  processUserEventAtom,
46
57
  userEventQueueAtom,
47
58
  userQueueEventCountAtom,
48
- } from 'src/atoms/chat/messageQueue';
59
+ } from "src/atoms/chat/messageQueue";
49
60
 
50
61
  /**
51
62
  * Record the chat assistant response in Amplitude
@@ -53,7 +64,10 @@ import {
53
64
  * @param startTimeMs The start time of the assistant response
54
65
  * @param payload The payload used to generate the response
55
66
  */
56
- const recordAssistantResponse = (startTimeMs: number, payload: NextMessageRequest) => {
67
+ const recordAssistantResponse = (
68
+ startTimeMs: number,
69
+ payload: NextMessageRequest
70
+ ) => {
57
71
  const atomStore = getAtomStore();
58
72
  const chatState = atomStore.get(chatAtom);
59
73
  const chatSearchState = atomStore.get(chatSearchStateAtom);
@@ -72,26 +86,31 @@ const recordAssistantResponse = (startTimeMs: number, payload: NextMessageReques
72
86
  }
73
87
 
74
88
  const eventProps: Record<string, unknown> = {
75
- response_time_ms: assistantResponseTimeMs.end - assistantResponseTimeMs.start,
89
+ response_time_ms:
90
+ assistantResponseTimeMs.end - assistantResponseTimeMs.start,
76
91
  user_event_type: chatState.replyEventCategory,
77
92
  user_query: userQueryProperty,
78
93
  };
79
94
 
80
95
  if (chatState.replyEventCategory === UserEventCategory.FormSubmitted) {
81
96
  const lastAssistantTurn = chatState.messages
82
- .filter((turn) => turn.length > 0 && turn[0].role === MessageRole.Assistant)
97
+ .filter(
98
+ (turn) => turn.length > 0 && turn[0].role === MessageRole.Assistant
99
+ )
83
100
  .pop();
84
101
  const formType = payload.userEvents?.find(
85
- (event) => event.category === UserEventCategory.FormSubmitted,
102
+ (event) => event.category === UserEventCategory.FormSubmitted
86
103
  )?.attributes.formType;
87
- const formStatus = lastAssistantTurn?.some((response) => response.type === MessageType.Order);
104
+ const formStatus = lastAssistantTurn?.some(
105
+ (response) => response.type === MessageType.Order
106
+ );
88
107
  eventProps.form_submitted_attributes = {
89
108
  form_type: formType,
90
- status: formStatus ? 'success' : 'failed',
109
+ status: formStatus ? "success" : "failed",
91
110
  };
92
111
  }
93
112
 
94
- if (chatSearchState === 'product-page') {
113
+ if (chatSearchState === "product-page") {
95
114
  eventProps.search_products_returned = searchProducts.length;
96
115
  eventProps.search_products_sort_type = searchProductsSort;
97
116
  }
@@ -109,13 +128,16 @@ const ChatContext = createContext<ChatContextParams | undefined>(undefined);
109
128
  const updateMessageState = (
110
129
  message: Message,
111
130
  lastMessage: Message,
112
- setMessages: (updater: (prev: Message[][]) => Message[][]) => void,
131
+ setMessages: (updater: (prev: Message[][]) => Message[][]) => void
113
132
  ): Message => {
114
133
  if (lastMessage == null) {
115
134
  setMessages((prev) => [...prev, [message]]);
116
135
  return message;
117
136
  }
118
- if (lastMessage.type === MessageType.Text && message.type === MessageType.Text) {
137
+ if (
138
+ lastMessage.type === MessageType.Text &&
139
+ message.type === MessageType.Text
140
+ ) {
119
141
  const newMessage = {
120
142
  ...lastMessage,
121
143
  metadata: {
@@ -132,14 +154,17 @@ const updateMessageState = (
132
154
  });
133
155
  return newMessage;
134
156
  }
135
- setMessages((prev) => [...prev.slice(0, prev.length - 1), [...prev[prev.length - 1], message]]);
157
+ setMessages((prev) => [
158
+ ...prev.slice(0, prev.length - 1),
159
+ [...prev[prev.length - 1], message],
160
+ ]);
136
161
  return message;
137
162
  };
138
163
 
139
164
  const handleStreamingError = (
140
165
  _error: unknown,
141
166
  setRequestFailure: (failed: boolean) => void,
142
- setMessages: (updater: (prev: Message[][]) => Message[][]) => void,
167
+ setMessages: (updater: (prev: Message[][]) => Message[][]) => void
143
168
  ) => {
144
169
  setRequestFailure(true);
145
170
  setMessages((prev) => [
@@ -161,11 +186,13 @@ const handleStreamingError = (
161
186
 
162
187
  const processStreamingResponse = async (
163
188
  stream: AsyncIterable<Response>,
164
- messageInterceptor: { intercept: (response?: Response) => boolean | undefined },
189
+ messageInterceptor: {
190
+ intercept: (response?: Response) => boolean | undefined;
191
+ },
165
192
  handleSearchResults: (message: Message) => void,
166
193
  setMessages: (updater: (prev: Message[][]) => Message[][]) => void,
167
194
  setSearchIsLoading: (loading: boolean) => void,
168
- chatId: string,
195
+ chatId: string
169
196
  ): Promise<{ hasSearchResults: boolean }> => {
170
197
  let lastMessage: Message | undefined;
171
198
  let hasSearchResults = false;
@@ -178,7 +205,7 @@ const processStreamingResponse = async (
178
205
 
179
206
  const message = messageFromResponse(response);
180
207
  if (!message) {
181
- throw new Error('Failed to transform API response to client message');
208
+ throw new Error("Failed to transform API response to client message");
182
209
  }
183
210
 
184
211
  if (message.type === MessageType.ProductSearch) {
@@ -195,7 +222,7 @@ const processStreamingResponse = async (
195
222
  {
196
223
  lastResponse: lastMessage,
197
224
  response,
198
- },
225
+ }
199
226
  );
200
227
  }
201
228
  }
@@ -211,8 +238,12 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
211
238
  const [messages, setMessages] = useAtom<Message[][]>(messagesAtom);
212
239
  const setUserEvents = useSetAtom(userEventsAtom);
213
240
  const setSuggestions = useSetAtom(suggestionsAtom);
214
- const [suggestionsLoading, setSuggestionsLoading] = useAtom<boolean>(suggestionsLoadingAtom);
215
- const [responseStreaming, setResponseStreaming] = useAtom<boolean>(responseStreamingAtom);
241
+ const [suggestionsLoading, setSuggestionsLoading] = useAtom<boolean>(
242
+ suggestionsLoadingAtom
243
+ );
244
+ const [responseStreaming, setResponseStreaming] = useAtom<boolean>(
245
+ responseStreamingAtom
246
+ );
216
247
  const setRequestFailure = useSetAtom(requestFailureAtom);
217
248
  const userEvents = useAtomValue(userEventQueueAtom);
218
249
  const userQueueEventCount = useAtomValue(userQueueEventCountAtom);
@@ -230,7 +261,9 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
230
261
  const setSearchIsLoading = useSetAtom(chatSearchIsLoadingAtom);
231
262
 
232
263
  const getStreamingResponses = useCallback(
233
- async (payload: NextMessageRequest): Promise<{ hasSearchResults: boolean }> => {
264
+ async (
265
+ payload: NextMessageRequest
266
+ ): Promise<{ hasSearchResults: boolean }> => {
234
267
  logPerfMetric(PerfMetricsEvents.FirstResponseStarted);
235
268
  const stream = CommerceApiClient.getNextResponseStreaming(payload);
236
269
 
@@ -243,7 +276,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
243
276
  handleSearchResults,
244
277
  setMessages,
245
278
  setSearchIsLoading,
246
- chatId,
279
+ chatId
247
280
  );
248
281
 
249
282
  return { hasSearchResults };
@@ -262,7 +295,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
262
295
  setMessages,
263
296
  setSearchIsLoading,
264
297
  chatId,
265
- ],
298
+ ]
266
299
  );
267
300
 
268
301
  const getSuggestions = useCallback(async () => {
@@ -274,13 +307,22 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
274
307
  userEvents: [],
275
308
  generationParams: settingsContext.generationParams,
276
309
  });
277
- const response = await CommerceApiClient.getNextSuggestions(payloadWithoutAppLoaded);
310
+ const response = await CommerceApiClient.getNextSuggestions(
311
+ payloadWithoutAppLoaded
312
+ );
278
313
 
279
314
  // sort the suggestions by shortest length so the pills can be stacked horizontally
280
- setSuggestions(response.sort((a, b) => a.content.length - b.content.length));
315
+ setSuggestions(
316
+ response.sort((a, b) => a.content.length - b.content.length)
317
+ );
281
318
  setSuggestionsLoading(false);
282
319
  logPerfMetric(PerfMetricsEvents.FirstSuggestionsCompleted);
283
- }, [logPerfMetric, setSuggestionsLoading, setSuggestions, settingsContext.generationParams]);
320
+ }, [
321
+ logPerfMetric,
322
+ setSuggestionsLoading,
323
+ setSuggestions,
324
+ settingsContext.generationParams,
325
+ ]);
284
326
 
285
327
  const getResponses = useCallback(
286
328
  async (payload?: NextMessageRequest) => {
@@ -301,7 +343,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
301
343
  recordAssistantResponse(startTimeMs, requestPayload);
302
344
  await getSuggestions();
303
345
  } catch (error) {
304
- Logger.logError('[spiffy-ai] getResponses error', error);
346
+ Logger.logError("[spiffy-ai] getResponses error", error);
305
347
  } finally {
306
348
  // Remove search loading management from here - it's now handled independently
307
349
  // in the processStreamingResponse function when search results are detected
@@ -319,7 +361,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
319
361
  markUserEventsProcessed,
320
362
  getSuggestions,
321
363
  setUserHasReplied,
322
- ],
364
+ ]
323
365
  );
324
366
 
325
367
  useEffect(() => {
@@ -329,25 +371,28 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
329
371
  }
330
372
 
331
373
  if (
332
- (variantInfo.variant === 'pdp' && !variantInfo.productId) ||
333
- (variantInfo.variant === 'plp' && !variantInfo.plpId) ||
334
- (variantInfo.variant === 'page_visit' && !variantInfo.url)
374
+ (variantInfo.variant === "pdp" && !variantInfo.productId) ||
375
+ (variantInfo.variant === "plp" && !variantInfo.plpId) ||
376
+ (variantInfo.variant === "page_visit" && !variantInfo.url)
335
377
  ) {
336
- Logger.logDebug('[spiffy-ai] variantInfo has invalid values, skipping...', {
337
- variantInfo,
338
- supportedEvent,
339
- });
378
+ Logger.logDebug(
379
+ "[spiffy-ai] variantInfo has invalid values, skipping...",
380
+ {
381
+ variantInfo,
382
+ supportedEvent,
383
+ }
384
+ );
340
385
  return;
341
386
  }
342
387
 
343
388
  Logger.logDebug(
344
- `Assistants Turn is_currently_streaming=${responseStreaming} initialized=${widgetInitialized}`,
389
+ `Assistants Turn is_currently_streaming=${responseStreaming} initialized=${widgetInitialized}`
345
390
  );
346
391
  try {
347
392
  await getResponses();
348
393
  Logger.logInfo(`Assistants Turn [finished]`);
349
394
  } catch (error: unknown) {
350
- Logger.logError('[spiffy-ai] Assistants Turn error', error);
395
+ Logger.logError("[spiffy-ai] Assistants Turn error", error);
351
396
  }
352
397
  };
353
398
  if (userQueueEventCount > 0) {
@@ -365,7 +410,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
365
410
  useEffect(() => {
366
411
  if (widgetInitialized || responseStreaming) {
367
412
  Logger.logDebug(
368
- `[spiffy-ai] initializeWidget [skipped] is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`,
413
+ `[spiffy-ai] initializeWidget [skipped] is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`
369
414
  );
370
415
  return;
371
416
  }
@@ -373,20 +418,20 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
373
418
  const hydrateChat = async () => {
374
419
  try {
375
420
  Logger.logDebug(
376
- `[spiffy-ai] initializeWidget is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`,
421
+ `[spiffy-ai] initializeWidget is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`
377
422
  );
378
423
  // on mount, try to get the responses from an active session if one exists
379
- const { messages: existingMessages, userEvents } = await CommerceApiClient.getResponses(
380
- orgId,
381
- chatId,
382
- userId,
383
- );
424
+ const { messages: existingMessages, userEvents } =
425
+ await CommerceApiClient.getResponses(orgId, chatId, userId);
384
426
  setMessages([...existingMessages]);
385
427
  setUserEvents([...userEvents]);
386
428
  getResponses();
387
429
  } catch (error) {
388
430
  // no active chat session was found, start a new one
389
- Logger.logInfo(`Init chat [exception] chat_id=${chatId} error=${error}`, error);
431
+ Logger.logInfo(
432
+ `Init chat [exception] chat_id=${chatId} error=${error}`,
433
+ error
434
+ );
390
435
  if (error instanceof SessionRestartRequired) {
391
436
  const appLoadedEvent = createAppLoadedEvent();
392
437
  const visitEvent = createVisitUserEvent({ variantInfo });
@@ -411,11 +456,8 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
411
456
  const onFocus = useCallback(async () => {
412
457
  try {
413
458
  if (!responseStreaming && !suggestionsLoading) {
414
- const { messages: existingMessages } = await CommerceApiClient.getResponses(
415
- orgId,
416
- chatId,
417
- userId,
418
- );
459
+ const { messages: existingMessages } =
460
+ await CommerceApiClient.getResponses(orgId, chatId, userId);
419
461
 
420
462
  if (existingMessages.length > messages.length) {
421
463
  setMessages([...existingMessages]);
@@ -429,22 +471,32 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
429
471
  }
430
472
  }
431
473
  } catch (error: unknown) {
432
- Logger.logError('[spiffy-ai] onFocus error', error);
474
+ Logger.logError("[spiffy-ai] onFocus error", error);
433
475
  }
434
- }, [responseStreaming, suggestionsLoading, orgId, chatId, userId, messages.length, setMessages]);
476
+ }, [
477
+ responseStreaming,
478
+ suggestionsLoading,
479
+ orgId,
480
+ chatId,
481
+ userId,
482
+ messages.length,
483
+ setMessages,
484
+ ]);
435
485
 
436
486
  // listen for page focus to get latest messages from the server
437
487
  useEffect(() => {
438
- window.addEventListener('focus', onFocus);
488
+ window.addEventListener("focus", onFocus);
439
489
 
440
490
  return () => {
441
- window.removeEventListener('focus', onFocus);
491
+ window.removeEventListener("focus", onFocus);
442
492
  };
443
493
  }, [onFocus]);
444
494
 
445
495
  const chatContext = useMemo(() => ({}), []);
446
496
 
447
- return <ChatContext.Provider value={chatContext}>{children}</ChatContext.Provider>;
497
+ return (
498
+ <ChatContext.Provider value={chatContext}>{children}</ChatContext.Provider>
499
+ );
448
500
  };
449
501
 
450
502
  export { ChatContext, ChatContextProvider };
@@ -1,10 +1,13 @@
1
- import { AmplitudeAdapter, SpiffyMetricsEventName } from 'src/adapters/amplitude';
2
- import { getAtomStore } from 'src/atoms/atomStore';
1
+ import {
2
+ AmplitudeAdapter,
3
+ SpiffyMetricsEventName,
4
+ } from "src/adapters/amplitude";
5
+ import { getAtomStore } from "src/atoms/atomStore/atomStore";
3
6
  import {
4
7
  pageLoadOffsetTimeAtom,
5
8
  performanceMetricsAtom,
6
9
  resetPerformanceMetricsAtom,
7
- } from 'src/atoms/chat';
10
+ } from "src/atoms/chat";
8
11
 
9
12
  const registerPerformanceMetricsListener = () => {
10
13
  const atomStore = getAtomStore();
@@ -12,19 +15,19 @@ const registerPerformanceMetricsListener = () => {
12
15
  const pageLoadOffsetTime = atomStore.get(pageLoadOffsetTimeAtom);
13
16
 
14
17
  const handleVisibilityChange = () => {
15
- if (document.visibilityState === 'hidden' && performanceMetrics.size > 0) {
18
+ if (document.visibilityState === "hidden" && performanceMetrics.size > 0) {
16
19
  const perfMetricsProperties = Object.fromEntries(
17
20
  Array.from(performanceMetrics.entries()).map(([key, value]) => [
18
21
  `performanceMetrics.${key}`,
19
22
  value,
20
- ]),
23
+ ])
21
24
  );
22
25
 
23
26
  AmplitudeAdapter.trackEvent({
24
27
  eventName: SpiffyMetricsEventName.PerformanceMetrics,
25
28
  eventProps: {
26
29
  ...perfMetricsProperties,
27
- 'performance_metrics.page_load_offset_ms': pageLoadOffsetTime,
30
+ "performance_metrics.page_load_offset_ms": pageLoadOffsetTime,
28
31
  },
29
32
  });
30
33
  resetPerformanceMetricsAtom();
@@ -33,15 +36,16 @@ const registerPerformanceMetricsListener = () => {
33
36
 
34
37
  // do not use anything other than visibilitychange to detect when a page or
35
38
  // session has ended as other events may not fire in all browsers/devices
36
- window.addEventListener('visibilitychange', handleVisibilityChange);
39
+ window.addEventListener("visibilitychange", handleVisibilityChange);
37
40
 
38
41
  return () => {
39
- window.removeEventListener('visibilitychange', handleVisibilityChange);
42
+ window.removeEventListener("visibilitychange", handleVisibilityChange);
40
43
  };
41
44
  };
42
45
 
43
46
  export const registerAnalyticsListeners = () => {
44
- const cleanupPerformanceMetricsListener = registerPerformanceMetricsListener();
47
+ const cleanupPerformanceMetricsListener =
48
+ registerPerformanceMetricsListener();
45
49
 
46
50
  return () => {
47
51
  cleanupPerformanceMetricsListener();
@@ -1,14 +1,16 @@
1
- import { AttachmentRequest } from '@spiffy-ai/commerce-api-client';
2
- import { useAtom, useAtomValue } from 'jotai';
3
- import { useRef, useState } from 'react';
4
- import { customerServiceAttachment } from 'src/atoms';
5
- import { orgCustomerServiceService } from 'src/atoms/org/orgUIConfig';
1
+ import { AttachmentRequest } from "@spiffy-ai/commerce-api-client";
2
+ import { useAtom, useAtomValue } from "jotai";
3
+ import { useRef, useState } from "react";
4
+ import {
5
+ orgCustomerServiceService,
6
+ customerServiceAttachment,
7
+ } from "src/atoms/org";
6
8
 
7
9
  export const useFileUpload = () => {
8
10
  const fileInputRef = useRef(null);
9
11
  const [attachment, setAttachment] = useAtom(customerServiceAttachment);
10
12
  const customerServiceImpl = useAtomValue(orgCustomerServiceService);
11
- const [error, setError] = useState('');
13
+ const [error, setError] = useState("");
12
14
 
13
15
  const isValidFile = (file?: File) => {
14
16
  const maxSize = customerServiceImpl.maxfileUploadSize;
@@ -41,7 +43,7 @@ export const useFileUpload = () => {
41
43
  if (attachment) {
42
44
  return {
43
45
  ...attachment,
44
- base64_content: attachment?.base64_content.split(',')[1],
46
+ base64_content: attachment?.base64_content.split(",")[1],
45
47
  } as AttachmentRequest;
46
48
  }
47
49
  };
@@ -7,7 +7,6 @@ import {
7
7
  clearSearchFiltersAtom,
8
8
  createFilterOption,
9
9
  filteredSearchProductsAtom,
10
- orgUIConfigAtom,
11
10
  performSearchAtom,
12
11
  removeSearchFilterAtom,
13
12
  searchAtom,
@@ -16,11 +15,11 @@ import {
16
15
  searchProductSortingAtom,
17
16
  searchSelectedFiltersAtom,
18
17
  SelectedFilterOption,
19
- } from "src/atoms";
18
+ } from "src/atoms/search";
20
19
  import {
21
20
  autocompleteStateAtom,
22
21
  isFilterOpenAtom,
23
- } from "src/atoms/globalSearch";
22
+ } from "src/atoms/globalSearch/globalSearch";
24
23
  import { formatFilterDisplayName } from "src/atoms/search/utils";
25
24
  import { ProductSorting } from "src/atoms/search/types";
26
25
  import {
@@ -34,6 +33,7 @@ import { SearchResult } from "src/application/models/api/search";
34
33
  import { SearchResponseProduct } from "@spiffy-ai/commerce-api-client";
35
34
  import { SearchFilter, SelectFilterItem } from "src/types/search-filter-types";
36
35
  import { getSearchResultsState, SearchResultsState } from "./utils";
36
+ import { orgUIConfigAtom } from "src/atoms/org";
37
37
 
38
38
  export interface SearchResultsHocProps {
39
39
  // Data
package/src/initialize.ts CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  initAmplitude,
12
12
  initDataLayerWrapper,
13
13
  } from "src/application/utils/analyticsUtils";
14
- import { getAtomStore } from "src/atoms/atomStore";
14
+ import { getAtomStore } from "src/atoms/atomStore/atomStore";
15
15
  import {
16
16
  apiKeyAtom,
17
17
  featureFlagServiceAtom,
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./useFormEscalation";
3
+ export * from "./useMessageInterceptor";
package/src/main.tsx CHANGED
@@ -2,7 +2,7 @@ import ReactDOM from "react-dom/client";
2
2
  import Logger from "./application/logging/logger";
3
3
  import { EventsDispatcher, SpiffyEvent } from "./events";
4
4
  import { PerfMetricsEvents, logPerfMetricAtom } from "./atoms/chat";
5
- import { getAtomStore } from "./atoms/atomStore";
5
+ import { getAtomStore } from "./atoms/atomStore/atomStore";
6
6
  import { getAsyncOrgConfig } from "./atoms/org";
7
7
  import {
8
8
  getOrgInfo as getOrgInfoFromSupportedOrgs,