@fluid-app/portal-sdk 0.1.248 → 0.1.249

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 (235) hide show
  1. package/dist/{fluid-pay-api-adapter-CJ7-I8k-.mjs → AddressAutocompleteInput-B0qLrCHN.mjs} +153 -3
  2. package/dist/AddressAutocompleteInput-B0qLrCHN.mjs.map +1 -0
  3. package/dist/{fluid-pay-api-adapter-D63KLi5c.cjs → AddressAutocompleteInput-CbpNjpwB.cjs} +157 -1
  4. package/dist/AddressAutocompleteInput-CbpNjpwB.cjs.map +1 -0
  5. package/dist/{AlertWidget-CbhrQa9Z.mjs → AlertWidget-CcIBGBik.mjs} +3 -3
  6. package/dist/{AlertWidget-CbhrQa9Z.mjs.map → AlertWidget-CcIBGBik.mjs.map} +1 -1
  7. package/dist/{AppDownloadScreen-DPnbWP5G.mjs → AppDownloadScreen-ZxlnSAZ6.mjs} +3 -3
  8. package/dist/{AppDownloadScreen-DPnbWP5G.mjs.map → AppDownloadScreen-ZxlnSAZ6.mjs.map} +1 -1
  9. package/dist/{AppNavigationContext-DNod9mf6.mjs → AppNavigationContext-BcZZMtV6.mjs} +1 -1
  10. package/dist/{AppNavigationContext-DNod9mf6.mjs.map → AppNavigationContext-BcZZMtV6.mjs.map} +1 -1
  11. package/dist/{BulletListWidget-qvZIZ_B-.mjs → BulletListWidget-mRwUgtzN.mjs} +3 -3
  12. package/dist/{BulletListWidget-qvZIZ_B-.mjs.map → BulletListWidget-mRwUgtzN.mjs.map} +1 -1
  13. package/dist/{CalendarWidget-C03VcDLQ.mjs → CalendarWidget-Cn3Ngl8_.mjs} +5 -5
  14. package/dist/{CalendarWidget-C03VcDLQ.mjs.map → CalendarWidget-Cn3Ngl8_.mjs.map} +1 -1
  15. package/dist/{CardWidget-2wcjCf2M.mjs → CardWidget-DHTqvQPa.mjs} +4 -4
  16. package/dist/{CardWidget-2wcjCf2M.mjs.map → CardWidget-DHTqvQPa.mjs.map} +1 -1
  17. package/dist/{CarouselWidget-Cn5P4FVN.mjs → CarouselWidget-C0X-nFyW.mjs} +5 -5
  18. package/dist/{CarouselWidget-Cn5P4FVN.mjs.map → CarouselWidget-C0X-nFyW.mjs.map} +1 -1
  19. package/dist/{CatchUpWidget-B9CI7lq0.mjs → CatchUpWidget-BkeZR91e.mjs} +5 -5
  20. package/dist/{CatchUpWidget-B9CI7lq0.mjs.map → CatchUpWidget-BkeZR91e.mjs.map} +1 -1
  21. package/dist/{ChartWidget-obje-Xj9.mjs → ChartWidget-Ci4Q0Ig-.mjs} +4 -4
  22. package/dist/{ChartWidget-obje-Xj9.mjs.map → ChartWidget-Ci4Q0Ig-.mjs.map} +1 -1
  23. package/dist/{ContactsScreen-DuhDzRtI.mjs → ContactsScreen-Bq8zrA8k.mjs} +11 -11
  24. package/dist/{ContactsScreen-DuhDzRtI.mjs.map → ContactsScreen-Bq8zrA8k.mjs.map} +1 -1
  25. package/dist/{ContainerWidget-DNenbORS.mjs → ContainerWidget-cbX_KEOQ.mjs} +4 -4
  26. package/dist/{ContainerWidget-DNenbORS.mjs.map → ContainerWidget-cbX_KEOQ.mjs.map} +1 -1
  27. package/dist/{CustomersScreen-BJOBG5f5.mjs → CustomersScreen-0uI1R9lm.mjs} +2 -2
  28. package/dist/{CustomersScreen-BJOBG5f5.mjs.map → CustomersScreen-0uI1R9lm.mjs.map} +1 -1
  29. package/dist/{EmbedWidget-LYnd3TZD.mjs → EmbedWidget-BwR9mICd.mjs} +3 -3
  30. package/dist/{EmbedWidget-LYnd3TZD.mjs.map → EmbedWidget-BwR9mICd.mjs.map} +1 -1
  31. package/dist/FluidProvider-DGxCCmVB.cjs +17240 -0
  32. package/dist/FluidProvider-DGxCCmVB.cjs.map +1 -0
  33. package/dist/FluidProvider-DS1QKy5j.mjs +6371 -0
  34. package/dist/FluidProvider-DS1QKy5j.mjs.map +1 -0
  35. package/dist/{ImageWidget-vNWT_O1E.mjs → ImageWidget-DmaAQZBK.mjs} +4 -4
  36. package/dist/{ImageWidget-vNWT_O1E.mjs.map → ImageWidget-DmaAQZBK.mjs.map} +1 -1
  37. package/dist/{InfiniteScrollSentinel-D0XRJi51.mjs → InfiniteScrollSentinel-BHIgNtHI.mjs} +2 -2
  38. package/dist/{InfiniteScrollSentinel-D0XRJi51.mjs.map → InfiniteScrollSentinel-BHIgNtHI.mjs.map} +1 -1
  39. package/dist/{LayoutWidget-UI5fbsx4.mjs → LayoutWidget-CxaMx1nd.mjs} +4 -4
  40. package/dist/{LayoutWidget-UI5fbsx4.mjs.map → LayoutWidget-CxaMx1nd.mjs.map} +1 -1
  41. package/dist/{LinkWidget-CO-Cxf7Z.mjs → LinkWidget-utkZrvAV.mjs} +5 -5
  42. package/dist/{LinkWidget-CO-Cxf7Z.mjs.map → LinkWidget-utkZrvAV.mjs.map} +1 -1
  43. package/dist/{ListWidget-f88QhcGI.mjs → ListWidget-CNAxW_3c.mjs} +6 -6
  44. package/dist/{ListWidget-f88QhcGI.mjs.map → ListWidget-CNAxW_3c.mjs.map} +1 -1
  45. package/dist/{MediaRenderer-DMdb_5xw.mjs → MediaRenderer-13Jlf38P.mjs} +1 -1
  46. package/dist/{MediaRenderer-DMdb_5xw.mjs.map → MediaRenderer-13Jlf38P.mjs.map} +1 -1
  47. package/dist/{MessagingScreen-DGhqsVXi.mjs → MessagingScreen-CJ_9yIHK.mjs} +9 -12
  48. package/dist/{MessagingScreen-DGhqsVXi.mjs.map → MessagingScreen-CJ_9yIHK.mjs.map} +1 -1
  49. package/dist/{MessagingScreen-CDiLGmMi.cjs → MessagingScreen-DeYSVcMd.cjs} +2 -2
  50. package/dist/{MessagingScreen-CDiLGmMi.cjs.map → MessagingScreen-DeYSVcMd.cjs.map} +1 -1
  51. package/dist/{MessagingScreen-BKb4mWGa.cjs → MessagingScreen-FHwytr8B.cjs} +3 -3
  52. package/dist/MessagingScreen-s7CL9vPN.mjs +47 -0
  53. package/dist/{MySiteScreen-CK84vXa9.mjs → MySiteScreen-DX8tBz8Z.mjs} +7 -7
  54. package/dist/{MySiteScreen-CK84vXa9.mjs.map → MySiteScreen-DX8tBz8Z.mjs.map} +1 -1
  55. package/dist/{MySiteWidget-CQNASVaF.mjs → MySiteWidget-C0n9cSw7.mjs} +5 -5
  56. package/dist/{MySiteWidget-CQNASVaF.mjs.map → MySiteWidget-C0n9cSw7.mjs.map} +1 -1
  57. package/dist/{NestedWidget-RuyrOrFn.mjs → NestedWidget-BMKtDP_4.mjs} +6 -6
  58. package/dist/{NestedWidget-RuyrOrFn.mjs.map → NestedWidget-BMKtDP_4.mjs.map} +1 -1
  59. package/dist/{OrdersScreen-b-ZC4_NI.mjs → OrdersScreen-B3vtWt8_.mjs} +7 -7
  60. package/dist/{OrdersScreen-b-ZC4_NI.mjs.map → OrdersScreen-B3vtWt8_.mjs.map} +1 -1
  61. package/dist/{PointsWidget-BwA6aGVZ.mjs → PointsWidget-CaWklfIH.mjs} +5 -5
  62. package/dist/{PointsWidget-BwA6aGVZ.mjs.map → PointsWidget-CaWklfIH.mjs.map} +1 -1
  63. package/dist/{PortalProductsApiProvider-BFdHFvog.mjs → PortalProductsApiProvider-CNAu2pAb.mjs} +2 -2
  64. package/dist/{PortalProductsApiProvider-BFdHFvog.mjs.map → PortalProductsApiProvider-CNAu2pAb.mjs.map} +1 -1
  65. package/dist/{PortalTenantClientProvider-CjJzBCTL.mjs → PortalTenantClientProvider-Bni6J3KS.mjs} +1 -1
  66. package/dist/{PortalTenantClientProvider-CjJzBCTL.mjs.map → PortalTenantClientProvider-Bni6J3KS.mjs.map} +1 -1
  67. package/dist/{ProfileScreen-DHv2Cjpz.cjs → ProfileScreen-BJzW-gC_.cjs} +4 -4
  68. package/dist/{ProfileScreen-BDLJgcXg.cjs → ProfileScreen-DucZeLWI.cjs} +40 -20
  69. package/dist/ProfileScreen-DucZeLWI.cjs.map +1 -0
  70. package/dist/{ProfileScreen-CmQDKNaP.mjs → ProfileScreen-IPuXlf9V.mjs} +33 -18
  71. package/dist/ProfileScreen-IPuXlf9V.mjs.map +1 -0
  72. package/dist/ProfileScreen-m3fTsHyw.mjs +48 -0
  73. package/dist/{QuickLinksWidget-CJqwiBJ7.mjs → QuickLinksWidget-D0b33oyn.mjs} +3 -3
  74. package/dist/{QuickLinksWidget-CJqwiBJ7.mjs.map → QuickLinksWidget-D0b33oyn.mjs.map} +1 -1
  75. package/dist/{QuickShareWidget-DKE7Tba2.mjs → QuickShareWidget-DJ0Y71om.mjs} +3 -3
  76. package/dist/{QuickShareWidget-DKE7Tba2.mjs.map → QuickShareWidget-DJ0Y71om.mjs.map} +1 -1
  77. package/dist/{RecentActivityWidget-D1AlZgfV.mjs → RecentActivityWidget-Rpj33TiN.mjs} +5 -5
  78. package/dist/{RecentActivityWidget-D1AlZgfV.mjs.map → RecentActivityWidget-Rpj33TiN.mjs.map} +1 -1
  79. package/dist/{ScreenHeaderContext-Cemdo7bM.mjs → ScreenHeaderContext-4WYXIqQ5.mjs} +1 -1
  80. package/dist/{ScreenHeaderContext-Cemdo7bM.mjs.map → ScreenHeaderContext-4WYXIqQ5.mjs.map} +1 -1
  81. package/dist/{ScreenRenderer-Cl2aAJ7D.mjs → ScreenRenderer-BQal-fnZ.mjs} +2 -2
  82. package/dist/{ScreenRenderer-Cl2aAJ7D.mjs.map → ScreenRenderer-BQal-fnZ.mjs.map} +1 -1
  83. package/dist/{SearchSort-CokMCrhy.mjs → SearchSort-B5Jrk5lW.mjs} +2 -2
  84. package/dist/{SearchSort-CokMCrhy.mjs.map → SearchSort-B5Jrk5lW.mjs.map} +1 -1
  85. package/dist/{SeparatorWidget-gVlyr1MV.mjs → SeparatorWidget-Bgzsloji.mjs} +3 -3
  86. package/dist/{SeparatorWidget-gVlyr1MV.mjs.map → SeparatorWidget-Bgzsloji.mjs.map} +1 -1
  87. package/dist/ShareablesScreen-Cd8chxk4.mjs +13 -0
  88. package/dist/{ShareablesScreen-BZZ-RT71.mjs → ShareablesScreen-NMoZH9ed.mjs} +14 -18
  89. package/dist/{ShareablesScreen-BZZ-RT71.mjs.map → ShareablesScreen-NMoZH9ed.mjs.map} +1 -1
  90. package/dist/ShopScreen-BvSiWgsJ.mjs +47 -0
  91. package/dist/{ShopScreen---dB03HI.cjs → ShopScreen-CM3DDvLt.cjs} +2 -2
  92. package/dist/{ShopScreen---dB03HI.cjs.map → ShopScreen-CM3DDvLt.cjs.map} +1 -1
  93. package/dist/{ShopScreen-B6ygTHDB.cjs → ShopScreen-Cz0dbkhp.cjs} +3 -3
  94. package/dist/{ShopScreen-kiVwC38W.mjs → ShopScreen-DJANOOka.mjs} +29 -34
  95. package/dist/{ShopScreen-kiVwC38W.mjs.map → ShopScreen-DJANOOka.mjs.map} +1 -1
  96. package/dist/{SpacerWidget-BY7ywGP4.mjs → SpacerWidget-C1byII28.mjs} +2 -2
  97. package/dist/{SpacerWidget-BY7ywGP4.mjs.map → SpacerWidget-C1byII28.mjs.map} +1 -1
  98. package/dist/{SubscriptionsScreen-dhnfYn4L.cjs → SubscriptionsScreen-BgKpfzi0.cjs} +3 -3
  99. package/dist/{SubscriptionsScreen-B88_dLfE.cjs → SubscriptionsScreen-DCUwHrdm.cjs} +22 -32
  100. package/dist/SubscriptionsScreen-DCUwHrdm.cjs.map +1 -0
  101. package/dist/{SubscriptionsScreen-DK9-h3Cz.mjs → SubscriptionsScreen-rZxqb0eR.mjs} +21 -31
  102. package/dist/{SubscriptionsScreen-DK9-h3Cz.mjs.map → SubscriptionsScreen-rZxqb0eR.mjs.map} +1 -1
  103. package/dist/{TableWidget-dfUvhH0S.mjs → TableWidget-CNCHDRrR.mjs} +6 -6
  104. package/dist/{TableWidget-dfUvhH0S.mjs.map → TableWidget-CNCHDRrR.mjs.map} +1 -1
  105. package/dist/{TextWidget-BteaMIsX.mjs → TextWidget-CfLUQr6V.mjs} +3 -3
  106. package/dist/{TextWidget-BteaMIsX.mjs.map → TextWidget-CfLUQr6V.mjs.map} +1 -1
  107. package/dist/{ToDoWidget-BciI_D70.mjs → ToDoWidget-C3lh-3SB.mjs} +7 -7
  108. package/dist/{ToDoWidget-BciI_D70.mjs.map → ToDoWidget-C3lh-3SB.mjs.map} +1 -1
  109. package/dist/{UpgradeScreen-X6j0_625.mjs → UpgradeScreen-D_CM1n1M.mjs} +3 -3
  110. package/dist/{UpgradeScreen-X6j0_625.mjs.map → UpgradeScreen-D_CM1n1M.mjs.map} +1 -1
  111. package/dist/{VideoWidget-Dj9wue7j.mjs → VideoWidget-DKhqN_Rx.mjs} +4 -4
  112. package/dist/{VideoWidget-Dj9wue7j.mjs.map → VideoWidget-DKhqN_Rx.mjs.map} +1 -1
  113. package/dist/{WidgetInteractionContext-B1mELhQ_.mjs → WidgetInteractionContext-pLGNr8_2.mjs} +1 -1
  114. package/dist/{WidgetInteractionContext-B1mELhQ_.mjs.map → WidgetInteractionContext-pLGNr8_2.mjs.map} +1 -1
  115. package/dist/api-context-3GmfqvIB.mjs +22 -0
  116. package/dist/api-context-3GmfqvIB.mjs.map +1 -0
  117. package/dist/api-context-BkBvyFVK.cjs +46 -0
  118. package/dist/api-context-BkBvyFVK.cjs.map +1 -0
  119. package/dist/{components-CjgEvBYG.mjs → components-D2h9u3tH.mjs} +3 -3
  120. package/dist/{components-CjgEvBYG.mjs.map → components-D2h9u3tH.mjs.map} +1 -1
  121. package/dist/{de-DWONEOZS.mjs → de-CH__cDep.mjs} +1 -1
  122. package/dist/de-CH__cDep.mjs.map +1 -0
  123. package/dist/{dist-CTLDCXCc.mjs → dist-Di1hciu4.mjs} +1 -1
  124. package/dist/{dist-CTLDCXCc.mjs.map → dist-Di1hciu4.mjs.map} +1 -1
  125. package/dist/{el-De7Ne7it.mjs → el-De9QZiqh.mjs} +1 -1
  126. package/dist/el-De9QZiqh.mjs.map +1 -0
  127. package/dist/{error-state-DYzHx8tt.mjs → error-state--Z2OlDFr.mjs} +1 -1
  128. package/dist/{error-state-DYzHx8tt.mjs.map → error-state--Z2OlDFr.mjs.map} +1 -1
  129. package/dist/{es-BXxGlAp6.mjs → es-C5dhBJ9E.mjs} +4 -39
  130. package/dist/{es-BXxGlAp6.mjs.map → es-C5dhBJ9E.mjs.map} +1 -1
  131. package/dist/{es-B5_ItPIn.mjs → es-CZLh7tET.mjs} +1 -1
  132. package/dist/es-CZLh7tET.mjs.map +1 -0
  133. package/dist/{fr-jgEDP2og.mjs → fr-CIfM_0kG.mjs} +1 -1
  134. package/dist/fr-CIfM_0kG.mjs.map +1 -0
  135. package/dist/{he-DLQdVr_g.mjs → he-BTK1iEJE.mjs} +1 -1
  136. package/dist/he-BTK1iEJE.mjs.map +1 -0
  137. package/dist/{hu-CC4QdkPb.mjs → hu-CrZGIbz9.mjs} +1 -1
  138. package/dist/hu-CrZGIbz9.mjs.map +1 -0
  139. package/dist/{id-CwGC2v1d.mjs → id-B-LeCfHj.mjs} +1 -1
  140. package/dist/id-B-LeCfHj.mjs.map +1 -0
  141. package/dist/index.cjs +16 -15
  142. package/dist/index.cjs.map +1 -1
  143. package/dist/index.d.cts +7 -0
  144. package/dist/index.d.cts.map +1 -1
  145. package/dist/index.d.mts +7 -0
  146. package/dist/index.d.mts.map +1 -1
  147. package/dist/index.mjs +86 -85
  148. package/dist/index.mjs.map +1 -1
  149. package/dist/{it-jUZZ5sjO.mjs → it-rIkFmAF3.mjs} +1 -1
  150. package/dist/it-rIkFmAF3.mjs.map +1 -0
  151. package/dist/{ja-QVQymwAE.mjs → ja--J_bhk3I.mjs} +1 -1
  152. package/dist/ja--J_bhk3I.mjs.map +1 -0
  153. package/dist/{ko-DfzzTwZI.mjs → ko-B2fghWQ9.mjs} +1 -1
  154. package/dist/ko-B2fghWQ9.mjs.map +1 -0
  155. package/dist/{nl-Dys3mUo2.mjs → nl-KgHmrRKy.mjs} +1 -1
  156. package/dist/nl-KgHmrRKy.mjs.map +1 -0
  157. package/dist/{order-status-badge-xuJ732eH.mjs → order-status-badge-CjX7Qxdk.mjs} +4 -4
  158. package/dist/{order-status-badge-xuJ732eH.mjs.map → order-status-badge-CjX7Qxdk.mjs.map} +1 -1
  159. package/dist/{parse-task-body-DEmYvdNM.mjs → parse-task-body-BK1v2806.mjs} +1 -1
  160. package/dist/{parse-task-body-DEmYvdNM.mjs.map → parse-task-body-BK1v2806.mjs.map} +1 -1
  161. package/dist/{pl-CBwEisEK.mjs → pl-BJvDPvs3.mjs} +1 -1
  162. package/dist/pl-BJvDPvs3.mjs.map +1 -0
  163. package/dist/{portal_tenant_content-CQQfNOTc.mjs → portal_tenant_content-DPLnrtOG.mjs} +38 -2
  164. package/dist/{portal_tenant_content-CQQfNOTc.mjs.map → portal_tenant_content-DPLnrtOG.mjs.map} +1 -1
  165. package/dist/{pt-D5al7xw3.mjs → pt-CmZpxftX.mjs} +1 -1
  166. package/dist/pt-CmZpxftX.mjs.map +1 -0
  167. package/dist/{purify.es-DzInNL5X.mjs → purify.es-Ba5Ug4-y.mjs} +1 -1
  168. package/dist/{purify.es-DzInNL5X.mjs.map → purify.es-Ba5Ug4-y.mjs.map} +1 -1
  169. package/dist/{query-keys-8SVs82aF.mjs → query-keys-DXle2tm8.mjs} +1 -1
  170. package/dist/{query-keys-8SVs82aF.mjs.map → query-keys-DXle2tm8.mjs.map} +1 -1
  171. package/dist/{registries-Ct8o2YRe.mjs → registries-kvRRUHcO.mjs} +1 -1
  172. package/dist/{registries-Ct8o2YRe.mjs.map → registries-kvRRUHcO.mjs.map} +1 -1
  173. package/dist/{registry-context-CTHUCfEc.mjs → registry-context-Bc-2fQnr.mjs} +1 -1
  174. package/dist/{registry-context-CTHUCfEc.mjs.map → registry-context-Bc-2fQnr.mjs.map} +1 -1
  175. package/dist/{ro-B43SoGdE.mjs → ro-C_4rHVWp.mjs} +1 -1
  176. package/dist/ro-C_4rHVWp.mjs.map +1 -0
  177. package/dist/{ru-ChwnncDc.mjs → ru-B0lzoBye.mjs} +1 -1
  178. package/dist/ru-B0lzoBye.mjs.map +1 -0
  179. package/dist/{scroll-arrows-CqDxJ0Pe.mjs → scroll-arrows-D90Miaz_.mjs} +1 -1
  180. package/dist/{scroll-arrows-CqDxJ0Pe.mjs.map → scroll-arrows-D90Miaz_.mjs.map} +1 -1
  181. package/dist/{sortable.esm-C8riJ_zv.mjs → sortable.esm-NmKxJoc7.mjs} +1 -1
  182. package/dist/{sortable.esm-C8riJ_zv.mjs.map → sortable.esm-NmKxJoc7.mjs.map} +1 -1
  183. package/dist/{src-C9vtVoJs.mjs → src-CSFJnkfN.mjs} +1 -1
  184. package/dist/{src-C9vtVoJs.mjs.map → src-CSFJnkfN.mjs.map} +1 -1
  185. package/dist/{src-pgBBOcJa.mjs → src-KINQ78Nj.mjs} +1 -1
  186. package/dist/{src-pgBBOcJa.mjs.map → src-KINQ78Nj.mjs.map} +1 -1
  187. package/dist/{th-C9S_8Tv6.mjs → th-QhoPGZ6C.mjs} +1 -1
  188. package/dist/th-QhoPGZ6C.mjs.map +1 -0
  189. package/dist/{tl-CiPbx_5F.mjs → tl-Dsfp243U.mjs} +1 -1
  190. package/dist/tl-Dsfp243U.mjs.map +1 -0
  191. package/dist/{tr-CUd4dp2u.mjs → tr-BiolaqkO.mjs} +1 -1
  192. package/dist/tr-BiolaqkO.mjs.map +1 -0
  193. package/dist/{use-account-DsTz5BlS.mjs → use-account-CGaDP8xd.mjs} +2 -2
  194. package/dist/{use-account-DsTz5BlS.mjs.map → use-account-CGaDP8xd.mjs.map} +1 -1
  195. package/dist/{use-store-C2KBIS41.mjs → use-store-BVCCB9kx.mjs} +1 -1
  196. package/dist/{use-store-C2KBIS41.mjs.map → use-store-BVCCB9kx.mjs.map} +1 -1
  197. package/dist/{zh_CN-D46-GUTP.mjs → zh_CN-DcGf3QsR.mjs} +1 -1
  198. package/dist/zh_CN-DcGf3QsR.mjs.map +1 -0
  199. package/dist/{zh_TW-XqA7UKxt.mjs → zh_TW-DFw2O0OX.mjs} +1 -1
  200. package/dist/zh_TW-DFw2O0OX.mjs.map +1 -0
  201. package/package.json +14 -13
  202. package/dist/FluidProvider-Bwg1cGSY.mjs +0 -2409
  203. package/dist/FluidProvider-Bwg1cGSY.mjs.map +0 -1
  204. package/dist/FluidProvider-DprqXNu4.cjs +0 -2520
  205. package/dist/FluidProvider-DprqXNu4.cjs.map +0 -1
  206. package/dist/ProfileScreen-BDLJgcXg.cjs.map +0 -1
  207. package/dist/ProfileScreen-CmQDKNaP.mjs.map +0 -1
  208. package/dist/SubscriptionsScreen-B88_dLfE.cjs.map +0 -1
  209. package/dist/de-DWONEOZS.mjs.map +0 -1
  210. package/dist/el-De7Ne7it.mjs.map +0 -1
  211. package/dist/es-B5_ItPIn.mjs.map +0 -1
  212. package/dist/fluid-pay-api-adapter-CJ7-I8k-.mjs.map +0 -1
  213. package/dist/fluid-pay-api-adapter-D63KLi5c.cjs.map +0 -1
  214. package/dist/fr-jgEDP2og.mjs.map +0 -1
  215. package/dist/he-DLQdVr_g.mjs.map +0 -1
  216. package/dist/hu-CC4QdkPb.mjs.map +0 -1
  217. package/dist/id-CwGC2v1d.mjs.map +0 -1
  218. package/dist/it-jUZZ5sjO.mjs.map +0 -1
  219. package/dist/ja-QVQymwAE.mjs.map +0 -1
  220. package/dist/ko-DfzzTwZI.mjs.map +0 -1
  221. package/dist/nl-Dys3mUo2.mjs.map +0 -1
  222. package/dist/pay-api-context-CqKGSXnP.mjs +0 -13
  223. package/dist/pay-api-context-CqKGSXnP.mjs.map +0 -1
  224. package/dist/pay-api-context-_o5ZEXYt.cjs +0 -25
  225. package/dist/pay-api-context-_o5ZEXYt.cjs.map +0 -1
  226. package/dist/pl-CBwEisEK.mjs.map +0 -1
  227. package/dist/pt-D5al7xw3.mjs.map +0 -1
  228. package/dist/ro-B43SoGdE.mjs.map +0 -1
  229. package/dist/ru-ChwnncDc.mjs.map +0 -1
  230. package/dist/th-C9S_8Tv6.mjs.map +0 -1
  231. package/dist/tl-CiPbx_5F.mjs.map +0 -1
  232. package/dist/tr-CUd4dp2u.mjs.map +0 -1
  233. package/dist/zh_CN-D46-GUTP.mjs.map +0 -1
  234. package/dist/zh_TW-XqA7UKxt.mjs.map +0 -1
  235. /package/dist/{fields-B_iAnFXl.mjs → fields-FTgjMOdh.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"PortalProductsApiProvider-BFdHFvog.mjs","names":["portalTenant.products_list","portalTenant.products_show","portalTenant.products_search","portalTenant.products_media_list","portalTenant.product_by_visits","portalTenant.product_by_shares"],"sources":["../../../products/core/src/products-core-api-context.tsx","../../../products/core/src/portal-products-api-context.tsx","../../../products/core/src/hooks/use-debounce.ts","../../../products/core/src/hooks/use-portal-products.ts","../../../products/core/src/hooks/use-portal-product-catalog.ts","../../../products/core/src/hooks/use-portal-product-detail.ts","../../../products/core/src/utils/subscription-plans.ts","../../../products/core/src/stores/use-product-store.ts","../../../products/core/src/stores/use-draft-store.ts","../../../products/core/src/utils/product-helpers.ts","../../../products/core/src/utils/product-price.ts","../src/adapters/products-api-adapter.ts","../src/products/PortalProductsApiProvider.tsx"],"sourcesContent":["import { createContext, useContext, type JSX, type ReactNode } from \"react\";\nimport type { ProductsApi } from \"./products-api\";\n\ninterface ProductsCoreConfig {\n api: ProductsApi;\n}\n\nconst ProductsCoreContext = createContext<ProductsCoreConfig | null>(null);\n\nexport function ProductsCoreProvider({\n api,\n children,\n}: ProductsCoreConfig & { children: ReactNode }): JSX.Element {\n return (\n <ProductsCoreContext.Provider value={{ api }}>\n {children}\n </ProductsCoreContext.Provider>\n );\n}\n\nexport function useProductsApi(): ProductsApi {\n const ctx = useContext(ProductsCoreContext);\n if (!ctx) {\n throw new Error(\n \"useProductsApi must be used within a <ProductsCoreProvider>\",\n );\n }\n return ctx.api;\n}\n","import { createContext, useContext, type JSX, type ReactNode } from \"react\";\nimport type { PortalProductsApi } from \"./portal-products-api\";\n\ninterface PortalProductsCoreConfig {\n api: PortalProductsApi;\n}\n\nconst PortalProductsCoreContext =\n createContext<PortalProductsCoreConfig | null>(null);\n\nexport function PortalProductsCoreProvider({\n api,\n children,\n}: PortalProductsCoreConfig & { children: ReactNode }): JSX.Element {\n return (\n <PortalProductsCoreContext.Provider value={{ api }}>\n {children}\n </PortalProductsCoreContext.Provider>\n );\n}\n\nexport function usePortalProductsApi(): PortalProductsApi {\n const ctx = useContext(PortalProductsCoreContext);\n if (!ctx) {\n throw new Error(\n \"usePortalProductsApi must be used within a <PortalProductsCoreProvider>\",\n );\n }\n return ctx.api;\n}\n","import { useState, useEffect } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { portalProducts } from \"../portal-products-api\";\nimport { usePortalProductsApi } from \"../portal-products-api-context\";\n\nconst portalProductKeys = {\n all: [\"portal-products\"] as const,\n list: (params?: portalProducts.CursorPaginationParams) =>\n [...portalProductKeys.all, \"list\", params] as const,\n detail: (id: string | number) =>\n [...portalProductKeys.all, \"detail\", String(id)] as const,\n search: (query: string, params?: portalProducts.CursorPaginationParams) =>\n [...portalProductKeys.all, \"search\", query, params] as const,\n media: (productId: string | number) =>\n [...portalProductKeys.all, \"media\", String(productId)] as const,\n};\n\nexport { portalProductKeys };\n\nexport function usePortalProducts(\n params?: portalProducts.CursorPaginationParams,\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.list(params),\n queryFn: () => api.listProducts(params),\n });\n}\n\nexport function usePortalProduct(\n id: string | number,\n options?: { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.detail(id),\n queryFn: () => api.getProduct(id),\n enabled: options?.enabled,\n });\n}\n\nexport function usePortalProductSearch(\n query: string,\n params?: portalProducts.CursorPaginationParams & { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n const { enabled, ...paginationParams } = params ?? {};\n return useQuery({\n queryKey: portalProductKeys.search(query, paginationParams),\n queryFn: () => api.searchProducts(query, paginationParams),\n enabled: enabled ?? query.length > 0,\n });\n}\n\nexport function usePortalProductMedia(\n productId: string | number,\n options?: { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.media(productId),\n queryFn: () => api.getProductMedia(productId),\n enabled: options?.enabled,\n });\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport type { portalProducts } from \"../portal-products-api\";\nimport { usePortalProductsApi } from \"../portal-products-api-context\";\nimport { useDebounce } from \"./use-debounce\";\n\nexport interface UsePortalProductCatalogParams {\n perPage?: number;\n}\n\n/** Page param is a cursor string from the BFF, or undefined for the first page. */\nexport type PortalProductPageParam = string | undefined;\n\nexport function usePortalProductCatalog({\n perPage = 25,\n}: UsePortalProductCatalogParams = {}) {\n const api = usePortalProductsApi();\n const [searchTerm, setSearchTerm] = useState(\"\");\n const debouncedSearchTerm = useDebounce(searchTerm, 300);\n const [currentSort, setCurrentSort] = useState<string>(\"created_at_desc\");\n\n const fetchProducts = useCallback(\n async (\n pageParam?: PortalProductPageParam,\n ): Promise<portalProducts.PortalProductsResponse> => {\n const cursor = pageParam;\n\n if (debouncedSearchTerm) {\n return api.searchProducts(debouncedSearchTerm, {\n cursor,\n limit: perPage,\n sort: currentSort,\n });\n }\n return api.listProducts({\n cursor,\n limit: perPage,\n sort: currentSort,\n });\n },\n [api, debouncedSearchTerm, perPage, currentSort],\n );\n\n const getNextPageParam = useCallback(\n (\n lastPage: portalProducts.PortalProductsResponse,\n _allPages: portalProducts.PortalProductsResponse[],\n lastPageParam: PortalProductPageParam,\n ): PortalProductPageParam => {\n const nextCursor = lastPage.meta?.pagination?.next_cursor ?? undefined;\n // Stop if the API returned the same cursor we just sent (prevents\n // infinite refetch loops when the backend doesn't advance).\n if (nextCursor != null && nextCursor === lastPageParam) {\n return undefined;\n }\n return nextCursor;\n },\n [],\n );\n\n const queryKey = useMemo(\n () => [\n \"portal-product-catalog\",\n debouncedSearchTerm || \"\",\n perPage,\n currentSort,\n ],\n [debouncedSearchTerm, perPage, currentSort],\n );\n\n return {\n searchTerm,\n setSearchTerm,\n debouncedSearchTerm,\n currentSort,\n setCurrentSort,\n fetchProducts,\n getNextPageParam,\n queryKey,\n perPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { usePortalProduct } from \"./use-portal-products\";\n\nexport interface UsePortalProductDetailParams {\n productId: string;\n}\n\nexport function usePortalProductDetail({\n productId,\n}: UsePortalProductDetailParams) {\n const {\n data: productResponse,\n isLoading,\n error,\n } = usePortalProduct(productId);\n\n const product = productResponse?.product;\n\n const images = useMemo(() => {\n if (!product?.images) return [];\n return product.images.map((img, idx) => ({\n id: idx,\n url: img.url ?? \"\",\n alt: img.alt ?? null,\n }));\n }, [product?.images]);\n\n return {\n product,\n isLoading,\n error,\n images,\n };\n}\n","import type { products } from \"../types\";\n\nexport function ensureDefaultSubscriptionPlan(\n plans: readonly products.ProductSubscriptionPlan[],\n): products.ProductSubscriptionPlan[] {\n const activePlans = plans.filter((plan) => plan.active !== false);\n\n if (activePlans.length === 0) {\n return plans.map((plan) => ({ ...plan, default: false }));\n }\n\n const hasActiveDefault = activePlans.some((plan) => plan.default === true);\n\n if (!hasActiveDefault) {\n const planWithLowestId = activePlans.reduce((lowest, current) => {\n const lowestId = lowest.subscription_plan?.id || Infinity;\n const currentId = current.subscription_plan?.id || Infinity;\n return currentId < lowestId ? current : lowest;\n });\n\n return plans.map((plan) => ({\n ...plan,\n default:\n plan.subscription_plan?.id === planWithLowestId.subscription_plan?.id &&\n plan.active !== false,\n }));\n }\n\n return plans.map((plan) => ({\n ...plan,\n default: plan.active !== false ? plan.default : false,\n }));\n}\n\nexport function plansToAttributes(\n plans: readonly products.ProductSubscriptionPlan[],\n): products.ProductSubscriptionPlanAttribute[] {\n return plans.map((plan) => ({\n id: plan.id ?? undefined,\n subscription_plan_id: plan.subscription_plan.id,\n default: plan.default || false,\n active: plan.active !== false,\n }));\n}\n","import { create, type StateCreator } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { products } from \"../types\";\nimport {\n ensureDefaultSubscriptionPlan,\n plansToAttributes,\n} from \"../utils/subscription-plans\";\n\n// Default state\nconst defaultState = {\n id: undefined,\n title: \"\",\n description: \"\",\n introduction: \"\",\n stripped: \"\",\n feature_text: \"\",\n sku: \"\",\n slug: \"\",\n canonical_url: null as string | null,\n image_url: \"\",\n image_path: undefined,\n status: \"draft\",\n publish_at: null,\n price: \"0\",\n commission: 0,\n public: true,\n no_index: false,\n show_reviews: true,\n publish_to_retail_store: true,\n publish_to_rep_store: true,\n publish_to_share_tab: true,\n collection_ids: [],\n tag_ids: [],\n images_attributes: [],\n product_subscription_plans_attributes: [],\n product_subscription_plans: [],\n variants_attributes: [],\n bundle: false,\n track_inventory_on_bundle_items: false,\n product_bundles_attributes: [],\n option_attrs: [],\n options: [],\n metafields_attributes: [],\n metadata: {},\n search_engine_optimizer_attributes: {\n title: \"\",\n description: \"\",\n image_url: \"\",\n image_path: \"\",\n block_crawler: false,\n },\n};\n\ntype ValidationErrors = Partial<Record<string, string>>;\n\nexport type TranslationData = {\n title?: string;\n introduction?: string;\n description?: string;\n feature_text?: string;\n};\n\ntype LanguageTranslations = Record<string, TranslationData>;\ntype TranslationLoadingState = Record<string, boolean>;\n\ninterface UpdateFieldOptions {\n shouldValidate?: boolean;\n shouldClearError?: boolean;\n markDirty?: boolean;\n}\n\ntype ArrayItemType<T> = T extends (infer U)[] ? U : unknown;\n\ntype ProductStoreFields = products.UpdateProduct & {\n product_subscription_plans: products.ProductSubscriptionPlan[];\n track_inventory_on_bundle_items: boolean;\n canonical_url: string | null;\n publish_at: string | null;\n};\n\nexport type ProductStoreState = ProductStoreFields & {\n errors: ValidationErrors;\n isValid: boolean;\n isDirty: boolean;\n translations: LanguageTranslations;\n editedTranslations: LanguageTranslations;\n translationErrors: Record<string, Record<string, string | undefined>>;\n translationLoading: TranslationLoadingState;\n translationsFetched: boolean;\n\n setProduct: (productData: products.Product) => void;\n updateField: <K extends keyof ProductStoreFields>(\n key: K,\n value: ProductStoreFields[K],\n options?: UpdateFieldOptions,\n ) => void;\n updatePartial: (updates: Partial<ProductStoreFields>) => void;\n updateSlug: (slug: string, isManual?: boolean) => void;\n updateSEO: (seo: {\n title?: string;\n description?: string;\n image_url?: string;\n image_path?: string;\n block_crawler?: boolean;\n }) => void;\n updateArrayItem: <K extends keyof ProductStoreFields>(\n arrayKey: K,\n itemId: number | string,\n updatedItem: ArrayItemType<ProductStoreFields[K]>,\n idField?: string,\n ) => void;\n reset: () => void;\n validateField: (field: string) => void;\n validateRequired: () => boolean;\n clearErrors: () => void;\n clearFieldError: (field: string) => void;\n markClean: () => void;\n\n setTranslationLoading: (languageIso: string, loading: boolean) => void;\n setTranslationData: (languageIso: string, data: TranslationData) => void;\n updateTranslationField: (\n languageIso: string,\n field: keyof TranslationData,\n value: string,\n ) => void;\n getOriginalTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n getEditedTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n setTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n error?: string,\n ) => void;\n getTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n getTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n isTranslationLoading: (languageIso: string) => boolean;\n resetTranslations: () => void;\n setTranslationsFetched: (fetched: boolean) => void;\n};\n\nfunction syncSubscriptionPlans(plans: products.ProductSubscriptionPlan[]): {\n product_subscription_plans: products.ProductSubscriptionPlan[];\n product_subscription_plans_attributes: products.ProductSubscriptionPlanAttribute[];\n} {\n const activePlans = plans.filter((plan) => plan.active !== false);\n const plansWithDefault =\n activePlans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n return {\n product_subscription_plans: plansWithDefault,\n product_subscription_plans_attributes: plansToAttributes(plansWithDefault),\n };\n}\n\nconst extractFilenameFromUrl = (imageUrl: string): string => {\n try {\n const url = new URL(imageUrl);\n return url.pathname.split(\"/\").pop() || \"\";\n } catch {\n return imageUrl.split(\"/\").pop()?.split(\"?\")[0] || \"\";\n }\n};\n\nconst createProductStore: StateCreator<ProductStoreState> = (set, get) => ({\n ...defaultState,\n track_inventory_on_bundle_items: false,\n translations: {},\n editedTranslations: {},\n translationErrors: {},\n translationLoading: {},\n translationsFetched: false,\n errors: {},\n isValid: false,\n isDirty: false,\n\n setProduct: (productData: products.Product) => {\n const transformedData: ProductStoreFields = {\n id: productData.id || undefined,\n title: productData.title || \"\",\n description: productData.description || \"\",\n introduction: productData.introduction || \"\",\n stripped: productData.stripped || \"\",\n feature_text: productData.feature_text || \"\",\n sku: productData.sku || \"\",\n slug: productData.slug || \"\",\n canonical_url: productData.canonical_url || null,\n custom_slug: productData.custom_slug || false,\n image_url: productData.image_url || \"\",\n image_path:\n productData.image_path && !productData.image_path.includes(\"undefined\")\n ? productData.image_path\n : productData.image_url\n ? extractFilenameFromUrl(productData.image_url)\n : undefined,\n status: productData.status || \"draft\",\n publish_at: productData.publish_at || null,\n commission:\n typeof productData.commission === \"string\"\n ? parseFloat(productData.commission)\n : productData.commission || 0,\n public: productData.public ?? true,\n no_index: productData.no_index ?? false,\n show_reviews: productData.show_reviews ?? true,\n publish_to_retail_store: productData.publish_to_retail_store,\n publish_to_rep_store: productData.publish_to_rep_store,\n publish_to_share_tab: productData.publish_to_share_tab,\n ...(productData.tax_category_id && {\n tax_category_id: productData.tax_category_id,\n }),\n international_tax_type: productData.international_tax_type || undefined,\n category_id: productData.category_id\n ? parseInt(productData.category_id)\n : productData.category?.id\n ? productData.category.id\n : undefined,\n application_theme_template_id:\n productData.application_theme_template_id || undefined,\n collection_ids: (\n productData.collections as Array<{ id: number }> | undefined\n )?.map((collection) => collection.id),\n tag_ids: Array.isArray(productData.tags)\n ? (productData.tags as Array<{ id: number } | number>)\n .map((tag) => (typeof tag === \"number\" ? tag : tag?.id))\n .filter(Boolean)\n : [],\n search_engine_optimizer_attributes: {\n id: productData.search_engine_optimizer?.id,\n title:\n productData.search_engine_optimizer?.title ||\n productData.title ||\n undefined,\n description: productData.search_engine_optimizer?.description || \"\",\n image_url:\n productData.search_engine_optimizer?.image_url ||\n productData.image_url ||\n \"\",\n image_path:\n productData.search_engine_optimizer?.image_path ||\n productData.image_path ||\n \"\",\n block_crawler:\n productData.search_engine_optimizer?.block_crawler ?? false,\n },\n images_attributes:\n (productData.images as products.ImageAttribute[] | undefined)?.map(\n (img) => ({\n id: img.id,\n position: img.position || 0,\n image_url: img.image_url,\n image_path:\n img.image_path && !img.image_path.includes(\"undefined\")\n ? img.image_path\n : img.image_url\n ? extractFilenameFromUrl(img.image_url)\n : undefined,\n _destroy: false,\n }),\n ) || [],\n ...(productData.images &&\n productData.images.length > 0 && {\n image_path: (() => {\n if (\n productData.image_path &&\n typeof productData.image_path === \"string\" &&\n !productData.image_path.includes(\"undefined\")\n ) {\n return productData.image_path;\n }\n const firstImage = (\n productData.images as products.ImageAttribute[]\n ).find((img) => img.position === 0);\n if (\n firstImage?.image_path &&\n typeof firstImage.image_path === \"string\" &&\n !firstImage.image_path.includes(\"undefined\")\n ) {\n return firstImage.image_path;\n }\n return productData.image_url\n ? extractFilenameFromUrl(productData.image_url)\n : undefined;\n })(),\n }),\n product_subscription_plans: (() => {\n const plans =\n productData?.product_subscription_plans?.map(\n (plan: products.ProductSubscriptionPlan) => ({\n ...plan,\n active: plan?.active,\n }),\n ) || [];\n return plans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n })(),\n product_subscription_plans_attributes: (() => {\n const plans =\n productData?.product_subscription_plans?.map(\n (plan: products.ProductSubscriptionPlan) => ({\n ...plan,\n active: plan?.active,\n }),\n ) || [];\n const finalPlans =\n plans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n return plansToAttributes(finalPlans);\n })(),\n variants_attributes: productData?.variants\n ?.filter(\n (\n variant: products.Variant,\n ): variant is products.Variant & { id: number } =>\n variant.id !== null && variant.id !== undefined,\n )\n .map((variant) => ({\n id: variant.id,\n title: variant.title ?? productData?.title ?? \"Untitled Variant\",\n option_attrs: variant.option_attrs || [],\n sku: variant.sku || undefined,\n price: variant.price,\n track_quantity: variant.track_quantity ?? false,\n keep_selling: variant.keep_selling ?? false,\n bar_code: variant.bar_code ?? \"\",\n limit_subscription: variant.limit_subscription,\n subscription_max_qty: variant.subscription_max_qty ?? 0,\n customer_limit: variant.customer_limit ?? 0,\n is_master: variant.is_master,\n _destroy: false,\n images_attributes: variant?.images?.map(\n (image: { id?: number; position: number; image_url: string }) => ({\n id: image.id,\n position: image.position || 0,\n image_url: image.image_url,\n _destroy: false,\n }),\n ),\n inventory_levels_attributes: variant?.inventory_levels\n ?.filter(\n (level: products.InventoryLevel) =>\n (level.warehouse_id ?? level.warehouse?.id) != null,\n )\n .map((level: products.InventoryLevel) => ({\n id: level.id,\n available: level.available,\n committed: level.committed,\n on_hand: level.on_hand,\n unavailable: level.unavailable,\n warehouse_id: level.warehouse?.id || 0,\n _destroy: false,\n })),\n variant_countries_attributes: variant?.variant_countries\n ? Object.entries(\n variant.variant_countries as Record<\n string,\n products.VariantCountry\n >,\n ).map(([iso, country]) => ({\n id: country.id ?? 0,\n active: country.active ?? true,\n country_id: country.country_id,\n country_name: country.country_name ?? \"\",\n country_iso: iso,\n price: Number(country.price) || 0,\n subscription_price: Number(country.subscription_price) || 0,\n wholesale: Number(country.wholesale) || 0,\n wholesale_subscription_price:\n Number(country.wholesale_subscription_price) || 0,\n compare_price: Number(country.compare_price) || 0,\n cv: Number(country.cv) || 0,\n qv: Number(country.qv) || 0,\n pc_cv: Number(country.pc_cv) || 0,\n pc_qv: Number(country.pc_qv) || 0,\n cost_of_goods_sold: Number(country.cost_of_goods_sold) || 0,\n currency_code: country.currency_code || null,\n shipping: Number(country.shipping) || 0,\n points: country.points,\n }))\n : [],\n })),\n bundle:\n productData.product_bundles && productData.product_bundles.length > 0,\n track_inventory_on_bundle_items:\n productData.track_inventory_on_bundle_items ?? false,\n product_bundles_attributes: (productData.product_bundles || []).map(\n (bundle: products.ProductBundle) => ({\n id: bundle.id,\n bundled_variant_id: bundle.bundled_variant?.id || 0,\n bundled_variant: {\n title: bundle.bundled_variant?.title || \"\",\n sku: bundle.bundled_variant?.sku || null,\n price: String(bundle.bundled_variant?.price || \"0\"),\n price_in_currency: bundle.bundled_variant?.price_in_currency || \"\",\n currency_code: bundle.bundled_variant?.currency_code,\n product: {\n id: bundle.bundled_variant?.product.id || 0,\n title: bundle.bundled_variant?.product.title || \"\",\n image_url: bundle.bundled_variant?.product.image_url || \"\",\n price: bundle.bundled_variant?.product.price || \"0\",\n price_in_currency:\n bundle.bundled_variant?.product.price_in_currency || \"\",\n cv: bundle.bundled_variant?.product.cv || 0,\n qv: bundle.bundled_variant?.product.qv || 0,\n },\n },\n cv: bundle.cv || 0,\n qv: bundle.qv || 0,\n quantity: bundle.quantity,\n display_externally: bundle.display_externally ?? true,\n _destroy: false,\n }),\n ),\n option_attrs: productData.option_attrs || [],\n options: productData.options || [],\n metafields_attributes: (productData.metafields || []).map(\n (metafield: products.Metafield) => ({\n id: metafield.id,\n namespace: metafield.namespace,\n key: metafield.key,\n value: metafield.value,\n value_type: metafield.value_type,\n _destroy: false,\n }),\n ),\n metadata: productData.metadata || {},\n };\n\n set({\n ...transformedData,\n errors: {},\n isValid: false,\n isDirty: false,\n });\n },\n\n updateSlug: (slug, isManual = true) => {\n set((state: ProductStoreState) => ({\n slug,\n custom_slug: isManual,\n search_engine_optimizer_attributes: {\n ...state.search_engine_optimizer_attributes,\n title: state.search_engine_optimizer_attributes?.title || \"\",\n description:\n state.search_engine_optimizer_attributes?.description || \"\",\n image_url: state.search_engine_optimizer_attributes?.image_url || \"\",\n image_path: state.search_engine_optimizer_attributes?.image_path || \"\",\n block_crawler:\n state.search_engine_optimizer_attributes?.block_crawler ?? false,\n },\n isDirty: true,\n }));\n },\n\n updateSEO: (seo) => {\n set((state: ProductStoreState) => ({\n search_engine_optimizer_attributes: {\n ...state.search_engine_optimizer_attributes,\n title:\n seo.title !== undefined\n ? seo.title\n : state.search_engine_optimizer_attributes?.title || \"\",\n description:\n seo.description !== undefined\n ? seo.description\n : state.search_engine_optimizer_attributes?.description || \"\",\n image_url:\n seo.image_url !== undefined\n ? seo.image_url\n : state.search_engine_optimizer_attributes?.image_url || \"\",\n image_path:\n seo.image_path !== undefined\n ? seo.image_path\n : state.search_engine_optimizer_attributes?.image_path || \"\",\n block_crawler:\n seo.block_crawler !== undefined\n ? seo.block_crawler\n : (state.search_engine_optimizer_attributes?.block_crawler ??\n false),\n },\n isDirty: true,\n }));\n },\n\n updateField: <K extends keyof ProductStoreFields>(\n key: K,\n value: ProductStoreFields[K],\n options?: UpdateFieldOptions,\n ) => {\n const {\n shouldValidate = false,\n shouldClearError = true,\n markDirty = true,\n } = options || {};\n\n set((state: ProductStoreState) => {\n if (key === \"product_subscription_plans\") {\n return {\n ...state,\n ...syncSubscriptionPlans(value as products.ProductSubscriptionPlan[]),\n errors: shouldClearError\n ? { ...state.errors, [key]: undefined }\n : state.errors,\n isDirty: markDirty ? true : state.isDirty,\n };\n }\n\n return {\n ...state,\n [key]: value,\n errors: shouldClearError\n ? { ...state.errors, [key]: undefined }\n : state.errors,\n isDirty: markDirty ? true : state.isDirty,\n };\n });\n\n if (shouldValidate) {\n get().validateField(key as string);\n }\n },\n\n updatePartial: (updates: Partial<ProductStoreFields>) => {\n set((state: ProductStoreState) => {\n if (updates.product_subscription_plans) {\n return {\n ...state,\n ...updates,\n ...syncSubscriptionPlans(updates.product_subscription_plans),\n errors: {\n ...state.errors,\n ...Object.keys(updates).reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>,\n ),\n },\n isDirty: true,\n };\n }\n\n return {\n ...state,\n ...updates,\n errors: {\n ...state.errors,\n ...Object.keys(updates).reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>,\n ),\n },\n isDirty: true,\n };\n });\n },\n\n updateArrayItem: <K extends keyof ProductStoreFields>(\n arrayKey: K,\n itemId: number | string,\n updatedItem: ArrayItemType<ProductStoreFields[K]>,\n idField: string = \"id\",\n ) => {\n set((state: ProductStoreState) => {\n const currentArray = Array.isArray(state[arrayKey])\n ? (state[arrayKey] as unknown[])\n : [];\n\n const updatedArray = currentArray.map((item) => {\n if (\n typeof item === \"object\" &&\n item !== null &&\n idField in item &&\n (item as Record<string, unknown>)[idField] === itemId\n ) {\n return updatedItem;\n }\n return item;\n });\n\n if (arrayKey === \"product_subscription_plans\") {\n return {\n ...state,\n ...syncSubscriptionPlans(\n updatedArray as products.ProductSubscriptionPlan[],\n ),\n errors: { ...state.errors, [arrayKey]: undefined },\n isDirty: true,\n };\n }\n\n return {\n ...state,\n [arrayKey]: updatedArray,\n errors: { ...state.errors, [arrayKey]: undefined },\n isDirty: true,\n };\n });\n },\n\n reset: () => {\n set({\n ...defaultState,\n track_inventory_on_bundle_items: false,\n custom_slug: false,\n errors: {},\n isValid: false,\n isDirty: false,\n });\n },\n\n // Validation methods — these provide basic field-level validation.\n // For full schema validation (e.g. Zod), the consumer should call\n // their own validation function against the store state.\n validateField: (field: string) => {\n const fieldValue = get()[field as keyof ProductStoreState];\n const hasValue =\n fieldValue !== undefined && fieldValue !== null && fieldValue !== \"\";\n\n set((state: ProductStoreState) => ({\n errors: {\n ...state.errors,\n [field]: hasValue ? undefined : `${field} is required`,\n },\n isValid:\n hasValue &&\n Object.keys(state.errors).every(\n (key) => key === field || !state.errors[key],\n ),\n }));\n },\n\n validateRequired: () => {\n // Basic validation: check that title exists\n const state = get();\n const errors: ValidationErrors = {};\n\n if (!state.title) {\n errors.title = \"Title is required\";\n }\n\n if (Object.keys(errors).length > 0) {\n set({ errors, isValid: false });\n return false;\n }\n\n set({ errors: {}, isValid: true });\n return true;\n },\n\n clearErrors: () => {\n set({ errors: {}, isValid: false });\n },\n\n clearFieldError: (field: string) => {\n set((state: ProductStoreState) => ({\n errors: { ...state.errors, [field]: undefined },\n }));\n },\n\n markClean: () => {\n set({ isDirty: false });\n },\n\n // Translation methods\n setTranslationLoading: (languageIso: string, loading: boolean) => {\n set((state: ProductStoreState) => ({\n translationLoading: {\n ...state.translationLoading,\n [languageIso]: loading,\n },\n }));\n },\n\n setTranslationData: (languageIso: string, data: TranslationData) => {\n set((state: ProductStoreState) => ({\n translations: {\n ...state.translations,\n [languageIso]: data,\n },\n translationLoading: {\n ...state.translationLoading,\n [languageIso]: false,\n },\n }));\n },\n\n updateTranslationField: (\n languageIso: string,\n field: keyof TranslationData,\n value: string,\n ) => {\n set((state: ProductStoreState) => {\n const originalValue = state.translations[languageIso]?.[field];\n let error: string | undefined;\n\n if (\n field === \"title\" &&\n value === \"\" &&\n originalValue &&\n originalValue.trim() !== \"\"\n ) {\n error = \"Title is required\";\n }\n\n return {\n editedTranslations: {\n ...state.editedTranslations,\n [languageIso]: {\n ...state.editedTranslations[languageIso],\n [field]: value,\n },\n },\n translationErrors: {\n ...state.translationErrors,\n [languageIso]: {\n ...state.translationErrors[languageIso],\n [field]: error,\n },\n },\n };\n });\n },\n\n getTranslation: (languageIso: string, field: keyof TranslationData) => {\n const state = get();\n return (\n state.editedTranslations[languageIso]?.[field] ??\n state.translations[languageIso]?.[field]\n );\n },\n\n getOriginalTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => {\n return get().translations[languageIso]?.[field];\n },\n\n getEditedTranslation: (languageIso: string, field: keyof TranslationData) => {\n return get().editedTranslations[languageIso]?.[field];\n },\n\n setTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n error?: string,\n ) => {\n set((state: ProductStoreState) => ({\n translationErrors: {\n ...state.translationErrors,\n [languageIso]: {\n ...state.translationErrors[languageIso],\n [field]: error,\n },\n },\n }));\n },\n\n getTranslationError: (languageIso: string, field: keyof TranslationData) => {\n return get().translationErrors[languageIso]?.[field];\n },\n\n isTranslationLoading: (languageIso: string) => {\n return get().translationLoading[languageIso] ?? false;\n },\n\n resetTranslations: () => {\n set({\n translations: {},\n editedTranslations: {},\n translationErrors: {},\n translationLoading: {},\n translationsFetched: false,\n });\n },\n\n setTranslationsFetched: (fetched: boolean) => {\n set({ translationsFetched: fetched });\n },\n});\n\nexport const useProductStore =\n process.env.NODE_ENV === \"development\"\n ? create<ProductStoreState>()(\n devtools(createProductStore, { name: \"product-store\" }),\n )\n : create<ProductStoreState>()(createProductStore);\n","import { create } from \"zustand\";\n\ninterface DraftStore {\n draftData: unknown | null;\n isFromSettings: boolean;\n navigationTarget: string | null;\n\n saveDraft: (data: unknown) => void;\n getDraft: () => unknown | null;\n clearDraft: () => void;\n setFromSettings: (value: boolean) => void;\n setNavigationTarget: (target: string | null) => void;\n reset: () => void;\n}\n\nexport const useDraftStore = create<DraftStore>()((set, get) => ({\n draftData: null,\n isFromSettings: false,\n navigationTarget: null,\n\n saveDraft: (data: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const formData = data as any;\n const hasContent =\n formData?.title ||\n formData?.description ||\n formData?.sku ||\n (formData?.product_subscription_plans &&\n formData.product_subscription_plans.length > 0);\n\n if (hasContent) {\n set({ draftData: data });\n }\n },\n\n getDraft: () => {\n const { draftData, isFromSettings, navigationTarget } = get();\n\n if (!draftData) {\n return null;\n }\n\n if (isFromSettings && navigationTarget) {\n return draftData;\n }\n\n set({ draftData: null });\n return null;\n },\n\n clearDraft: () => {\n const { draftData } = get();\n if (draftData) {\n set({ draftData: null });\n }\n },\n\n setFromSettings: (value: boolean) => {\n set({ isFromSettings: value });\n },\n\n setNavigationTarget: (target: string | null) => {\n set({ navigationTarget: target });\n },\n\n reset: () => {\n set({ draftData: null, isFromSettings: false, navigationTarget: null });\n },\n}));\n","import type { products } from \"../types\";\n\nexport function createSlug(title: string): string {\n return title\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function stripHtmlTags(html: string): string {\n return html\n .replace(/<[^>]*>/g, \"\")\n .replace(/&[^;]+;/g, \" \")\n .trim();\n}\n\nexport function getVariantImageUrl(\n variant?: {\n primary_image?: string | null;\n image_url?: string | null;\n images?: Array<{ image_url: string }> | null;\n } | null,\n product?: { image_url?: string | null } | null,\n): string {\n if (!variant) return product?.image_url || \"\";\n if (variant.primary_image) return variant.primary_image;\n if (variant.image_url) return variant.image_url;\n if (Array.isArray(variant.images) && variant.images.length > 0) {\n const firstImage = variant.images[0];\n if (firstImage?.image_url) return firstImage.image_url;\n }\n return product?.image_url || \"\";\n}\n\nexport function getProductImageUrl(\n product?: {\n image_url?: string | null;\n images?: Array<{ image_url: string; position?: number }> | null;\n } | null,\n): string | null {\n if (!product) return null;\n if (Array.isArray(product.images) && product.images.length > 0) {\n const sortedImages = [...product.images].sort(\n (a, b) => (a.position ?? 0) - (b.position ?? 0),\n );\n const primaryImage = sortedImages[0];\n if (primaryImage?.image_url) return primaryImage.image_url;\n }\n return product.image_url ?? null;\n}\n\nexport function sanitizeBundleData<\n T extends products.CreateProduct | products.UpdateProduct,\n>(productData: T): T {\n const activeVariants = (productData.variants_attributes || []).filter(\n (variant) => !variant._destroy,\n );\n const hasMultipleVariants = activeVariants.length > 1;\n\n const activeOptions = (productData.options || []).filter(\n (opt) => !opt._destroy,\n );\n const derivedOptionAttrs = [\n ...new Set(activeOptions.map((opt) => opt.title.toLowerCase())),\n ];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { options, option_attrs, ...restProductData } = productData;\n\n // We spread the original data and override specific fields, preserving the\n // runtime shape. The cast to T is safe because we only narrow/replace fields\n // that exist on the base type.\n if (hasMultipleVariants) {\n return {\n ...productData,\n options: undefined,\n option_attrs: derivedOptionAttrs,\n bundle: false,\n product_bundles_attributes: [],\n track_inventory_on_bundle_items: false,\n } as T;\n }\n\n return {\n ...productData,\n options: undefined,\n option_attrs: derivedOptionAttrs,\n } as T;\n}\n\nexport interface ApiErrorShape {\n message?: string;\n error_message?: string;\n status?: number;\n data?: unknown;\n errors?: Record<string, string[]>;\n}\n\nfunction getErrorsFromApiError(\n error: ApiErrorShape,\n): Record<string, string[]> | undefined {\n if (error?.errors && typeof error.errors === \"object\") {\n return error.errors;\n }\n if (error?.data && typeof error.data === \"object\") {\n const data = error.data as Record<string, unknown>;\n const firstKey = Object.keys(data)[0];\n if (firstKey && Array.isArray(data[firstKey])) {\n return data as Record<string, string[]>;\n }\n }\n return undefined;\n}\n\nfunction formatFieldName(fieldName: string): string {\n const SEO_FIELD_LABELS: Record<string, string> = {\n \"search_engine_optimizer.title\": \"SEO Title\",\n \"search_engine_optimizer.description\": \"SEO Description\",\n \"search_engine_optimizer.image_url\": \"SEO Image\",\n };\n\n if (SEO_FIELD_LABELS[fieldName]) return SEO_FIELD_LABELS[fieldName];\n\n const parts = fieldName.split(\".\");\n if (parts.length > 1) {\n return parts\n .map((part, index) =>\n part\n .split(\"_\")\n .map((word, wordIndex) => {\n if (\n (index === 0 && wordIndex === 0) ||\n (index > 0 && wordIndex > 0)\n )\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n return word.toLowerCase();\n })\n .join(\" \"),\n )\n .join(\" \");\n }\n\n return fieldName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\nexport function getErrorMessage(\n error: ApiErrorShape,\n fallbackMessage: string,\n): string {\n if (error?.message && error.message !== \"unprocessable entity\") {\n return error.message;\n }\n\n const errorsObj = getErrorsFromApiError(error);\n if (errorsObj) {\n const firstField = Object.keys(errorsObj)[0];\n if (firstField && errorsObj[firstField]) {\n const fieldErrors = errorsObj[firstField];\n if (\n Array.isArray(fieldErrors) &&\n fieldErrors.length > 0 &&\n fieldErrors[0]\n ) {\n return `${formatFieldName(firstField)} ${fieldErrors[0]}`;\n }\n }\n }\n\n return fallbackMessage;\n}\n\nexport function isSeoError(fieldName: string): boolean {\n return (\n fieldName.startsWith(\"search_engine_optimizer\") || fieldName === \"slug\"\n );\n}\n\nexport function extractSeoErrors(\n error: ApiErrorShape,\n): Array<{ field: string; message: string }> {\n const seoErrors: Array<{ field: string; message: string }> = [];\n const errorsObj = getErrorsFromApiError(error);\n if (errorsObj) {\n for (const fieldName of Object.keys(errorsObj)) {\n if (isSeoError(fieldName) && errorsObj[fieldName]) {\n const fieldErrors = errorsObj[fieldName];\n if (\n Array.isArray(fieldErrors) &&\n fieldErrors.length > 0 &&\n fieldErrors[0]\n ) {\n seoErrors.push({\n field: fieldName,\n message: `${formatFieldName(fieldName)} ${fieldErrors[0].charAt(0).toUpperCase() + fieldErrors[0].slice(1)}`,\n });\n }\n }\n }\n }\n return seoErrors;\n}\n","import type { products } from \"../types\";\n\ntype ProductPriceInput = products.Product | products.ShopProduct;\n\nfunction stripParentheticalText(text: string | undefined): string | null {\n if (!text) return null;\n return text.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nfunction isShopVariantCountry(\n vc: products.VariantCountry | products.ShopVariantCountry | undefined,\n): vc is products.ShopVariantCountry {\n return vc !== undefined && \"display_wholesale_subscription_price\" in vc;\n}\n\nfunction isAdminProduct(\n product: ProductPriceInput,\n): product is products.Product {\n return \"display_price\" in product;\n}\n\nfunction isVariantCountriesRecord(\n vc: unknown,\n): vc is Record<string, products.VariantCountry> {\n return vc !== null && typeof vc === \"object\" && !Array.isArray(vc);\n}\n\nexport function determineProductPrice(\n product: ProductPriceInput,\n countryIso: string,\n): { repPrice: string | null | undefined; price?: string | null } {\n const { variants } = product;\n\n // Get the first active variant for the country, or fall back to first variant\n const selectedVariant =\n variants?.find((v) => {\n if (isVariantCountriesRecord(v.variant_countries)) {\n return v.variant_countries[countryIso]?.active;\n }\n return false;\n }) ||\n variants?.[0] ||\n null;\n\n let variantCountry:\n | products.VariantCountry\n | products.ShopVariantCountry\n | undefined;\n if (countryIso && selectedVariant?.variant_countries) {\n const variantCountries = selectedVariant.variant_countries;\n\n if (Array.isArray(variantCountries)) {\n variantCountry = variantCountries.find(\n (v: products.ShopVariantCountry) => v?.country?.iso === countryIso,\n );\n } else if (isVariantCountriesRecord(variantCountries)) {\n variantCountry = variantCountries[countryIso];\n }\n }\n\n if (selectedVariant?.subscription_only)\n return {\n repPrice: isShopVariantCountry(variantCountry)\n ? variantCountry.display_wholesale_subscription_price\n : undefined,\n };\n\n const price = isShopVariantCountry(variantCountry)\n ? variantCountry.display_price\n : isAdminProduct(product)\n ? product.display_price\n : undefined;\n\n const repPrice = isShopVariantCountry(variantCountry)\n ? variantCountry.display_wholesale\n : undefined;\n return {\n repPrice: stripParentheticalText(repPrice),\n price: price === repPrice ? null : stripParentheticalText(price),\n };\n}\n\nexport function extractPriceFromString(priceString: string): number | null {\n if (!priceString) return null;\n const strippedString = priceString.replace(/[^\\d.]/g, \"\");\n return parseFloat(strippedString);\n}\n","import type {\n PortalProductsApi,\n portalProducts,\n} from \"@fluid-app/products-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates a PortalProductsApi-compatible adapter from a portal-tenant FetchClient.\n *\n * This bridges the auto-generated portal-tenant API client to the abstract\n * PortalProductsApi interface defined in @fluid-app/products-core, closing\n * over the FetchClient so consumers don't need to pass it per-call.\n *\n * Each method maps the BFF response to the port type at runtime rather than\n * using type assertions, so TypeScript catches schema drift between the\n * generated client and the hand-authored port types at compile time.\n */\nexport function createPortalProductsApiAdapter(\n client: FetchClient,\n): PortalProductsApi {\n return {\n listProducts: async (params) => {\n const response = await portalTenant.products_list(client, {\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n sort: params?.sort as\n | \"title_asc\"\n | \"title_desc\"\n | \"price_asc\"\n | \"price_desc\"\n | \"created_at_asc\"\n | \"created_at_desc\"\n | undefined,\n });\n return {\n products: response.products ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductsResponse;\n },\n\n getProduct: async (id) => {\n const response = await portalTenant.products_show(client, id);\n return {\n product: response.product ?? {},\n meta: response.meta,\n } satisfies portalProducts.PortalProductResponse;\n },\n\n searchProducts: async (query, params) => {\n const response = await portalTenant.products_search(client, {\n q: query,\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n });\n return {\n products: response.products ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductsResponse;\n },\n\n getProductMedia: async (productId) => {\n const response = await portalTenant.products_media_list(\n client,\n productId,\n );\n return {\n media: response.media ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductMediaResponse;\n },\n\n listVisitedMetrics: async (params) => {\n const response = await portalTenant.product_by_visits(client, {\n period: params?.period,\n limit: params?.limit,\n });\n return {\n resources: response.resources ?? [],\n meta: response.meta,\n } satisfies portalProducts.ProductVisitedMetricsResponse;\n },\n\n listShareVisitedMetrics: async (params) => {\n const response = await portalTenant.product_by_shares(client, {\n period: params?.period,\n limit: params?.limit,\n });\n return {\n resources: response.resources ?? [],\n meta: response.meta,\n } satisfies portalProducts.ProductShareVisitedMetricsResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { PortalProductsCoreProvider } from \"@fluid-app/products-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalProductsApiAdapter } from \"../adapters/products-api-adapter\";\n\nexport function PortalProductsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalProductsApiAdapter(client), [client]);\n\n return (\n <PortalProductsCoreProvider api={api}>\n {children}\n </PortalProductsCoreProvider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PortalProductsApiProvider-CNAu2pAb.mjs","names":["portalTenant.products_list","portalTenant.products_show","portalTenant.products_search","portalTenant.products_media_list","portalTenant.product_by_visits","portalTenant.product_by_shares"],"sources":["../../../products/core/src/products-core-api-context.tsx","../../../products/core/src/portal-products-api-context.tsx","../../../products/core/src/hooks/use-debounce.ts","../../../products/core/src/hooks/use-portal-products.ts","../../../products/core/src/hooks/use-portal-product-catalog.ts","../../../products/core/src/hooks/use-portal-product-detail.ts","../../../products/core/src/utils/subscription-plans.ts","../../../products/core/src/stores/use-product-store.ts","../../../products/core/src/stores/use-draft-store.ts","../../../products/core/src/utils/product-helpers.ts","../../../products/core/src/utils/product-price.ts","../src/adapters/products-api-adapter.ts","../src/products/PortalProductsApiProvider.tsx"],"sourcesContent":["import { createContext, useContext, type JSX, type ReactNode } from \"react\";\nimport type { ProductsApi } from \"./products-api\";\n\ninterface ProductsCoreConfig {\n api: ProductsApi;\n}\n\nconst ProductsCoreContext = createContext<ProductsCoreConfig | null>(null);\n\nexport function ProductsCoreProvider({\n api,\n children,\n}: ProductsCoreConfig & { children: ReactNode }): JSX.Element {\n return (\n <ProductsCoreContext.Provider value={{ api }}>\n {children}\n </ProductsCoreContext.Provider>\n );\n}\n\nexport function useProductsApi(): ProductsApi {\n const ctx = useContext(ProductsCoreContext);\n if (!ctx) {\n throw new Error(\n \"useProductsApi must be used within a <ProductsCoreProvider>\",\n );\n }\n return ctx.api;\n}\n","import { createContext, useContext, type JSX, type ReactNode } from \"react\";\nimport type { PortalProductsApi } from \"./portal-products-api\";\n\ninterface PortalProductsCoreConfig {\n api: PortalProductsApi;\n}\n\nconst PortalProductsCoreContext =\n createContext<PortalProductsCoreConfig | null>(null);\n\nexport function PortalProductsCoreProvider({\n api,\n children,\n}: PortalProductsCoreConfig & { children: ReactNode }): JSX.Element {\n return (\n <PortalProductsCoreContext.Provider value={{ api }}>\n {children}\n </PortalProductsCoreContext.Provider>\n );\n}\n\nexport function usePortalProductsApi(): PortalProductsApi {\n const ctx = useContext(PortalProductsCoreContext);\n if (!ctx) {\n throw new Error(\n \"usePortalProductsApi must be used within a <PortalProductsCoreProvider>\",\n );\n }\n return ctx.api;\n}\n","import { useState, useEffect } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { portalProducts } from \"../portal-products-api\";\nimport { usePortalProductsApi } from \"../portal-products-api-context\";\n\nconst portalProductKeys = {\n all: [\"portal-products\"] as const,\n list: (params?: portalProducts.CursorPaginationParams) =>\n [...portalProductKeys.all, \"list\", params] as const,\n detail: (id: string | number) =>\n [...portalProductKeys.all, \"detail\", String(id)] as const,\n search: (query: string, params?: portalProducts.CursorPaginationParams) =>\n [...portalProductKeys.all, \"search\", query, params] as const,\n media: (productId: string | number) =>\n [...portalProductKeys.all, \"media\", String(productId)] as const,\n};\n\nexport { portalProductKeys };\n\nexport function usePortalProducts(\n params?: portalProducts.CursorPaginationParams,\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.list(params),\n queryFn: () => api.listProducts(params),\n });\n}\n\nexport function usePortalProduct(\n id: string | number,\n options?: { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.detail(id),\n queryFn: () => api.getProduct(id),\n enabled: options?.enabled,\n });\n}\n\nexport function usePortalProductSearch(\n query: string,\n params?: portalProducts.CursorPaginationParams & { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n const { enabled, ...paginationParams } = params ?? {};\n return useQuery({\n queryKey: portalProductKeys.search(query, paginationParams),\n queryFn: () => api.searchProducts(query, paginationParams),\n enabled: enabled ?? query.length > 0,\n });\n}\n\nexport function usePortalProductMedia(\n productId: string | number,\n options?: { enabled?: boolean },\n) {\n const api = usePortalProductsApi();\n return useQuery({\n queryKey: portalProductKeys.media(productId),\n queryFn: () => api.getProductMedia(productId),\n enabled: options?.enabled,\n });\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport type { portalProducts } from \"../portal-products-api\";\nimport { usePortalProductsApi } from \"../portal-products-api-context\";\nimport { useDebounce } from \"./use-debounce\";\n\nexport interface UsePortalProductCatalogParams {\n perPage?: number;\n}\n\n/** Page param is a cursor string from the BFF, or undefined for the first page. */\nexport type PortalProductPageParam = string | undefined;\n\nexport function usePortalProductCatalog({\n perPage = 25,\n}: UsePortalProductCatalogParams = {}) {\n const api = usePortalProductsApi();\n const [searchTerm, setSearchTerm] = useState(\"\");\n const debouncedSearchTerm = useDebounce(searchTerm, 300);\n const [currentSort, setCurrentSort] = useState<string>(\"created_at_desc\");\n\n const fetchProducts = useCallback(\n async (\n pageParam?: PortalProductPageParam,\n ): Promise<portalProducts.PortalProductsResponse> => {\n const cursor = pageParam;\n\n if (debouncedSearchTerm) {\n return api.searchProducts(debouncedSearchTerm, {\n cursor,\n limit: perPage,\n sort: currentSort,\n });\n }\n return api.listProducts({\n cursor,\n limit: perPage,\n sort: currentSort,\n });\n },\n [api, debouncedSearchTerm, perPage, currentSort],\n );\n\n const getNextPageParam = useCallback(\n (\n lastPage: portalProducts.PortalProductsResponse,\n _allPages: portalProducts.PortalProductsResponse[],\n lastPageParam: PortalProductPageParam,\n ): PortalProductPageParam => {\n const nextCursor = lastPage.meta?.pagination?.next_cursor ?? undefined;\n // Stop if the API returned the same cursor we just sent (prevents\n // infinite refetch loops when the backend doesn't advance).\n if (nextCursor != null && nextCursor === lastPageParam) {\n return undefined;\n }\n return nextCursor;\n },\n [],\n );\n\n const queryKey = useMemo(\n () => [\n \"portal-product-catalog\",\n debouncedSearchTerm || \"\",\n perPage,\n currentSort,\n ],\n [debouncedSearchTerm, perPage, currentSort],\n );\n\n return {\n searchTerm,\n setSearchTerm,\n debouncedSearchTerm,\n currentSort,\n setCurrentSort,\n fetchProducts,\n getNextPageParam,\n queryKey,\n perPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { usePortalProduct } from \"./use-portal-products\";\n\nexport interface UsePortalProductDetailParams {\n productId: string;\n}\n\nexport function usePortalProductDetail({\n productId,\n}: UsePortalProductDetailParams) {\n const {\n data: productResponse,\n isLoading,\n error,\n } = usePortalProduct(productId);\n\n const product = productResponse?.product;\n\n const images = useMemo(() => {\n if (!product?.images) return [];\n return product.images.map((img, idx) => ({\n id: idx,\n url: img.url ?? \"\",\n alt: img.alt ?? null,\n }));\n }, [product?.images]);\n\n return {\n product,\n isLoading,\n error,\n images,\n };\n}\n","import type { products } from \"../types\";\n\nexport function ensureDefaultSubscriptionPlan(\n plans: readonly products.ProductSubscriptionPlan[],\n): products.ProductSubscriptionPlan[] {\n const activePlans = plans.filter((plan) => plan.active !== false);\n\n if (activePlans.length === 0) {\n return plans.map((plan) => ({ ...plan, default: false }));\n }\n\n const hasActiveDefault = activePlans.some((plan) => plan.default === true);\n\n if (!hasActiveDefault) {\n const planWithLowestId = activePlans.reduce((lowest, current) => {\n const lowestId = lowest.subscription_plan?.id || Infinity;\n const currentId = current.subscription_plan?.id || Infinity;\n return currentId < lowestId ? current : lowest;\n });\n\n return plans.map((plan) => ({\n ...plan,\n default:\n plan.subscription_plan?.id === planWithLowestId.subscription_plan?.id &&\n plan.active !== false,\n }));\n }\n\n return plans.map((plan) => ({\n ...plan,\n default: plan.active !== false ? plan.default : false,\n }));\n}\n\nexport function plansToAttributes(\n plans: readonly products.ProductSubscriptionPlan[],\n): products.ProductSubscriptionPlanAttribute[] {\n return plans.map((plan) => ({\n id: plan.id ?? undefined,\n subscription_plan_id: plan.subscription_plan.id,\n default: plan.default || false,\n active: plan.active !== false,\n }));\n}\n","import { create, type StateCreator } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { products } from \"../types\";\nimport {\n ensureDefaultSubscriptionPlan,\n plansToAttributes,\n} from \"../utils/subscription-plans\";\n\n// Default state\nconst defaultState = {\n id: undefined,\n title: \"\",\n description: \"\",\n introduction: \"\",\n stripped: \"\",\n feature_text: \"\",\n sku: \"\",\n slug: \"\",\n canonical_url: null as string | null,\n image_url: \"\",\n image_path: undefined,\n status: \"draft\",\n publish_at: null,\n price: \"0\",\n commission: 0,\n public: true,\n no_index: false,\n show_reviews: true,\n publish_to_retail_store: true,\n publish_to_rep_store: true,\n publish_to_share_tab: true,\n collection_ids: [],\n tag_ids: [],\n images_attributes: [],\n product_subscription_plans_attributes: [],\n product_subscription_plans: [],\n variants_attributes: [],\n bundle: false,\n track_inventory_on_bundle_items: false,\n product_bundles_attributes: [],\n option_attrs: [],\n options: [],\n metafields_attributes: [],\n metadata: {},\n search_engine_optimizer_attributes: {\n title: \"\",\n description: \"\",\n image_url: \"\",\n image_path: \"\",\n block_crawler: false,\n },\n};\n\ntype ValidationErrors = Partial<Record<string, string>>;\n\nexport type TranslationData = {\n title?: string;\n introduction?: string;\n description?: string;\n feature_text?: string;\n};\n\ntype LanguageTranslations = Record<string, TranslationData>;\ntype TranslationLoadingState = Record<string, boolean>;\n\ninterface UpdateFieldOptions {\n shouldValidate?: boolean;\n shouldClearError?: boolean;\n markDirty?: boolean;\n}\n\ntype ArrayItemType<T> = T extends (infer U)[] ? U : unknown;\n\ntype ProductStoreFields = products.UpdateProduct & {\n product_subscription_plans: products.ProductSubscriptionPlan[];\n track_inventory_on_bundle_items: boolean;\n canonical_url: string | null;\n publish_at: string | null;\n};\n\nexport type ProductStoreState = ProductStoreFields & {\n errors: ValidationErrors;\n isValid: boolean;\n isDirty: boolean;\n translations: LanguageTranslations;\n editedTranslations: LanguageTranslations;\n translationErrors: Record<string, Record<string, string | undefined>>;\n translationLoading: TranslationLoadingState;\n translationsFetched: boolean;\n\n setProduct: (productData: products.Product) => void;\n updateField: <K extends keyof ProductStoreFields>(\n key: K,\n value: ProductStoreFields[K],\n options?: UpdateFieldOptions,\n ) => void;\n updatePartial: (updates: Partial<ProductStoreFields>) => void;\n updateSlug: (slug: string, isManual?: boolean) => void;\n updateSEO: (seo: {\n title?: string;\n description?: string;\n image_url?: string;\n image_path?: string;\n block_crawler?: boolean;\n }) => void;\n updateArrayItem: <K extends keyof ProductStoreFields>(\n arrayKey: K,\n itemId: number | string,\n updatedItem: ArrayItemType<ProductStoreFields[K]>,\n idField?: string,\n ) => void;\n reset: () => void;\n validateField: (field: string) => void;\n validateRequired: () => boolean;\n clearErrors: () => void;\n clearFieldError: (field: string) => void;\n markClean: () => void;\n\n setTranslationLoading: (languageIso: string, loading: boolean) => void;\n setTranslationData: (languageIso: string, data: TranslationData) => void;\n updateTranslationField: (\n languageIso: string,\n field: keyof TranslationData,\n value: string,\n ) => void;\n getOriginalTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n getEditedTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n setTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n error?: string,\n ) => void;\n getTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n getTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => string | undefined;\n isTranslationLoading: (languageIso: string) => boolean;\n resetTranslations: () => void;\n setTranslationsFetched: (fetched: boolean) => void;\n};\n\nfunction syncSubscriptionPlans(plans: products.ProductSubscriptionPlan[]): {\n product_subscription_plans: products.ProductSubscriptionPlan[];\n product_subscription_plans_attributes: products.ProductSubscriptionPlanAttribute[];\n} {\n const activePlans = plans.filter((plan) => plan.active !== false);\n const plansWithDefault =\n activePlans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n return {\n product_subscription_plans: plansWithDefault,\n product_subscription_plans_attributes: plansToAttributes(plansWithDefault),\n };\n}\n\nconst extractFilenameFromUrl = (imageUrl: string): string => {\n try {\n const url = new URL(imageUrl);\n return url.pathname.split(\"/\").pop() || \"\";\n } catch {\n return imageUrl.split(\"/\").pop()?.split(\"?\")[0] || \"\";\n }\n};\n\nconst createProductStore: StateCreator<ProductStoreState> = (set, get) => ({\n ...defaultState,\n track_inventory_on_bundle_items: false,\n translations: {},\n editedTranslations: {},\n translationErrors: {},\n translationLoading: {},\n translationsFetched: false,\n errors: {},\n isValid: false,\n isDirty: false,\n\n setProduct: (productData: products.Product) => {\n const transformedData: ProductStoreFields = {\n id: productData.id || undefined,\n title: productData.title || \"\",\n description: productData.description || \"\",\n introduction: productData.introduction || \"\",\n stripped: productData.stripped || \"\",\n feature_text: productData.feature_text || \"\",\n sku: productData.sku || \"\",\n slug: productData.slug || \"\",\n canonical_url: productData.canonical_url || null,\n custom_slug: productData.custom_slug || false,\n image_url: productData.image_url || \"\",\n image_path:\n productData.image_path && !productData.image_path.includes(\"undefined\")\n ? productData.image_path\n : productData.image_url\n ? extractFilenameFromUrl(productData.image_url)\n : undefined,\n status: productData.status || \"draft\",\n publish_at: productData.publish_at || null,\n commission:\n typeof productData.commission === \"string\"\n ? parseFloat(productData.commission)\n : productData.commission || 0,\n public: productData.public ?? true,\n no_index: productData.no_index ?? false,\n show_reviews: productData.show_reviews ?? true,\n publish_to_retail_store: productData.publish_to_retail_store,\n publish_to_rep_store: productData.publish_to_rep_store,\n publish_to_share_tab: productData.publish_to_share_tab,\n ...(productData.tax_category_id && {\n tax_category_id: productData.tax_category_id,\n }),\n international_tax_type: productData.international_tax_type || undefined,\n category_id: productData.category_id\n ? parseInt(productData.category_id)\n : productData.category?.id\n ? productData.category.id\n : undefined,\n application_theme_template_id:\n productData.application_theme_template_id || undefined,\n collection_ids: (\n productData.collections as Array<{ id: number }> | undefined\n )?.map((collection) => collection.id),\n tag_ids: Array.isArray(productData.tags)\n ? (productData.tags as Array<{ id: number } | number>)\n .map((tag) => (typeof tag === \"number\" ? tag : tag?.id))\n .filter(Boolean)\n : [],\n search_engine_optimizer_attributes: {\n id: productData.search_engine_optimizer?.id,\n title:\n productData.search_engine_optimizer?.title ||\n productData.title ||\n undefined,\n description: productData.search_engine_optimizer?.description || \"\",\n image_url:\n productData.search_engine_optimizer?.image_url ||\n productData.image_url ||\n \"\",\n image_path:\n productData.search_engine_optimizer?.image_path ||\n productData.image_path ||\n \"\",\n block_crawler:\n productData.search_engine_optimizer?.block_crawler ?? false,\n },\n images_attributes:\n (productData.images as products.ImageAttribute[] | undefined)?.map(\n (img) => ({\n id: img.id,\n position: img.position || 0,\n image_url: img.image_url,\n image_path:\n img.image_path && !img.image_path.includes(\"undefined\")\n ? img.image_path\n : img.image_url\n ? extractFilenameFromUrl(img.image_url)\n : undefined,\n _destroy: false,\n }),\n ) || [],\n ...(productData.images &&\n productData.images.length > 0 && {\n image_path: (() => {\n if (\n productData.image_path &&\n typeof productData.image_path === \"string\" &&\n !productData.image_path.includes(\"undefined\")\n ) {\n return productData.image_path;\n }\n const firstImage = (\n productData.images as products.ImageAttribute[]\n ).find((img) => img.position === 0);\n if (\n firstImage?.image_path &&\n typeof firstImage.image_path === \"string\" &&\n !firstImage.image_path.includes(\"undefined\")\n ) {\n return firstImage.image_path;\n }\n return productData.image_url\n ? extractFilenameFromUrl(productData.image_url)\n : undefined;\n })(),\n }),\n product_subscription_plans: (() => {\n const plans =\n productData?.product_subscription_plans?.map(\n (plan: products.ProductSubscriptionPlan) => ({\n ...plan,\n active: plan?.active,\n }),\n ) || [];\n return plans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n })(),\n product_subscription_plans_attributes: (() => {\n const plans =\n productData?.product_subscription_plans?.map(\n (plan: products.ProductSubscriptionPlan) => ({\n ...plan,\n active: plan?.active,\n }),\n ) || [];\n const finalPlans =\n plans.length > 0 ? ensureDefaultSubscriptionPlan(plans) : plans;\n return plansToAttributes(finalPlans);\n })(),\n variants_attributes: productData?.variants\n ?.filter(\n (\n variant: products.Variant,\n ): variant is products.Variant & { id: number } =>\n variant.id !== null && variant.id !== undefined,\n )\n .map((variant) => ({\n id: variant.id,\n title: variant.title ?? productData?.title ?? \"Untitled Variant\",\n option_attrs: variant.option_attrs || [],\n sku: variant.sku || undefined,\n price: variant.price,\n track_quantity: variant.track_quantity ?? false,\n keep_selling: variant.keep_selling ?? false,\n bar_code: variant.bar_code ?? \"\",\n limit_subscription: variant.limit_subscription,\n subscription_max_qty: variant.subscription_max_qty ?? 0,\n customer_limit: variant.customer_limit ?? 0,\n is_master: variant.is_master,\n _destroy: false,\n images_attributes: variant?.images?.map(\n (image: { id?: number; position: number; image_url: string }) => ({\n id: image.id,\n position: image.position || 0,\n image_url: image.image_url,\n _destroy: false,\n }),\n ),\n inventory_levels_attributes: variant?.inventory_levels\n ?.filter(\n (level: products.InventoryLevel) =>\n (level.warehouse_id ?? level.warehouse?.id) != null,\n )\n .map((level: products.InventoryLevel) => ({\n id: level.id,\n available: level.available,\n committed: level.committed,\n on_hand: level.on_hand,\n unavailable: level.unavailable,\n warehouse_id: level.warehouse?.id || 0,\n _destroy: false,\n })),\n variant_countries_attributes: variant?.variant_countries\n ? Object.entries(\n variant.variant_countries as Record<\n string,\n products.VariantCountry\n >,\n ).map(([iso, country]) => ({\n id: country.id ?? 0,\n active: country.active ?? true,\n country_id: country.country_id,\n country_name: country.country_name ?? \"\",\n country_iso: iso,\n price: Number(country.price) || 0,\n subscription_price: Number(country.subscription_price) || 0,\n wholesale: Number(country.wholesale) || 0,\n wholesale_subscription_price:\n Number(country.wholesale_subscription_price) || 0,\n compare_price: Number(country.compare_price) || 0,\n cv: Number(country.cv) || 0,\n qv: Number(country.qv) || 0,\n pc_cv: Number(country.pc_cv) || 0,\n pc_qv: Number(country.pc_qv) || 0,\n cost_of_goods_sold: Number(country.cost_of_goods_sold) || 0,\n currency_code: country.currency_code || null,\n shipping: Number(country.shipping) || 0,\n points: country.points,\n }))\n : [],\n })),\n bundle:\n productData.product_bundles && productData.product_bundles.length > 0,\n track_inventory_on_bundle_items:\n productData.track_inventory_on_bundle_items ?? false,\n product_bundles_attributes: (productData.product_bundles || []).map(\n (bundle: products.ProductBundle) => ({\n id: bundle.id,\n bundled_variant_id: bundle.bundled_variant?.id || 0,\n bundled_variant: {\n title: bundle.bundled_variant?.title || \"\",\n sku: bundle.bundled_variant?.sku || null,\n price: String(bundle.bundled_variant?.price || \"0\"),\n price_in_currency: bundle.bundled_variant?.price_in_currency || \"\",\n currency_code: bundle.bundled_variant?.currency_code,\n product: {\n id: bundle.bundled_variant?.product.id || 0,\n title: bundle.bundled_variant?.product.title || \"\",\n image_url: bundle.bundled_variant?.product.image_url || \"\",\n price: bundle.bundled_variant?.product.price || \"0\",\n price_in_currency:\n bundle.bundled_variant?.product.price_in_currency || \"\",\n cv: bundle.bundled_variant?.product.cv || 0,\n qv: bundle.bundled_variant?.product.qv || 0,\n },\n },\n cv: bundle.cv || 0,\n qv: bundle.qv || 0,\n quantity: bundle.quantity,\n display_externally: bundle.display_externally ?? true,\n _destroy: false,\n }),\n ),\n option_attrs: productData.option_attrs || [],\n options: productData.options || [],\n metafields_attributes: (productData.metafields || []).map(\n (metafield: products.Metafield) => ({\n id: metafield.id,\n namespace: metafield.namespace,\n key: metafield.key,\n value: metafield.value,\n value_type: metafield.value_type,\n _destroy: false,\n }),\n ),\n metadata: productData.metadata || {},\n };\n\n set({\n ...transformedData,\n errors: {},\n isValid: false,\n isDirty: false,\n });\n },\n\n updateSlug: (slug, isManual = true) => {\n set((state: ProductStoreState) => ({\n slug,\n custom_slug: isManual,\n search_engine_optimizer_attributes: {\n ...state.search_engine_optimizer_attributes,\n title: state.search_engine_optimizer_attributes?.title || \"\",\n description:\n state.search_engine_optimizer_attributes?.description || \"\",\n image_url: state.search_engine_optimizer_attributes?.image_url || \"\",\n image_path: state.search_engine_optimizer_attributes?.image_path || \"\",\n block_crawler:\n state.search_engine_optimizer_attributes?.block_crawler ?? false,\n },\n isDirty: true,\n }));\n },\n\n updateSEO: (seo) => {\n set((state: ProductStoreState) => ({\n search_engine_optimizer_attributes: {\n ...state.search_engine_optimizer_attributes,\n title:\n seo.title !== undefined\n ? seo.title\n : state.search_engine_optimizer_attributes?.title || \"\",\n description:\n seo.description !== undefined\n ? seo.description\n : state.search_engine_optimizer_attributes?.description || \"\",\n image_url:\n seo.image_url !== undefined\n ? seo.image_url\n : state.search_engine_optimizer_attributes?.image_url || \"\",\n image_path:\n seo.image_path !== undefined\n ? seo.image_path\n : state.search_engine_optimizer_attributes?.image_path || \"\",\n block_crawler:\n seo.block_crawler !== undefined\n ? seo.block_crawler\n : (state.search_engine_optimizer_attributes?.block_crawler ??\n false),\n },\n isDirty: true,\n }));\n },\n\n updateField: <K extends keyof ProductStoreFields>(\n key: K,\n value: ProductStoreFields[K],\n options?: UpdateFieldOptions,\n ) => {\n const {\n shouldValidate = false,\n shouldClearError = true,\n markDirty = true,\n } = options || {};\n\n set((state: ProductStoreState) => {\n if (key === \"product_subscription_plans\") {\n return {\n ...state,\n ...syncSubscriptionPlans(value as products.ProductSubscriptionPlan[]),\n errors: shouldClearError\n ? { ...state.errors, [key]: undefined }\n : state.errors,\n isDirty: markDirty ? true : state.isDirty,\n };\n }\n\n return {\n ...state,\n [key]: value,\n errors: shouldClearError\n ? { ...state.errors, [key]: undefined }\n : state.errors,\n isDirty: markDirty ? true : state.isDirty,\n };\n });\n\n if (shouldValidate) {\n get().validateField(key as string);\n }\n },\n\n updatePartial: (updates: Partial<ProductStoreFields>) => {\n set((state: ProductStoreState) => {\n if (updates.product_subscription_plans) {\n return {\n ...state,\n ...updates,\n ...syncSubscriptionPlans(updates.product_subscription_plans),\n errors: {\n ...state.errors,\n ...Object.keys(updates).reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>,\n ),\n },\n isDirty: true,\n };\n }\n\n return {\n ...state,\n ...updates,\n errors: {\n ...state.errors,\n ...Object.keys(updates).reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>,\n ),\n },\n isDirty: true,\n };\n });\n },\n\n updateArrayItem: <K extends keyof ProductStoreFields>(\n arrayKey: K,\n itemId: number | string,\n updatedItem: ArrayItemType<ProductStoreFields[K]>,\n idField: string = \"id\",\n ) => {\n set((state: ProductStoreState) => {\n const currentArray = Array.isArray(state[arrayKey])\n ? (state[arrayKey] as unknown[])\n : [];\n\n const updatedArray = currentArray.map((item) => {\n if (\n typeof item === \"object\" &&\n item !== null &&\n idField in item &&\n (item as Record<string, unknown>)[idField] === itemId\n ) {\n return updatedItem;\n }\n return item;\n });\n\n if (arrayKey === \"product_subscription_plans\") {\n return {\n ...state,\n ...syncSubscriptionPlans(\n updatedArray as products.ProductSubscriptionPlan[],\n ),\n errors: { ...state.errors, [arrayKey]: undefined },\n isDirty: true,\n };\n }\n\n return {\n ...state,\n [arrayKey]: updatedArray,\n errors: { ...state.errors, [arrayKey]: undefined },\n isDirty: true,\n };\n });\n },\n\n reset: () => {\n set({\n ...defaultState,\n track_inventory_on_bundle_items: false,\n custom_slug: false,\n errors: {},\n isValid: false,\n isDirty: false,\n });\n },\n\n // Validation methods — these provide basic field-level validation.\n // For full schema validation (e.g. Zod), the consumer should call\n // their own validation function against the store state.\n validateField: (field: string) => {\n const fieldValue = get()[field as keyof ProductStoreState];\n const hasValue =\n fieldValue !== undefined && fieldValue !== null && fieldValue !== \"\";\n\n set((state: ProductStoreState) => ({\n errors: {\n ...state.errors,\n [field]: hasValue ? undefined : `${field} is required`,\n },\n isValid:\n hasValue &&\n Object.keys(state.errors).every(\n (key) => key === field || !state.errors[key],\n ),\n }));\n },\n\n validateRequired: () => {\n // Basic validation: check that title exists\n const state = get();\n const errors: ValidationErrors = {};\n\n if (!state.title) {\n errors.title = \"Title is required\";\n }\n\n if (Object.keys(errors).length > 0) {\n set({ errors, isValid: false });\n return false;\n }\n\n set({ errors: {}, isValid: true });\n return true;\n },\n\n clearErrors: () => {\n set({ errors: {}, isValid: false });\n },\n\n clearFieldError: (field: string) => {\n set((state: ProductStoreState) => ({\n errors: { ...state.errors, [field]: undefined },\n }));\n },\n\n markClean: () => {\n set({ isDirty: false });\n },\n\n // Translation methods\n setTranslationLoading: (languageIso: string, loading: boolean) => {\n set((state: ProductStoreState) => ({\n translationLoading: {\n ...state.translationLoading,\n [languageIso]: loading,\n },\n }));\n },\n\n setTranslationData: (languageIso: string, data: TranslationData) => {\n set((state: ProductStoreState) => ({\n translations: {\n ...state.translations,\n [languageIso]: data,\n },\n translationLoading: {\n ...state.translationLoading,\n [languageIso]: false,\n },\n }));\n },\n\n updateTranslationField: (\n languageIso: string,\n field: keyof TranslationData,\n value: string,\n ) => {\n set((state: ProductStoreState) => {\n const originalValue = state.translations[languageIso]?.[field];\n let error: string | undefined;\n\n if (\n field === \"title\" &&\n value === \"\" &&\n originalValue &&\n originalValue.trim() !== \"\"\n ) {\n error = \"Title is required\";\n }\n\n return {\n editedTranslations: {\n ...state.editedTranslations,\n [languageIso]: {\n ...state.editedTranslations[languageIso],\n [field]: value,\n },\n },\n translationErrors: {\n ...state.translationErrors,\n [languageIso]: {\n ...state.translationErrors[languageIso],\n [field]: error,\n },\n },\n };\n });\n },\n\n getTranslation: (languageIso: string, field: keyof TranslationData) => {\n const state = get();\n return (\n state.editedTranslations[languageIso]?.[field] ??\n state.translations[languageIso]?.[field]\n );\n },\n\n getOriginalTranslation: (\n languageIso: string,\n field: keyof TranslationData,\n ) => {\n return get().translations[languageIso]?.[field];\n },\n\n getEditedTranslation: (languageIso: string, field: keyof TranslationData) => {\n return get().editedTranslations[languageIso]?.[field];\n },\n\n setTranslationError: (\n languageIso: string,\n field: keyof TranslationData,\n error?: string,\n ) => {\n set((state: ProductStoreState) => ({\n translationErrors: {\n ...state.translationErrors,\n [languageIso]: {\n ...state.translationErrors[languageIso],\n [field]: error,\n },\n },\n }));\n },\n\n getTranslationError: (languageIso: string, field: keyof TranslationData) => {\n return get().translationErrors[languageIso]?.[field];\n },\n\n isTranslationLoading: (languageIso: string) => {\n return get().translationLoading[languageIso] ?? false;\n },\n\n resetTranslations: () => {\n set({\n translations: {},\n editedTranslations: {},\n translationErrors: {},\n translationLoading: {},\n translationsFetched: false,\n });\n },\n\n setTranslationsFetched: (fetched: boolean) => {\n set({ translationsFetched: fetched });\n },\n});\n\nexport const useProductStore =\n process.env.NODE_ENV === \"development\"\n ? create<ProductStoreState>()(\n devtools(createProductStore, { name: \"product-store\" }),\n )\n : create<ProductStoreState>()(createProductStore);\n","import { create } from \"zustand\";\n\ninterface DraftStore {\n draftData: unknown | null;\n isFromSettings: boolean;\n navigationTarget: string | null;\n\n saveDraft: (data: unknown) => void;\n getDraft: () => unknown | null;\n clearDraft: () => void;\n setFromSettings: (value: boolean) => void;\n setNavigationTarget: (target: string | null) => void;\n reset: () => void;\n}\n\nexport const useDraftStore = create<DraftStore>()((set, get) => ({\n draftData: null,\n isFromSettings: false,\n navigationTarget: null,\n\n saveDraft: (data: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const formData = data as any;\n const hasContent =\n formData?.title ||\n formData?.description ||\n formData?.sku ||\n (formData?.product_subscription_plans &&\n formData.product_subscription_plans.length > 0);\n\n if (hasContent) {\n set({ draftData: data });\n }\n },\n\n getDraft: () => {\n const { draftData, isFromSettings, navigationTarget } = get();\n\n if (!draftData) {\n return null;\n }\n\n if (isFromSettings && navigationTarget) {\n return draftData;\n }\n\n set({ draftData: null });\n return null;\n },\n\n clearDraft: () => {\n const { draftData } = get();\n if (draftData) {\n set({ draftData: null });\n }\n },\n\n setFromSettings: (value: boolean) => {\n set({ isFromSettings: value });\n },\n\n setNavigationTarget: (target: string | null) => {\n set({ navigationTarget: target });\n },\n\n reset: () => {\n set({ draftData: null, isFromSettings: false, navigationTarget: null });\n },\n}));\n","import type { products } from \"../types\";\n\nexport function createSlug(title: string): string {\n return title\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function stripHtmlTags(html: string): string {\n return html\n .replace(/<[^>]*>/g, \"\")\n .replace(/&[^;]+;/g, \" \")\n .trim();\n}\n\nexport function getVariantImageUrl(\n variant?: {\n primary_image?: string | null;\n image_url?: string | null;\n images?: Array<{ image_url: string }> | null;\n } | null,\n product?: { image_url?: string | null } | null,\n): string {\n if (!variant) return product?.image_url || \"\";\n if (variant.primary_image) return variant.primary_image;\n if (variant.image_url) return variant.image_url;\n if (Array.isArray(variant.images) && variant.images.length > 0) {\n const firstImage = variant.images[0];\n if (firstImage?.image_url) return firstImage.image_url;\n }\n return product?.image_url || \"\";\n}\n\nexport function getProductImageUrl(\n product?: {\n image_url?: string | null;\n images?: Array<{ image_url: string; position?: number }> | null;\n } | null,\n): string | null {\n if (!product) return null;\n if (Array.isArray(product.images) && product.images.length > 0) {\n const sortedImages = [...product.images].sort(\n (a, b) => (a.position ?? 0) - (b.position ?? 0),\n );\n const primaryImage = sortedImages[0];\n if (primaryImage?.image_url) return primaryImage.image_url;\n }\n return product.image_url ?? null;\n}\n\nexport function sanitizeBundleData<\n T extends products.CreateProduct | products.UpdateProduct,\n>(productData: T): T {\n const activeVariants = (productData.variants_attributes || []).filter(\n (variant) => !variant._destroy,\n );\n const hasMultipleVariants = activeVariants.length > 1;\n\n const activeOptions = (productData.options || []).filter(\n (opt) => !opt._destroy,\n );\n const derivedOptionAttrs = [\n ...new Set(activeOptions.map((opt) => opt.title.toLowerCase())),\n ];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { options, option_attrs, ...restProductData } = productData;\n\n // We spread the original data and override specific fields, preserving the\n // runtime shape. The cast to T is safe because we only narrow/replace fields\n // that exist on the base type.\n if (hasMultipleVariants) {\n return {\n ...productData,\n options: undefined,\n option_attrs: derivedOptionAttrs,\n bundle: false,\n product_bundles_attributes: [],\n track_inventory_on_bundle_items: false,\n } as T;\n }\n\n return {\n ...productData,\n options: undefined,\n option_attrs: derivedOptionAttrs,\n } as T;\n}\n\nexport interface ApiErrorShape {\n message?: string;\n error_message?: string;\n status?: number;\n data?: unknown;\n errors?: Record<string, string[]>;\n}\n\nfunction getErrorsFromApiError(\n error: ApiErrorShape,\n): Record<string, string[]> | undefined {\n if (error?.errors && typeof error.errors === \"object\") {\n return error.errors;\n }\n if (error?.data && typeof error.data === \"object\") {\n const data = error.data as Record<string, unknown>;\n const firstKey = Object.keys(data)[0];\n if (firstKey && Array.isArray(data[firstKey])) {\n return data as Record<string, string[]>;\n }\n }\n return undefined;\n}\n\nfunction formatFieldName(fieldName: string): string {\n const SEO_FIELD_LABELS: Record<string, string> = {\n \"search_engine_optimizer.title\": \"SEO Title\",\n \"search_engine_optimizer.description\": \"SEO Description\",\n \"search_engine_optimizer.image_url\": \"SEO Image\",\n };\n\n if (SEO_FIELD_LABELS[fieldName]) return SEO_FIELD_LABELS[fieldName];\n\n const parts = fieldName.split(\".\");\n if (parts.length > 1) {\n return parts\n .map((part, index) =>\n part\n .split(\"_\")\n .map((word, wordIndex) => {\n if (\n (index === 0 && wordIndex === 0) ||\n (index > 0 && wordIndex > 0)\n )\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n return word.toLowerCase();\n })\n .join(\" \"),\n )\n .join(\" \");\n }\n\n return fieldName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\nexport function getErrorMessage(\n error: ApiErrorShape,\n fallbackMessage: string,\n): string {\n if (error?.message && error.message !== \"unprocessable entity\") {\n return error.message;\n }\n\n const errorsObj = getErrorsFromApiError(error);\n if (errorsObj) {\n const firstField = Object.keys(errorsObj)[0];\n if (firstField && errorsObj[firstField]) {\n const fieldErrors = errorsObj[firstField];\n if (\n Array.isArray(fieldErrors) &&\n fieldErrors.length > 0 &&\n fieldErrors[0]\n ) {\n return `${formatFieldName(firstField)} ${fieldErrors[0]}`;\n }\n }\n }\n\n return fallbackMessage;\n}\n\nexport function isSeoError(fieldName: string): boolean {\n return (\n fieldName.startsWith(\"search_engine_optimizer\") || fieldName === \"slug\"\n );\n}\n\nexport function extractSeoErrors(\n error: ApiErrorShape,\n): Array<{ field: string; message: string }> {\n const seoErrors: Array<{ field: string; message: string }> = [];\n const errorsObj = getErrorsFromApiError(error);\n if (errorsObj) {\n for (const fieldName of Object.keys(errorsObj)) {\n if (isSeoError(fieldName) && errorsObj[fieldName]) {\n const fieldErrors = errorsObj[fieldName];\n if (\n Array.isArray(fieldErrors) &&\n fieldErrors.length > 0 &&\n fieldErrors[0]\n ) {\n seoErrors.push({\n field: fieldName,\n message: `${formatFieldName(fieldName)} ${fieldErrors[0].charAt(0).toUpperCase() + fieldErrors[0].slice(1)}`,\n });\n }\n }\n }\n }\n return seoErrors;\n}\n","import type { products } from \"../types\";\n\ntype ProductPriceInput = products.Product | products.ShopProduct;\n\nfunction stripParentheticalText(text: string | undefined): string | null {\n if (!text) return null;\n return text.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nfunction isShopVariantCountry(\n vc: products.VariantCountry | products.ShopVariantCountry | undefined,\n): vc is products.ShopVariantCountry {\n return vc !== undefined && \"display_wholesale_subscription_price\" in vc;\n}\n\nfunction isAdminProduct(\n product: ProductPriceInput,\n): product is products.Product {\n return \"display_price\" in product;\n}\n\nfunction isVariantCountriesRecord(\n vc: unknown,\n): vc is Record<string, products.VariantCountry> {\n return vc !== null && typeof vc === \"object\" && !Array.isArray(vc);\n}\n\nexport function determineProductPrice(\n product: ProductPriceInput,\n countryIso: string,\n): { repPrice: string | null | undefined; price?: string | null } {\n const { variants } = product;\n\n // Get the first active variant for the country, or fall back to first variant\n const selectedVariant =\n variants?.find((v) => {\n if (isVariantCountriesRecord(v.variant_countries)) {\n return v.variant_countries[countryIso]?.active;\n }\n return false;\n }) ||\n variants?.[0] ||\n null;\n\n let variantCountry:\n | products.VariantCountry\n | products.ShopVariantCountry\n | undefined;\n if (countryIso && selectedVariant?.variant_countries) {\n const variantCountries = selectedVariant.variant_countries;\n\n if (Array.isArray(variantCountries)) {\n variantCountry = variantCountries.find(\n (v: products.ShopVariantCountry) => v?.country?.iso === countryIso,\n );\n } else if (isVariantCountriesRecord(variantCountries)) {\n variantCountry = variantCountries[countryIso];\n }\n }\n\n if (selectedVariant?.subscription_only)\n return {\n repPrice: isShopVariantCountry(variantCountry)\n ? variantCountry.display_wholesale_subscription_price\n : undefined,\n };\n\n const price = isShopVariantCountry(variantCountry)\n ? variantCountry.display_price\n : isAdminProduct(product)\n ? product.display_price\n : undefined;\n\n const repPrice = isShopVariantCountry(variantCountry)\n ? variantCountry.display_wholesale\n : undefined;\n return {\n repPrice: stripParentheticalText(repPrice),\n price: price === repPrice ? null : stripParentheticalText(price),\n };\n}\n\nexport function extractPriceFromString(priceString: string): number | null {\n if (!priceString) return null;\n const strippedString = priceString.replace(/[^\\d.]/g, \"\");\n return parseFloat(strippedString);\n}\n","import type {\n PortalProductsApi,\n portalProducts,\n} from \"@fluid-app/products-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates a PortalProductsApi-compatible adapter from a portal-tenant FetchClient.\n *\n * This bridges the auto-generated portal-tenant API client to the abstract\n * PortalProductsApi interface defined in @fluid-app/products-core, closing\n * over the FetchClient so consumers don't need to pass it per-call.\n *\n * Each method maps the BFF response to the port type at runtime rather than\n * using type assertions, so TypeScript catches schema drift between the\n * generated client and the hand-authored port types at compile time.\n */\nexport function createPortalProductsApiAdapter(\n client: FetchClient,\n): PortalProductsApi {\n return {\n listProducts: async (params) => {\n const response = await portalTenant.products_list(client, {\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n sort: params?.sort as\n | \"title_asc\"\n | \"title_desc\"\n | \"price_asc\"\n | \"price_desc\"\n | \"created_at_asc\"\n | \"created_at_desc\"\n | undefined,\n });\n return {\n products: response.products ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductsResponse;\n },\n\n getProduct: async (id) => {\n const response = await portalTenant.products_show(client, id);\n return {\n product: response.product ?? {},\n meta: response.meta,\n } satisfies portalProducts.PortalProductResponse;\n },\n\n searchProducts: async (query, params) => {\n const response = await portalTenant.products_search(client, {\n q: query,\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n });\n return {\n products: response.products ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductsResponse;\n },\n\n getProductMedia: async (productId) => {\n const response = await portalTenant.products_media_list(\n client,\n productId,\n );\n return {\n media: response.media ?? [],\n meta: response.meta,\n } satisfies portalProducts.PortalProductMediaResponse;\n },\n\n listVisitedMetrics: async (params) => {\n const response = await portalTenant.product_by_visits(client, {\n period: params?.period,\n limit: params?.limit,\n });\n return {\n resources: response.resources ?? [],\n meta: response.meta,\n } satisfies portalProducts.ProductVisitedMetricsResponse;\n },\n\n listShareVisitedMetrics: async (params) => {\n const response = await portalTenant.product_by_shares(client, {\n period: params?.period,\n limit: params?.limit,\n });\n return {\n resources: response.resources ?? [],\n meta: response.meta,\n } satisfies portalProducts.ProductShareVisitedMetricsResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { PortalProductsCoreProvider } from \"@fluid-app/products-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalProductsApiAdapter } from \"../adapters/products-api-adapter\";\n\nexport function PortalProductsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalProductsApiAdapter(client), [client]);\n\n return (\n <PortalProductsCoreProvider api={api}>\n {children}\n </PortalProductsCoreProvider>\n );\n}\n"],"mappings":"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"}
@@ -14,4 +14,4 @@ function usePortalTenantClient() {
14
14
  //#endregion
15
15
  export { usePortalTenantClient as n, PortalTenantClientProvider as t };
16
16
 
17
- //# sourceMappingURL=PortalTenantClientProvider-CjJzBCTL.mjs.map
17
+ //# sourceMappingURL=PortalTenantClientProvider-Bni6J3KS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortalTenantClientProvider-CjJzBCTL.mjs","names":[],"sources":["../src/providers/PortalTenantClientProvider.tsx"],"sourcesContent":["import { createContext, useContext, type Provider } from \"react\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\n\nconst PortalTenantClientContext = createContext<FetchClient | null>(null);\n\nexport const PortalTenantClientProvider: Provider<FetchClient | null> =\n PortalTenantClientContext.Provider;\n\n/**\n * Returns the portal-tenant FetchClient from context.\n * Must be used within a FluidProvider.\n */\nexport function usePortalTenantClient(): FetchClient {\n const client = useContext(PortalTenantClientContext);\n if (!client) {\n throw new Error(\n \"usePortalTenantClient must be used within a FluidProvider\",\n );\n }\n return client;\n}\n"],"mappings":";;AAGA,MAAM,4BAA4B,cAAkC,KAAK;AAEzE,MAAa,6BACX,0BAA0B;;;;;AAM5B,SAAgB,wBAAqC;CACnD,MAAM,SAAS,WAAW,0BAA0B;AACpD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,4DACD;AAEH,QAAO"}
1
+ {"version":3,"file":"PortalTenantClientProvider-Bni6J3KS.mjs","names":[],"sources":["../src/providers/PortalTenantClientProvider.tsx"],"sourcesContent":["import { createContext, useContext, type Provider } from \"react\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\n\nconst PortalTenantClientContext = createContext<FetchClient | null>(null);\n\nexport const PortalTenantClientProvider: Provider<FetchClient | null> =\n PortalTenantClientContext.Provider;\n\n/**\n * Returns the portal-tenant FetchClient from context.\n * Must be used within a FluidProvider.\n */\nexport function usePortalTenantClient(): FetchClient {\n const client = useContext(PortalTenantClientContext);\n if (!client) {\n throw new Error(\n \"usePortalTenantClient must be used within a FluidProvider\",\n );\n }\n return client;\n}\n"],"mappings":";;AAGA,MAAM,4BAA4B,cAAkC,KAAK;AAEzE,MAAa,6BACX,0BAA0B;;;;;AAM5B,SAAgB,wBAAqC;CACnD,MAAM,SAAS,WAAW,0BAA0B;AACpD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,4DACD;AAEH,QAAO"}
@@ -1,9 +1,9 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- require("./FluidProvider-DprqXNu4.cjs");
2
+ require("./FluidProvider-DGxCCmVB.cjs");
3
3
  require("./ScreenRenderer-xH01YkEQ.cjs");
4
4
  require("./account-api-context-DZP9IiGg.cjs");
5
5
  require("./store-api-context-D1gZn22Z.cjs");
6
- require("./pay-api-context-_o5ZEXYt.cjs");
6
+ require("./api-context-BkBvyFVK.cjs");
7
7
  require("./mysite-api-context-Dz4lI5Xd.cjs");
8
8
  require("./countries-api-context-C0C0K9gJ.cjs");
9
9
  require("./src-DiFCBegK.cjs");
@@ -42,9 +42,9 @@ require("./TableWidget-BIn1oRiJ.cjs");
42
42
  require("./ToDoWidget-OxT9z59F.cjs");
43
43
  require("./VideoWidget-CDcV0J5W.cjs");
44
44
  require("./ScreenHeaderContext-oIu5Bvhs.cjs");
45
- require("./fluid-pay-api-adapter-D63KLi5c.cjs");
45
+ require("./AddressAutocompleteInput-CbpNjpwB.cjs");
46
46
  require("./dist-DJAHGHHi.cjs");
47
47
  require("./components-BKADyCYp.cjs");
48
- const require_ProfileScreen = require("./ProfileScreen-BDLJgcXg.cjs");
48
+ const require_ProfileScreen = require("./ProfileScreen-DucZeLWI.cjs");
49
49
  exports.ProfileScreen = require_ProfileScreen.ProfileScreen;
50
50
  exports.profileScreenPropertySchema = require_ProfileScreen.profileScreenPropertySchema;
@@ -1,13 +1,13 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- const require_FluidProvider = require("./FluidProvider-DprqXNu4.cjs");
2
+ const require_FluidProvider = require("./FluidProvider-DGxCCmVB.cjs");
3
3
  const require_account_api_context = require("./account-api-context-DZP9IiGg.cjs");
4
- const require_pay_api_context = require("./pay-api-context-_o5ZEXYt.cjs");
4
+ const require_api_context = require("./api-context-BkBvyFVK.cjs");
5
5
  const require_countries_api_context = require("./countries-api-context-C0C0K9gJ.cjs");
6
6
  const require_src = require("./src-uhf6Szlw.cjs");
7
7
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-oIu5Bvhs.cjs");
8
8
  const require_query_keys = require("./query-keys-e9EEoWxN.cjs");
9
9
  const require_use_account = require("./use-account-D6Z9hkDX.cjs");
10
- const require_fluid_pay_api_adapter = require("./fluid-pay-api-adapter-D63KLi5c.cjs");
10
+ const require_AddressAutocompleteInput = require("./AddressAutocompleteInput-CbpNjpwB.cjs");
11
11
  const require_dist = require("./dist-DJAHGHHi.cjs");
12
12
  const require_components = require("./components-BKADyCYp.cjs");
13
13
  let react = require("react");
@@ -140,19 +140,19 @@ function mapToFluidPayAddress(raw) {
140
140
  function mapAccountToMySiteFormValues(account) {
141
141
  const social = account?.social_links ?? {};
142
142
  const result = { bio: account?.bio ?? "" };
143
- for (const { name } of require_fluid_pay_api_adapter.socialFields) result[name] = social[name] ?? "";
143
+ for (const { name } of require_AddressAutocompleteInput.socialFields) result[name] = social[name] ?? "";
144
144
  return result;
145
145
  }
146
146
  function mapFormToSocialLinks(data) {
147
147
  const result = {};
148
- for (const { name } of require_fluid_pay_api_adapter.socialFields) result[name] = data[name] ?? "";
148
+ for (const { name } of require_AddressAutocompleteInput.socialFields) result[name] = data[name] ?? "";
149
149
  return result;
150
150
  }
151
151
  function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
152
- const payApi = require_pay_api_context.usePayApi();
152
+ const payApi = require_api_context.usePayApi();
153
153
  const accountApi = require_account_api_context.useAccountApi();
154
154
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
155
- const fluidPayShim = (0, react.useMemo)(() => require_fluid_pay_api_adapter.createFluidPayApiAdapter(payApi), [payApi]);
155
+ const fluidPayShim = (0, react.useMemo)(() => require_AddressAutocompleteInput.createFluidPayApiAdapter(payApi), [payApi]);
156
156
  const { data: mySiteProfile } = require_dist.usePortalMySiteProfile();
157
157
  const updateMySiteSettingsMutation = require_dist.usePortalUpdateSettings();
158
158
  const mySiteUrl = mySiteProfile?.mysite_url ?? "";
@@ -161,7 +161,7 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
161
161
  await updateMySiteSettingsMutation.mutateAsync({ slug });
162
162
  }, [updateMySiteSettingsMutation]);
163
163
  const { data: accountRep, isLoading: isLoadingAccount, isError: isAccountError } = require_use_account.useAccount();
164
- const { control: mySiteControl, handleSubmit: handleMySiteSubmit, formState: { isDirty: isMySiteDirty } } = require_src.useZodForm(require_fluid_pay_api_adapter.mySiteProfileSchema, { values: (0, react.useMemo)(() => mapAccountToMySiteFormValues(accountRep), [accountRep]) });
164
+ const { control: mySiteControl, handleSubmit: handleMySiteSubmit, formState: { isDirty: isMySiteDirty } } = require_src.useZodForm(require_AddressAutocompleteInput.mySiteProfileSchema, { values: (0, react.useMemo)(() => mapAccountToMySiteFormValues(accountRep), [accountRep]) });
165
165
  const updateMySiteProfileMutation = (0, _tanstack_react_query.useMutation)({
166
166
  mutationFn: (data) => accountApi.updateAccount({ account: {
167
167
  bio: data.bio,
@@ -189,7 +189,7 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
189
189
  const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } = (0, _tanstack_react_query.useQuery)({
190
190
  queryKey: require_query_keys.payKeys.paymentMethods.list(),
191
191
  queryFn: async () => {
192
- return (await payApi.fetchPaymentMethods()).payment_methods.map(require_fluid_pay_api_adapter.mapToFluidPayPaymentMethod);
192
+ return (await payApi.fetchPaymentMethods()).payment_methods.map(require_AddressAutocompleteInput.mapToFluidPayPaymentMethod);
193
193
  },
194
194
  enabled: true
195
195
  });
@@ -408,11 +408,11 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
408
408
  });
409
409
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
410
410
  className: "px-4 pt-4 sm:px-9 md:pt-8",
411
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.FluidPayCoreProvider, {
411
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.FluidPayCoreProvider, {
412
412
  api: fluidPayShim,
413
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.ProfileUIProvider, {
413
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.ProfileUIProvider, {
414
414
  t,
415
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.Profile, {
415
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.Profile, {
416
416
  customerAccount: accountData,
417
417
  languages: adaptedLanguages,
418
418
  onUpdateCustomer: async (data) => {
@@ -449,7 +449,7 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
449
449
  isUpdatingPaymentMethod: updatePaymentMethodMutation.isPending,
450
450
  getBillingAddress: (paymentMethod) => paymentMethod.billing_address ?? null,
451
451
  countries: countryOptions,
452
- renderAddressDialog: ({ isOpen, onClose, selectedAddress }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.AddressFormDialog, {
452
+ renderAddressDialog: ({ isOpen, onClose, selectedAddress }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.AddressFormDialog, {
453
453
  isOpen,
454
454
  onClose,
455
455
  selectedAddress,
@@ -464,9 +464,19 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
464
464
  },
465
465
  isSubmitting: createAddressMutation.isPending || updateAddressMutation.isPending,
466
466
  countries: countryOptions,
467
- fetchStates: fetchStatesFromCountries
467
+ fetchStates: fetchStatesFromCountries,
468
+ renderAddressAutocomplete: ({ control, setValue, countryCode }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.AddressAutocompleteInput, {
469
+ control,
470
+ setValue,
471
+ countryIso: countryCode,
472
+ addressLineField: "address1",
473
+ cityField: "city",
474
+ stateField: "state",
475
+ postalCodeField: "postal_code",
476
+ placeholder: t("address_line_1")
477
+ })
468
478
  }),
469
- renderCreditCardDialog: ({ isOpen, onClose }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.CreditCardFormDialog, {
479
+ renderCreditCardDialog: ({ isOpen, onClose }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.CreditCardFormDialog, {
470
480
  isOpen,
471
481
  onClose,
472
482
  t,
@@ -478,7 +488,17 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
478
488
  },
479
489
  isSubmitting: addCreditCardMutation.isPending,
480
490
  countries: countryOptions,
481
- jwt: ""
491
+ jwt: "",
492
+ renderAddressAutocomplete: ({ control, setValue, countryCode }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.AddressAutocompleteInput, {
493
+ control,
494
+ setValue,
495
+ countryIso: countryCode,
496
+ addressLineField: "address1",
497
+ cityField: "city",
498
+ stateField: "state",
499
+ postalCodeField: "zip",
500
+ placeholder: t("address_line_1")
501
+ })
482
502
  }),
483
503
  footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
484
504
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.MySiteLinkCard, {
@@ -487,14 +507,14 @@ function ProfileContentScreen({ onToast, countryIso: _countryIso }) {
487
507
  onUpdateSlug: handleUpdateSlug,
488
508
  onToast
489
509
  }),
490
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.MySiteProfileSocialSection, { control: mySiteControl }),
491
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.MySiteProfileSaveButton, {
510
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.MySiteProfileSocialSection, { control: mySiteControl }),
511
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.MySiteProfileSaveButton, {
492
512
  isDirty: isMySiteDirty,
493
513
  isPending: updateMySiteProfileMutation.isPending,
494
514
  onSubmit: handleMySiteProfileSubmit
495
515
  })
496
516
  ] }),
497
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_fluid_pay_api_adapter.MySiteProfileSection, {
517
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AddressAutocompleteInput.MySiteProfileSection, {
498
518
  avatarUrl: accountRep?.avatar_url,
499
519
  initial: accountRep?.first_name?.[0]?.toUpperCase() ?? "U",
500
520
  control: mySiteControl
@@ -554,4 +574,4 @@ Object.defineProperty(exports, "profileScreenPropertySchema", {
554
574
  }
555
575
  });
556
576
 
557
- //# sourceMappingURL=ProfileScreen-BDLJgcXg.cjs.map
577
+ //# sourceMappingURL=ProfileScreen-DucZeLWI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileScreen-DucZeLWI.cjs","names":["socialFields","usePayApi","useAccountApi","createFluidPayApiAdapter","usePortalMySiteProfile","usePortalUpdateSettings","useAccount","useZodForm","mySiteProfileSchema","accountKeys","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","useLanguagesApi","storeKeys","FluidPayCoreProvider","ProfileUIProvider","Profile","AddressFormDialog","AddressAutocompleteInput","CreditCardFormDialog","MySiteLinkCard","MySiteProfileSocialSection","MySiteProfileSaveButton","MySiteProfileSection","useFluidContext","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage"],"sources":["../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useZodForm } from \"@fluid-app/ui-primitives\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n Profile,\n AddressFormDialog,\n CreditCardFormDialog,\n MySiteProfileSection,\n MySiteProfileSocialSection,\n MySiteProfileSaveButton,\n mySiteProfileSchema,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type { MySiteProfileFormData } from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport type {\n PayAddress,\n UpdatePaymentMethodBody,\n} from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { MySiteLinkCard } from \"@fluid-app/mysite-ui/portal/components\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n points_history: \"Points History\",\n points_available: \"Points Available\",\n points_awarded: \"Points Awarded\",\n points_redeemed: \"Points Redeemed\",\n transaction: \"Transaction\",\n no_points_history_found: \"No points history found\",\n shipping_addresses: \"Shipping Addresses\",\n add_an_address: \"Add an Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n payment_methods: \"Payment Methods\",\n add_payment_method: \"Add Payment Method\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction adaptPointsLedger(\n entry: import(\"@fluid-app/portal-core/pay-types\").PointsLedgerEntry,\n): PointsLedger {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nfunction mapAccountToMySiteFormValues(\n account: AccountRep | undefined,\n): MySiteProfileFormData {\n const social = account?.social_links ?? {};\n const result = { bio: account?.bio ?? \"\" } as MySiteProfileFormData;\n for (const { name } of socialFields) {\n result[name] = social[name] ?? \"\";\n }\n return result;\n}\n\nfunction mapFormToSocialLinks(\n data: MySiteProfileFormData,\n): Record<SocialFieldKey, string> {\n const result = {} as Record<SocialFieldKey, string>;\n for (const { name } of socialFields) {\n result[name] = data[name] ?? \"\";\n }\n return result;\n}\n\nexport function ProfileContentScreen({\n onToast,\n countryIso: _countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n\n const handleUpdateSlug = useCallback(\n async (slug: string) => {\n await updateMySiteSettingsMutation.mutateAsync({ slug });\n },\n [updateMySiteSettingsMutation],\n );\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const mySiteFormValues = useMemo(\n () => mapAccountToMySiteFormValues(accountRep),\n [accountRep],\n );\n\n const {\n control: mySiteControl,\n handleSubmit: handleMySiteSubmit,\n formState: { isDirty: isMySiteDirty },\n } = useZodForm<MySiteProfileFormData>(mySiteProfileSchema, {\n values: mySiteFormValues,\n });\n\n const updateMySiteProfileMutation = useMutation({\n mutationFn: (data: MySiteProfileFormData) =>\n accountApi.updateAccount({\n account: {\n bio: data.bio,\n social_links: mapFormToSocialLinks(data),\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated successfully\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const handleMySiteProfileSubmit = handleMySiteSubmit((data) => {\n updateMySiteProfileMutation.mutate(data);\n });\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesAdapter.listCountries(),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const {\n data: pointsLedgerData,\n isLoading: isLoadingPointsLedger,\n isError: isPointsLedgerError,\n } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n // BFF returns 403 when reward points are not enabled for the company.\n // Don't retry on 403 so the UI simply hides the points section.\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n // Points are enabled if the fetch succeeded (non-403)\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n },\n onError: () => {\n onToast(\"Failed to delete address\", \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to delete payment method\", \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to update payment method\", \"error\");\n },\n });\n\n const makeDefaultPaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) => {\n const pm = (paymentMethodsData ?? []).find(\n (p) => p.id === paymentMethodId,\n );\n if (!pm) throw new Error(\"Payment method not found\");\n const body: UpdatePaymentMethodBody = {\n payment_method: { default: true },\n };\n if (pm.billing_address) {\n body.payment_method.billing_address = {\n name: pm.billing_address.name,\n street1: pm.billing_address.address1 ?? \"\",\n street2: pm.billing_address.address2 ?? null,\n city: pm.billing_address.city ?? \"\",\n state: pm.billing_address.state ?? \"\",\n zip: pm.billing_address.zip ?? \"\",\n country: pm.billing_address.country_code ?? \"\",\n };\n }\n return payApi.updatePaymentMethod(paymentMethodId, body);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.paymentMethods.all });\n onToast(\"Default payment method updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update default payment method\", \"error\");\n },\n });\n\n const makeDefaultAddressMutation = useMutation({\n mutationFn: (addressId: number) => {\n const addr = addresses.find((a) => a.id === addressId);\n if (!addr) throw new Error(\"Address not found\");\n return payApi.updateAddress(addressId, {\n address: {\n name: addr.name ?? null,\n street1: addr.address1,\n street2: addr.address2,\n city: addr.city,\n state: addr.state,\n zip: addr.postal_code,\n country: addr.country_code ?? \"\",\n default: true,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Default address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update default address\", \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileUIProvider t={t}>\n <Profile\n customerAccount={accountData}\n languages={adaptedLanguages}\n onUpdateCustomer={async (data) => {\n await updateCustomerMutation.mutateAsync(data);\n }}\n isUpdatingCustomer={updateCustomerMutation.isPending}\n // TODO: wire onChangeEmail to PATCH /v202506/users/:id/change_email\n // once portal self-service email change is designed\n // onChangeEmail={...}\n // pendingEmail={pendingEmail}\n rewardsPointsEnabled={rewardPointsEnabled}\n pointsLedger={adaptedPointsLedger}\n isLoadingPointsLedger={isLoadingPointsLedger}\n addresses={addresses}\n isLoadingAddresses={isLoadingAddresses}\n onDeleteAddress={async (addressId) => {\n await deleteAddressMutation.mutateAsync(addressId);\n }}\n isDeletingAddress={deleteAddressMutation.isPending}\n onMakeDefaultAddress={async (addressId) => {\n await makeDefaultAddressMutation.mutateAsync(addressId);\n }}\n paymentMethods={paymentMethods}\n isLoadingPaymentMethods={isLoadingPaymentMethods}\n onDeletePaymentMethod={async (paymentMethodId) => {\n await deletePaymentMethodMutation.mutateAsync(paymentMethodId);\n }}\n isDeletingPaymentMethod={deletePaymentMethodMutation.isPending}\n onMakeDefaultPaymentMethod={async (paymentMethodId) => {\n await makeDefaultPaymentMethodMutation.mutateAsync(\n paymentMethodId,\n );\n }}\n onUpdatePaymentMethod={async (paymentMethodId, data) => {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId,\n data,\n });\n }}\n isUpdatingPaymentMethod={updatePaymentMethodMutation.isPending}\n getBillingAddress={(paymentMethod) =>\n paymentMethod.billing_address ?? null\n }\n countries={countryOptions}\n renderAddressDialog={({ isOpen, onClose, selectedAddress }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={selectedAddress}\n t={t}\n onSubmit={async (formData) => {\n if (selectedAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: selectedAddress.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n onClose();\n }}\n isSubmitting={\n createAddressMutation.isPending ||\n updateAddressMutation.isPending\n }\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({\n control,\n setValue,\n countryCode,\n }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n )}\n renderCreditCardDialog={({ isOpen, onClose }) => (\n <CreditCardFormDialog\n isOpen={isOpen}\n onClose={onClose}\n t={t}\n onSubmit={async (data) => {\n try {\n await addCreditCardMutation.mutateAsync(data);\n onClose();\n } catch {\n // onError surfaces the toast; swallow here so the dialog\n // doesn't see an unhandled rejection.\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt=\"\"\n renderAddressAutocomplete={({\n control,\n setValue,\n countryCode,\n }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"zip\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n )}\n footer={\n <>\n <MySiteLinkCard\n mysiteUrl={mySiteUrl}\n displayUrl={mySiteDisplayUrl}\n onUpdateSlug={handleUpdateSlug}\n onToast={onToast}\n />\n <MySiteProfileSocialSection control={mySiteControl} />\n <MySiteProfileSaveButton\n isDirty={isMySiteDirty}\n isPending={updateMySiteProfileMutation.isPending}\n onSubmit={handleMySiteProfileSubmit}\n />\n </>\n }\n >\n <MySiteProfileSection\n avatarUrl={accountRep?.avatar_url}\n initial={accountRep?.first_name?.[0]?.toUpperCase() ?? \"U\"}\n control={mySiteControl}\n />\n </Profile>\n </ProfileUIProvider>\n </FluidPayCoreProvider>\n </div>\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Profile</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={effectiveToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}