@fluid-app/portal-sdk 0.1.350 → 0.1.352
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.
- package/dist/{AddressAutocompleteInput-JBXGT1iL.cjs → AddressAutocompleteInput-BQz2jaUO.cjs} +134 -79
- package/dist/AddressAutocompleteInput-BQz2jaUO.cjs.map +1 -0
- package/dist/{AddressAutocompleteInput-BANMgwzR.mjs → AddressAutocompleteInput-Dds2GjGt.mjs} +134 -79
- package/dist/AddressAutocompleteInput-Dds2GjGt.mjs.map +1 -0
- package/dist/{AlertWidget-BmOGoxTA.mjs → AlertWidget-DMwOt9u8.mjs} +3 -3
- package/dist/{AlertWidget-BmOGoxTA.mjs.map → AlertWidget-DMwOt9u8.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-C78ggXk3.mjs → AppDownloadScreen-CBg2shvo.mjs} +5 -5
- package/dist/{AppDownloadScreen-C78ggXk3.mjs.map → AppDownloadScreen-CBg2shvo.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-DIcwvAZ4.cjs → AppDownloadScreen-CMR1y4kP.cjs} +4 -4
- package/dist/{AppDownloadScreen-DIcwvAZ4.cjs.map → AppDownloadScreen-CMR1y4kP.cjs.map} +1 -1
- package/dist/{AppNavigationContext-BCj6iFxr.mjs → AppNavigationContext-B-wToUBG.mjs} +3 -3
- package/dist/AppNavigationContext-B-wToUBG.mjs.map +1 -0
- package/dist/{AppNavigationContext-CoNtdUrr.cjs → AppNavigationContext-CLOwdlpx.cjs} +2 -2
- package/dist/AppNavigationContext-CLOwdlpx.cjs.map +1 -0
- package/dist/{BulletListWidget-AIIf29RP.mjs → BulletListWidget-D--Mmasw.mjs} +2 -2
- package/dist/{BulletListWidget-AIIf29RP.mjs.map → BulletListWidget-D--Mmasw.mjs.map} +1 -1
- package/dist/{CalendarWidget-DW5wz5ke.cjs → CalendarWidget-Aa7H9M7f.cjs} +4 -4
- package/dist/{CalendarWidget-DW5wz5ke.cjs.map → CalendarWidget-Aa7H9M7f.cjs.map} +1 -1
- package/dist/{CalendarWidget-Dn55musX.mjs → CalendarWidget-Cx6KvkaG.mjs} +5 -5
- package/dist/{CalendarWidget-Dn55musX.mjs.map → CalendarWidget-Cx6KvkaG.mjs.map} +1 -1
- package/dist/{CardWidget-DsfLoyup.cjs → CardWidget-Caytu8qs.cjs} +3 -3
- package/dist/{CardWidget--S5FBquC.cjs → CardWidget-CqewqU5a.cjs} +2 -2
- package/dist/{CardWidget--S5FBquC.cjs.map → CardWidget-CqewqU5a.cjs.map} +1 -1
- package/dist/{CardWidget-ChfurL_z.mjs → CardWidget-DARqLSwy.mjs} +3 -3
- package/dist/{CardWidget-ChfurL_z.mjs.map → CardWidget-DARqLSwy.mjs.map} +1 -1
- package/dist/{CarouselWidget-SrCl4cSn.mjs → CarouselWidget-Bnl_iggA.mjs} +2 -2
- package/dist/{CarouselWidget-SrCl4cSn.mjs.map → CarouselWidget-Bnl_iggA.mjs.map} +1 -1
- package/dist/{CatchUpWidget-B_in7Bjq.mjs → CatchUpWidget-Bplozt8D.mjs} +5 -5
- package/dist/{CatchUpWidget-B_in7Bjq.mjs.map → CatchUpWidget-Bplozt8D.mjs.map} +1 -1
- package/dist/{CatchUpWidget-_ErrC-e8.cjs → CatchUpWidget-DEyXTEFj.cjs} +4 -4
- package/dist/{CatchUpWidget-_ErrC-e8.cjs.map → CatchUpWidget-DEyXTEFj.cjs.map} +1 -1
- package/dist/{ChartWidget-CIr3v8x6.mjs → ChartWidget-BPOZNKI_.mjs} +2 -2
- package/dist/{ChartWidget-CIr3v8x6.mjs.map → ChartWidget-BPOZNKI_.mjs.map} +1 -1
- package/dist/{ContactsScreen-f3dXV198.cjs → ContactsScreen-BFbWTMu9.cjs} +4 -4
- package/dist/{ContactsScreen-f3dXV198.cjs.map → ContactsScreen-BFbWTMu9.cjs.map} +1 -1
- package/dist/{ContactsScreen-DJ8O35Pl.mjs → ContactsScreen-CnLSICv5.mjs} +5 -5
- package/dist/{ContactsScreen-DJ8O35Pl.mjs.map → ContactsScreen-CnLSICv5.mjs.map} +1 -1
- package/dist/{ContactsScreen-CVmYvRZi.cjs → ContactsScreen-DQjdfcAV.cjs} +5 -5
- package/dist/{ContainerWidget-BHWPtBmF.mjs → ContainerWidget-Bv0f8-TC.mjs} +3 -3
- package/dist/{ContainerWidget-BHWPtBmF.mjs.map → ContainerWidget-Bv0f8-TC.mjs.map} +1 -1
- package/dist/{ContainerWidget-Cf_D4TAi.cjs → ContainerWidget-CF6VDxd8.cjs} +2 -2
- package/dist/{ContainerWidget-Cf_D4TAi.cjs.map → ContainerWidget-CF6VDxd8.cjs.map} +1 -1
- package/dist/ContainerWidget-D3JoA0IP.cjs +8 -0
- package/dist/{CustomersScreen-DGBwaZrt.mjs → CustomersScreen-BHqlHdHZ.mjs} +3 -3
- package/dist/{CustomersScreen-DGBwaZrt.mjs.map → CustomersScreen-BHqlHdHZ.mjs.map} +1 -1
- package/dist/{CustomersScreen-BXvWK7Y1.cjs → CustomersScreen-C8b3P79M.cjs} +2 -2
- package/dist/{CustomersScreen-BXvWK7Y1.cjs.map → CustomersScreen-C8b3P79M.cjs.map} +1 -1
- package/dist/{EmbedWidget-D5kFw9HS.mjs → EmbedWidget-DRfjHvRs.mjs} +2 -2
- package/dist/{EmbedWidget-D5kFw9HS.mjs.map → EmbedWidget-DRfjHvRs.mjs.map} +1 -1
- package/dist/{FluidProvider-BVJmIM13.cjs → FluidProvider-CMfpLju8.cjs} +73 -47
- package/dist/FluidProvider-CMfpLju8.cjs.map +1 -0
- package/dist/{FluidProvider-CYBXFElI.mjs → FluidProvider-tPt9UpYz.mjs} +101 -81
- package/dist/FluidProvider-tPt9UpYz.mjs.map +1 -0
- package/dist/{ImageWidget-B3ZTuy4v.mjs → ImageWidget-C7nfRJ6p.mjs} +2 -2
- package/dist/{ImageWidget-B3ZTuy4v.mjs.map → ImageWidget-C7nfRJ6p.mjs.map} +1 -1
- package/dist/{LayoutWidget-3G-w-YLz.cjs → LayoutWidget-6_Huueb4.cjs} +3 -3
- package/dist/{LayoutWidget-CrZG6Ipw.mjs → LayoutWidget-CSFWeXYY.mjs} +3 -3
- package/dist/{LayoutWidget-CrZG6Ipw.mjs.map → LayoutWidget-CSFWeXYY.mjs.map} +1 -1
- package/dist/{LayoutWidget-CG-dWz_c.cjs → LayoutWidget-DD1ZqWXg.cjs} +2 -2
- package/dist/{LayoutWidget-CG-dWz_c.cjs.map → LayoutWidget-DD1ZqWXg.cjs.map} +1 -1
- package/dist/{LinkWidget-fPowKN73.mjs → LinkWidget-DI2Uod5O.mjs} +2 -2
- package/dist/{LinkWidget-fPowKN73.mjs.map → LinkWidget-DI2Uod5O.mjs.map} +1 -1
- package/dist/{ListWidget-CQuNRg_g.mjs → ListWidget-BdUhs2fo.mjs} +2 -2
- package/dist/{ListWidget-CQuNRg_g.mjs.map → ListWidget-BdUhs2fo.mjs.map} +1 -1
- package/dist/{MessagingScreen-3o_Qb6u_.mjs → MessagingScreen-8hyxHThw.mjs} +10 -10
- package/dist/MessagingScreen-8hyxHThw.mjs.map +1 -0
- package/dist/{MessagingScreen-Db6wQydU.cjs → MessagingScreen-CaSUJhJc.cjs} +25 -25
- package/dist/MessagingScreen-CpMlE96f.mjs +50 -0
- package/dist/{MessagingScreen-C4SUSPy3.cjs → MessagingScreen-CvyQL50O.cjs} +8 -8
- package/dist/MessagingScreen-CvyQL50O.cjs.map +1 -0
- package/dist/{MySiteScreen-D3rkI2UJ.cjs → MySiteScreen-BZnLxHAq.cjs} +6 -6
- package/dist/{MySiteScreen-D3rkI2UJ.cjs.map → MySiteScreen-BZnLxHAq.cjs.map} +1 -1
- package/dist/MySiteScreen-CYGVxzCE.cjs +11 -0
- package/dist/{MySiteScreen-BC_K8gIq.mjs → MySiteScreen-tKgO4G0B.mjs} +7 -7
- package/dist/{MySiteScreen-BC_K8gIq.mjs.map → MySiteScreen-tKgO4G0B.mjs.map} +1 -1
- package/dist/{MySiteWidget-D6QyWuzN.cjs → MySiteWidget-CabBtq5C.cjs} +4 -4
- package/dist/{MySiteWidget-D6QyWuzN.cjs.map → MySiteWidget-CabBtq5C.cjs.map} +1 -1
- package/dist/{MySiteWidget-BLALS8Ve.mjs → MySiteWidget-ivytLi6H.mjs} +5 -5
- package/dist/{MySiteWidget-BLALS8Ve.mjs.map → MySiteWidget-ivytLi6H.mjs.map} +1 -1
- package/dist/{NestedWidget-DuNuNaeT.mjs → NestedWidget-gqdWZS9Q.mjs} +2 -2
- package/dist/{NestedWidget-DuNuNaeT.mjs.map → NestedWidget-gqdWZS9Q.mjs.map} +1 -1
- package/dist/OrdersScreen-BGVPWrEg.cjs +50 -0
- package/dist/OrdersScreen-BZ2iBfWQ.mjs +48 -0
- package/dist/{OrdersScreen-CJzegrYb.cjs → OrdersScreen-Ckt7uChL.cjs} +11 -11
- package/dist/OrdersScreen-Ckt7uChL.cjs.map +1 -0
- package/dist/{OrdersScreen-FaoTq71a.mjs → OrdersScreen-DsKspc_8.mjs} +12 -12
- package/dist/OrdersScreen-DsKspc_8.mjs.map +1 -0
- package/dist/{PointsWidget-BvGANrJq.mjs → PointsWidget-BJlOIK6o.mjs} +5 -5
- package/dist/{PointsWidget-BvGANrJq.mjs.map → PointsWidget-BJlOIK6o.mjs.map} +1 -1
- package/dist/{PointsWidget-Byd2-eEi.cjs → PointsWidget-Him7U2k2.cjs} +4 -4
- package/dist/{PointsWidget-Byd2-eEi.cjs.map → PointsWidget-Him7U2k2.cjs.map} +1 -1
- package/dist/{PortalTenantClientProvider-Bpm-CZq1.cjs → PortalTenantClientProvider-C0eJp8MN.cjs} +3 -3
- package/dist/PortalTenantClientProvider-C0eJp8MN.cjs.map +1 -0
- package/dist/{PortalTenantClientProvider-BmRtQAbi.mjs → PortalTenantClientProvider-DVClpfbi.mjs} +4 -4
- package/dist/PortalTenantClientProvider-DVClpfbi.mjs.map +1 -0
- package/dist/{ProfileScreen-DxjLSL0A.cjs → ProfileScreen-21MnRuNH.cjs} +12 -8
- package/dist/ProfileScreen-21MnRuNH.cjs.map +1 -0
- package/dist/{ProfileScreen-CU4Y3sBq.mjs → ProfileScreen-DA3vl5EU.mjs} +12 -8
- package/dist/ProfileScreen-DA3vl5EU.mjs.map +1 -0
- package/dist/ProfileScreen-DzxUqJJD.cjs +53 -0
- package/dist/ProfileScreen-Uw_6u6Ew.mjs +51 -0
- package/dist/{QuickLinksWidget-D8LqZkUS.mjs → QuickLinksWidget-DJUI7r5_.mjs} +2 -2
- package/dist/{QuickLinksWidget-D8LqZkUS.mjs.map → QuickLinksWidget-DJUI7r5_.mjs.map} +1 -1
- package/dist/{QuickShareWidget-BJpqzZp0.mjs → QuickShareWidget-B7DhQOyt.mjs} +2 -2
- package/dist/{QuickShareWidget-BJpqzZp0.mjs.map → QuickShareWidget-B7DhQOyt.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-ClgOlTXl.mjs → RecentActivityWidget-BMGeLSUa.mjs} +5 -5
- package/dist/{RecentActivityWidget-ClgOlTXl.mjs.map → RecentActivityWidget-BMGeLSUa.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-BYzAzBI-.cjs → RecentActivityWidget-DvrmBGsD.cjs} +4 -4
- package/dist/{RecentActivityWidget-BYzAzBI-.cjs.map → RecentActivityWidget-DvrmBGsD.cjs.map} +1 -1
- package/dist/{ScreenHeaderContext-BiGgRqjY.cjs → ScreenHeaderContext-VOp8pVHr.cjs} +4 -4
- package/dist/ScreenHeaderContext-VOp8pVHr.cjs.map +1 -0
- package/dist/{ScreenHeaderContext-BjpQOCck.mjs → ScreenHeaderContext-cuVMk00X.mjs} +5 -5
- package/dist/ScreenHeaderContext-cuVMk00X.mjs.map +1 -0
- package/dist/{ScreenRenderer-TobkTBMC.mjs → ScreenRenderer-D3zNFSr3.mjs} +4 -4
- package/dist/ScreenRenderer-D3zNFSr3.mjs.map +1 -0
- package/dist/{ScreenRenderer-CLDJUinO.cjs → ScreenRenderer-IMkMMnUJ.cjs} +3 -3
- package/dist/ScreenRenderer-IMkMMnUJ.cjs.map +1 -0
- package/dist/{SearchSort-B5hq2j-l.cjs → SearchSort-BjjBpuEi.cjs} +2 -2
- package/dist/SearchSort-BjjBpuEi.cjs.map +1 -0
- package/dist/{SearchSort-CMUL0qt3.mjs → SearchSort-C6RV6d9g.mjs} +3 -3
- package/dist/SearchSort-C6RV6d9g.mjs.map +1 -0
- package/dist/{SeparatorWidget-CDvDjL-k.mjs → SeparatorWidget-CGFzy35l.mjs} +2 -2
- package/dist/{SeparatorWidget-CDvDjL-k.mjs.map → SeparatorWidget-CGFzy35l.mjs.map} +1 -1
- package/dist/{ShareablesScreen-COg_WpdP.cjs → ShareablesScreen-B0vxU7i6.cjs} +20 -20
- package/dist/ShareablesScreen-B0vxU7i6.cjs.map +1 -0
- package/dist/{ShareablesScreen-C9EmRZJW.mjs → ShareablesScreen-CefIC5H8.mjs} +22 -22
- package/dist/ShareablesScreen-CefIC5H8.mjs.map +1 -0
- package/dist/ShareablesScreen-Cs8iC1qk.mjs +15 -0
- package/dist/ShareablesScreen-igzq70Xz.cjs +17 -0
- package/dist/{ShopScreen-DTL5xiPY.mjs → ShopScreen-CbeH9wRR.mjs} +10 -10
- package/dist/ShopScreen-CbeH9wRR.mjs.map +1 -0
- package/dist/{ShopScreen-Bgx6548O.cjs → ShopScreen-Cme3j61f.cjs} +10 -10
- package/dist/ShopScreen-Cme3j61f.cjs.map +1 -0
- package/dist/ShopScreen-D2LDk2xr.mjs +48 -0
- package/dist/ShopScreen-D6xtA_0b.cjs +50 -0
- package/dist/{ShopWidget-Cmx4Pb6Q.cjs → ShopWidget-BWURiWyx.cjs} +4 -4
- package/dist/{ShopWidget-Cmx4Pb6Q.cjs.map → ShopWidget-BWURiWyx.cjs.map} +1 -1
- package/dist/{ShopWidget-C76SSZwW.cjs → ShopWidget-C4jeRRut.cjs} +4 -4
- package/dist/{ShopWidget-BzAuvfyC.mjs → ShopWidget-Cqnwq0AG.mjs} +5 -5
- package/dist/{ShopWidget-BzAuvfyC.mjs.map → ShopWidget-Cqnwq0AG.mjs.map} +1 -1
- package/dist/{SpacerWidget-B0l19UqF.mjs → SpacerWidget-BhxIaqYF.mjs} +2 -2
- package/dist/{SpacerWidget-B0l19UqF.mjs.map → SpacerWidget-BhxIaqYF.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-qKJoibtI.mjs → SubscriptionsScreen-Br_gugTG.mjs} +32 -27
- package/dist/SubscriptionsScreen-Br_gugTG.mjs.map +1 -0
- package/dist/SubscriptionsScreen-CG3OldGE.mjs +50 -0
- package/dist/{SubscriptionsScreen-DGE3efWd.cjs → SubscriptionsScreen-CvM68asd.cjs} +26 -26
- package/dist/{SubscriptionsScreen-D8bjSX3s.cjs → SubscriptionsScreen-HbrDZhaX.cjs} +31 -26
- package/dist/SubscriptionsScreen-HbrDZhaX.cjs.map +1 -0
- package/dist/{TableWidget-CpHI9CGQ.mjs → TableWidget-Dwud4Fif.mjs} +2 -2
- package/dist/{TableWidget-CpHI9CGQ.mjs.map → TableWidget-Dwud4Fif.mjs.map} +1 -1
- package/dist/{TextWidget-Jy-Ktqje.mjs → TextWidget-B5ZtQMX-.mjs} +2 -2
- package/dist/{TextWidget-Jy-Ktqje.mjs.map → TextWidget-B5ZtQMX-.mjs.map} +1 -1
- package/dist/ToDoWidget-BJ2Ip97m.cjs +11 -0
- package/dist/{ToDoWidget-BaWksZpJ.mjs → ToDoWidget-Bnml3xLS.mjs} +6 -6
- package/dist/{ToDoWidget-BaWksZpJ.mjs.map → ToDoWidget-Bnml3xLS.mjs.map} +1 -1
- package/dist/{ToDoWidget-CZh5a5-z.cjs → ToDoWidget-C3Ob2TP2.cjs} +5 -5
- package/dist/{ToDoWidget-CZh5a5-z.cjs.map → ToDoWidget-C3Ob2TP2.cjs.map} +1 -1
- package/dist/{UpgradeScreen-VpfRqKdO.cjs → UpgradeScreen-B40dCeub.cjs} +3 -3
- package/dist/{UpgradeScreen-VpfRqKdO.cjs.map → UpgradeScreen-B40dCeub.cjs.map} +1 -1
- package/dist/{UpgradeScreen-C55rEuCN.cjs → UpgradeScreen-CbdTRnIj.cjs} +3 -3
- package/dist/{UpgradeScreen-x9TdC5aR.mjs → UpgradeScreen-GzkZOOR4.mjs} +4 -4
- package/dist/{UpgradeScreen-x9TdC5aR.mjs.map → UpgradeScreen-GzkZOOR4.mjs.map} +1 -1
- package/dist/{VideoWidget-DP-VHt2s.mjs → VideoWidget-Cm3UQ3-Z.mjs} +2 -2
- package/dist/{VideoWidget-DP-VHt2s.mjs.map → VideoWidget-Cm3UQ3-Z.mjs.map} +1 -1
- package/dist/{countries-api-context-G-NW4BoH.cjs → countries-api-context-16PZpF7O.cjs} +2 -2
- package/dist/countries-api-context-16PZpF7O.cjs.map +1 -0
- package/dist/{countries-api-context-DScC_39w.mjs → countries-api-context-Donus2X5.mjs} +3 -3
- package/dist/countries-api-context-Donus2X5.mjs.map +1 -0
- package/dist/{error-state-DvzIn9Tz.mjs → error-state-BUe589mD.mjs} +3 -3
- package/dist/error-state-BUe589mD.mjs.map +1 -0
- package/dist/{error-state-DJq7C-23.cjs → error-state-CU87JUpz.cjs} +2 -2
- package/dist/error-state-CU87JUpz.cjs.map +1 -0
- package/dist/{es-jA6aVeLD.mjs → es-C19weaa-.mjs} +2 -2
- package/dist/{es-jA6aVeLD.mjs.map → es-C19weaa-.mjs.map} +1 -1
- package/dist/index.cjs +65 -65
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +83 -83
- package/dist/index.mjs.map +1 -1
- package/dist/{mysite-api-context-kUTM3GNG.mjs → mysite-api-context-CoLr9vIf.mjs} +3 -3
- package/dist/mysite-api-context-CoLr9vIf.mjs.map +1 -0
- package/dist/{mysite-api-context-CilZcDS4.cjs → mysite-api-context-DtEXblIV.cjs} +2 -2
- package/dist/mysite-api-context-DtEXblIV.cjs.map +1 -0
- package/dist/{preview-context-D9ZzEfWh.mjs → preview-context-BXEGWx9T.mjs} +3 -3
- package/dist/preview-context-BXEGWx9T.mjs.map +1 -0
- package/dist/{preview-context-BWCl-xyj.cjs → preview-context-DrXkIImI.cjs} +2 -2
- package/dist/preview-context-DrXkIImI.cjs.map +1 -0
- package/dist/{registry-context-BKvTiuXB.mjs → registry-context-CcoVxCii.mjs} +3 -3
- package/dist/{registry-context-BKvTiuXB.mjs.map → registry-context-CcoVxCii.mjs.map} +1 -1
- package/dist/{registry-context-DJ5xiVnt.cjs → registry-context-Q_1Iq2Ea.cjs} +2 -2
- package/dist/{registry-context-DJ5xiVnt.cjs.map → registry-context-Q_1Iq2Ea.cjs.map} +1 -1
- package/dist/{static-dict-adapter-JAau5LHb.cjs → static-dict-adapter-BLq4QzCI.cjs} +2 -2
- package/dist/static-dict-adapter-BLq4QzCI.cjs.map +1 -0
- package/dist/{static-dict-adapter-DjCpubZc.mjs → static-dict-adapter-DRBq3ndO.mjs} +3 -3
- package/dist/static-dict-adapter-DRBq3ndO.mjs.map +1 -0
- package/dist/{store-api-context-DViwxyG4.mjs → store-api-context-B_vtKkXO.mjs} +3 -3
- package/dist/store-api-context-B_vtKkXO.mjs.map +1 -0
- package/dist/{store-api-context-D1gZn22Z.cjs → store-api-context-CGH3YsZB.cjs} +2 -2
- package/dist/store-api-context-CGH3YsZB.cjs.map +1 -0
- package/dist/{task-composer-form-D_Pbl6qk.mjs → task-composer-form-CZgRqbIc.mjs} +4 -4
- package/dist/task-composer-form-CZgRqbIc.mjs.map +1 -0
- package/dist/{task-composer-form-BEZGTBBZ.cjs → task-composer-form-Cz8hpMTT.cjs} +3 -3
- package/dist/task-composer-form-Cz8hpMTT.cjs.map +1 -0
- package/dist/{translation-api-context-factory-BSRK6Z50.cjs → translation-api-context-factory-CjRDqIhF.cjs} +2 -2
- package/dist/translation-api-context-factory-CjRDqIhF.cjs.map +1 -0
- package/dist/{translation-api-context-factory-CJrVq_EB.mjs → translation-api-context-factory-DFr9yJ6Q.mjs} +3 -3
- package/dist/translation-api-context-factory-DFr9yJ6Q.mjs.map +1 -0
- package/dist/{use-account-CQ-mhA3W.cjs → use-account-DltRHEwC.cjs} +2 -2
- package/dist/{use-account-CQ-mhA3W.cjs.map → use-account-DltRHEwC.cjs.map} +1 -1
- package/dist/{use-account-CwGoFpwg.mjs → use-account-Dm6Svko1.mjs} +2 -2
- package/dist/{use-account-CwGoFpwg.mjs.map → use-account-Dm6Svko1.mjs.map} +1 -1
- package/dist/{use-mysite-portal-ChDJ4z34.mjs → use-mysite-portal-3Tn3bFoE.mjs} +2 -2
- package/dist/{use-mysite-portal-ChDJ4z34.mjs.map → use-mysite-portal-3Tn3bFoE.mjs.map} +1 -1
- package/dist/{use-mysite-portal-CH9ZQROw.cjs → use-mysite-portal-D3X51_Ax.cjs} +2 -2
- package/dist/{use-mysite-portal-CH9ZQROw.cjs.map → use-mysite-portal-D3X51_Ax.cjs.map} +1 -1
- package/dist/{use-navigation-parent-DvHbbMB0.mjs → use-navigation-parent-GjQMvU4i.mjs} +2 -2
- package/dist/{use-navigation-parent-DvHbbMB0.mjs.map → use-navigation-parent-GjQMvU4i.mjs.map} +1 -1
- package/dist/{use-navigation-parent-DQ8CiN9L.cjs → use-navigation-parent-q-la1wD2.cjs} +2 -2
- package/dist/{use-navigation-parent-DQ8CiN9L.cjs.map → use-navigation-parent-q-la1wD2.cjs.map} +1 -1
- package/dist/{use-store-cwcCLxl_.mjs → use-store-C6KYHvRw.mjs} +2 -2
- package/dist/{use-store-cwcCLxl_.mjs.map → use-store-C6KYHvRw.mjs.map} +1 -1
- package/dist/{use-store-lOOUcpRT.cjs → use-store-j_6I4DU4.cjs} +2 -2
- package/dist/{use-store-lOOUcpRT.cjs.map → use-store-j_6I4DU4.cjs.map} +1 -1
- package/package.json +19 -18
- package/dist/AddressAutocompleteInput-BANMgwzR.mjs.map +0 -1
- package/dist/AddressAutocompleteInput-JBXGT1iL.cjs.map +0 -1
- package/dist/AppNavigationContext-BCj6iFxr.mjs.map +0 -1
- package/dist/AppNavigationContext-CoNtdUrr.cjs.map +0 -1
- package/dist/ContainerWidget-CyDVJu83.cjs +0 -8
- package/dist/FluidProvider-BVJmIM13.cjs.map +0 -1
- package/dist/FluidProvider-CYBXFElI.mjs.map +0 -1
- package/dist/MessagingScreen-3o_Qb6u_.mjs.map +0 -1
- package/dist/MessagingScreen-C4SUSPy3.cjs.map +0 -1
- package/dist/MessagingScreen-D-wunIkf.mjs +0 -50
- package/dist/MySiteScreen-DiCU6P9d.cjs +0 -11
- package/dist/OrdersScreen-BL5Ta3Tt.cjs +0 -50
- package/dist/OrdersScreen-B_JxQTW8.mjs +0 -48
- package/dist/OrdersScreen-CJzegrYb.cjs.map +0 -1
- package/dist/OrdersScreen-FaoTq71a.mjs.map +0 -1
- package/dist/PortalTenantClientProvider-BmRtQAbi.mjs.map +0 -1
- package/dist/PortalTenantClientProvider-Bpm-CZq1.cjs.map +0 -1
- package/dist/ProfileScreen-CU4Y3sBq.mjs.map +0 -1
- package/dist/ProfileScreen-DMDKlk20.cjs +0 -53
- package/dist/ProfileScreen-Dcjp4wNO.mjs +0 -51
- package/dist/ProfileScreen-DxjLSL0A.cjs.map +0 -1
- package/dist/ScreenHeaderContext-BiGgRqjY.cjs.map +0 -1
- package/dist/ScreenHeaderContext-BjpQOCck.mjs.map +0 -1
- package/dist/ScreenRenderer-CLDJUinO.cjs.map +0 -1
- package/dist/ScreenRenderer-TobkTBMC.mjs.map +0 -1
- package/dist/SearchSort-B5hq2j-l.cjs.map +0 -1
- package/dist/SearchSort-CMUL0qt3.mjs.map +0 -1
- package/dist/ShareablesScreen-BQd1-Og8.mjs +0 -15
- package/dist/ShareablesScreen-C9EmRZJW.mjs.map +0 -1
- package/dist/ShareablesScreen-COg_WpdP.cjs.map +0 -1
- package/dist/ShareablesScreen-CoFM63kh.cjs +0 -17
- package/dist/ShopScreen-Bgx6548O.cjs.map +0 -1
- package/dist/ShopScreen-Bm2RlZas.cjs +0 -50
- package/dist/ShopScreen-Cz7aMt4z.mjs +0 -48
- package/dist/ShopScreen-DTL5xiPY.mjs.map +0 -1
- package/dist/SubscriptionsScreen-CF6AuW3I.mjs +0 -50
- package/dist/SubscriptionsScreen-D8bjSX3s.cjs.map +0 -1
- package/dist/SubscriptionsScreen-qKJoibtI.mjs.map +0 -1
- package/dist/ToDoWidget-1wI1ntdD.cjs +0 -11
- package/dist/countries-api-context-DScC_39w.mjs.map +0 -1
- package/dist/countries-api-context-G-NW4BoH.cjs.map +0 -1
- package/dist/error-state-DJq7C-23.cjs.map +0 -1
- package/dist/error-state-DvzIn9Tz.mjs.map +0 -1
- package/dist/mysite-api-context-CilZcDS4.cjs.map +0 -1
- package/dist/mysite-api-context-kUTM3GNG.mjs.map +0 -1
- package/dist/preview-context-BWCl-xyj.cjs.map +0 -1
- package/dist/preview-context-D9ZzEfWh.mjs.map +0 -1
- package/dist/static-dict-adapter-DjCpubZc.mjs.map +0 -1
- package/dist/static-dict-adapter-JAau5LHb.cjs.map +0 -1
- package/dist/store-api-context-D1gZn22Z.cjs.map +0 -1
- package/dist/store-api-context-DViwxyG4.mjs.map +0 -1
- package/dist/task-composer-form-BEZGTBBZ.cjs.map +0 -1
- package/dist/task-composer-form-D_Pbl6qk.mjs.map +0 -1
- package/dist/translation-api-context-factory-BSRK6Z50.cjs.map +0 -1
- package/dist/translation-api-context-factory-CJrVq_EB.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OrdersScreen-FaoTq71a.mjs","names":["portalTenant.orders_show","portalTenant.orders_list","PortalOrderDetailScreenContent"],"sources":["../../../orders/core/src/orders-api-context.ts","../../../orders/core/src/provider.tsx","../../../orders/core/src/query-keys.ts","../../../orders/core/src/hooks/use-infinite-customer-orders.ts","../../../orders/core/src/hooks/use-portal-tenant-order.ts","../../../orders/core/src/utils/format-order-total.ts","../../../orders/core/src/utils/build-static-map-url.ts","../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/core/src/translation-dictionary.ts","../../../orders/core/src/translation-adapter.ts","../../../orders/core/src/translation-api-context.ts","../src/providers/OrdersTranslationBridge.tsx","../src/screens/orders/portal-orders-list-helpers.ts","../src/screens/orders/PortalOrdersList.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/components/order-status-badge.tsx","../../../orders/ui/src/components/static-map.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\n\nconst OrdersApiContext = createContext<OrdersApi | null>(null);\n\nexport const OrdersApiProvider = OrdersApiContext.Provider;\n\nexport function useOrdersApi(): OrdersApi {\n const api = useContext(OrdersApiContext);\n if (!api) {\n throw new Error(\"useOrdersApi must be used within an OrdersCoreProvider\");\n }\n return api;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\nimport { OrdersApiProvider } from \"./orders-api-context\";\n\nexport interface OrdersCoreProviderProps {\n api: OrdersApi;\n children: ReactNode;\n}\n\nexport function OrdersCoreProvider({\n api,\n children,\n}: OrdersCoreProviderProps): JSX.Element {\n return <OrdersApiProvider value={api}>{children}</OrdersApiProvider>;\n}\n","import type { orders } from \"./types\";\n\nexport const ordersKeys = {\n all: [\"orders\"] as const,\n list: (params?: orders.FetchOrdersParams) =>\n [...ordersKeys.all, \"list\", params] as const,\n detail: (orderToken: string) =>\n [...ordersKeys.all, \"detail\", orderToken] as const,\n} as const;\n\nexport const portalTenantOrdersKeys = {\n all: [\"portalTenantOrders\"] as const,\n list: (params?: orders.PortalTenantFetchOrdersParams) =>\n [...portalTenantOrdersKeys.all, \"list\", params] as const,\n detail: (id: string | number) =>\n [...portalTenantOrdersKeys.all, \"detail\", id] as const,\n} as const;\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { orders } from \"../types\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function useInfiniteCustomerOrders(\n params: Omit<orders.FetchOrdersParams, \"cursor\">,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useInfiniteQuery({\n queryKey: [...ordersKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) => {\n if (!api.fetchCustomerOrders) {\n throw new Error(\n \"fetchCustomerOrders not implemented on this OrdersApi\",\n );\n }\n return api.fetchCustomerOrders({ ...params, cursor: pageParam });\n },\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? true,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { portalTenantOrdersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function usePortalTenantOrder(\n id: string | number,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useQuery({\n queryKey: portalTenantOrdersKeys.detail(id),\n queryFn: () => {\n if (!api.fetchOrderById) {\n throw new Error(\"fetchOrderById not implemented on this OrdersApi\");\n }\n return api.fetchOrderById(id);\n },\n enabled: (options?.enabled ?? true) && !!id,\n });\n}\n","import type { orders } from \"../types\";\n\nexport function formatOrderTotal(order: orders.ListOrder): string {\n if (order.order_total_after_points_redemption != null) {\n return `${order.currency_symbol || \"$\"}${Number(\n order.order_total_after_points_redemption,\n ).toFixed(2)}`;\n }\n return (\n order.total_display_amount ||\n `${order.currency_symbol || \"$\"}${Number(order.amount).toFixed(2)}`\n );\n}\n","export interface StaticMapAddress {\n address1: string | null;\n city: string | null;\n state: string | null;\n postal_code: string | null;\n}\n\nexport interface StaticMapOptions {\n width?: number;\n height?: number;\n zoom?: number;\n markerColor?: string;\n}\n\nexport function buildStaticMapUrl(\n apiKey: string,\n address: StaticMapAddress,\n options?: StaticMapOptions,\n): string | null {\n if (\n !address.address1 ||\n !address.city ||\n !address.state ||\n !address.postal_code\n ) {\n return null;\n }\n\n const formatted = `${address.address1}, ${address.city}, ${address.state} ${address.postal_code.slice(0, 5)}`;\n const encoded = encodeURIComponent(formatted);\n const width = options?.width ?? 600;\n const height = options?.height ?? 300;\n const zoom = options?.zoom ?? 15;\n const markerColor = encodeURIComponent(options?.markerColor ?? \"red\");\n\n return `https://maps.googleapis.com/maps/api/staticmap?center=${encoded}&zoom=${zoom}&size=${width}x${height}&maptype=roadmap&markers=color:${markerColor}%7C${encoded}&key=${apiKey}`;\n}\n","import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\ntype RawAddress = RawOrder[\"shipping_address\"];\ntype RawPaymentMethod = RawOrder[\"payment_method\"];\ntype RawShippingMethod = RawOrder[\"shipping_method\"];\n\n/**\n * Requires a BFF money field to be present. The BFF contract guarantees\n * subtotal/discount/shipping/tax on every Order, so a missing value signals\n * a broken contract. Mirrors the fail-loud pattern in subscriptions-api-adapter\n * (see the `BFF returned a successful response but subscription data was\n * missing` throw) and avoids silently rendering $0.00 in the UI, which a\n * customer cannot distinguish from a legitimately free line.\n */\nfunction requireMoneyField(\n value: string | null | undefined,\n field: string,\n): string {\n if (value == null) {\n throw new Error(\n `BFF returned an order without required money field \"${field}\"`,\n );\n }\n return value;\n}\n\nfunction mapAddress(raw: RawAddress): orders.PortalTenantAddress | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n name: raw.name ?? null,\n address1: raw.address1 ?? null,\n address2: raw.address2 ?? null,\n city: raw.city ?? null,\n state: raw.state ?? null,\n postal_code: raw.postal_code ?? null,\n country_code: raw.country_code ?? null,\n } satisfies orders.PortalTenantAddress;\n}\n\nfunction mapPaymentMethod(\n raw: RawPaymentMethod,\n): orders.PortalTenantPaymentMethod | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n source: raw.source ?? \"\",\n payment_type: raw.payment_type ?? \"\",\n card_type: raw.card_type ?? null,\n last4: raw.last4 ?? null,\n } satisfies orders.PortalTenantPaymentMethod;\n}\n\nfunction mapShippingMethod(\n raw: RawShippingMethod,\n): orders.PortalTenantShippingMethod | null {\n if (!raw) return null;\n return {\n id: raw.id ?? null,\n title: raw.title ?? \"\",\n } satisfies orders.PortalTenantShippingMethod;\n}\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n const subtotal = requireMoneyField(raw.subtotal, \"subtotal\");\n const discount = requireMoneyField(raw.discount, \"discount\");\n const shipping = requireMoneyField(raw.shipping, \"shipping\");\n const tax = requireMoneyField(raw.tax, \"tax\");\n const total = requireMoneyField(raw.total, \"total\");\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n subtotal,\n subtotal_in_currency: raw.subtotal_in_currency ?? subtotal,\n discount,\n discount_in_currency: raw.discount_in_currency ?? discount,\n shipping,\n shipping_in_currency: raw.shipping_in_currency ?? shipping,\n tax,\n tax_in_currency: raw.tax_in_currency ?? tax,\n total,\n total_in_currency: raw.total_in_currency ?? total,\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => {\n const liPrice = li.price ?? \"0\";\n const liTotal = li.total ?? \"0\";\n return {\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n variant_id: li.variant_id ?? null,\n variant_name: li.variant_name ?? null,\n sku: li.sku ?? null,\n image_url: li.image_url ?? null,\n quantity: li.quantity ?? 0,\n price: liPrice,\n price_in_currency: li.price_in_currency ?? liPrice,\n total: liTotal,\n total_in_currency: li.total_in_currency ?? liTotal,\n source_subscription: li.source_subscription?.subscription_token\n ? { subscription_token: li.source_subscription.subscription_token }\n : null,\n };\n }),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n shipping_address: mapAddress(raw.shipping_address ?? null),\n billing_address: mapAddress(raw.billing_address ?? null),\n payment_method: mapPaymentMethod(raw.payment_method),\n shipping_method: mapShippingMethod(raw.shipping_method),\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: raw.total_in_currency ?? raw.total ?? \"0\",\n total_cv: 0,\n total_qv: 0,\n // BFF doesn't expose a currency symbol; leave empty so `formatOrderTotal`\n // falls back to \"$\" rather than rendering the ISO code (e.g. \"USD50.00\").\n currency_symbol: \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? {\n title: firstLineItem.product_name ?? \"\",\n image_url: firstLineItem.image_url ?? \"\",\n }\n : null,\n // Up to 3 product image URLs from the order's line items, in line-item\n // order, used for list-row photo stacks. Skips items without an image.\n thumbnail_image_urls:\n raw.line_items\n ?.map((li) => li.image_url)\n .filter((u): u is string => typeof u === \"string\" && u.length > 0)\n .slice(0, 3) ?? [],\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","export const ordersEn = {\n breadcrumb: \"Orders\",\n breadcrumb_detail: \"Order #{{id}}\",\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n total: \"Total\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n no_image: \"No image\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n subscription_hash: \"Subscription #{{token}}\",\n view_subscription: \"View Subscription\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n showing: \"Showing\",\n to: \"to\",\n of: \"of\",\n order_not_found: \"Order not found\",\n error_generic: \"An error occurred\",\n error_loading_order: \"Failed to load order: {{message}}\",\n items_count: \"Items ({{count}})\",\n subtotal: \"Subtotal\",\n discount: \"Discount\",\n shipping: \"Shipping\",\n shipping_free: \"Free\",\n tax: \"Tax\",\n tax_included: \"{{name}}, included\",\n points_applied: \"Points Applied\",\n points_applied_singular: \"pt\",\n points_applied_plural: \"pts\",\n points_earned: \"Points Earned on This Order!\",\n points_total: \"{{count}} points total\",\n points: \"points\",\n status_label: \"Status:\",\n payment_label: \"Payment:\",\n fulfillment_label: \"Fulfillment:\",\n delivery_label: \"Delivery:\",\n order_info: \"Order Info\",\n order: \"Order\",\n order_number_label: \"Order Number\",\n email: \"Email\",\n customer: \"Customer\",\n payment_method: \"Payment Method\",\n no_payment_method: \"No payment method\",\n card_ending_in: \"{{brand}} ending in {{last4}}\",\n shipping_address: \"Shipping Address\",\n no_shipping_address: \"No shipping address available\",\n billing_address: \"Billing Address\",\n shipping_method: \"Shipping Method\",\n estimated_delivery: \"Est. {{estimate}}\",\n sku_label: \"SKU: {{sku}}\",\n\n // ── Orders list screen ──────────────────────────────────────────────\n order_history: \"Order history\",\n loading: \"Loading...\",\n load_more: \"Load more\",\n filter_all: \"All\",\n filter_delivered: \"Delivered\",\n filter_preparing: \"Preparing\",\n filter_subscription: \"Subscription\",\n status_delivered: \"Delivered\",\n status_shipped: \"Shipped\",\n status_preparing: \"Preparing\",\n status_processing: \"Processing\",\n group_this_week: \"This week\",\n group_this_month: \"This month\",\n today: \"Today\",\n yesterday: \"Yesterday\",\n n_days_ago: \"{{n}} days ago\",\n last_week: \"Last week\",\n n_weeks_ago: \"{{n}} weeks ago\",\n more_items: \"+ {{n}} more\",\n from_subscription: \"From subscription\",\n no_orders_yet: \"No orders yet\",\n search_hint: \"Try a different search term.\",\n empty_hint: \"Your orders will show up here after you place one.\",\n load_failed_title: \"Couldn't load your orders\",\n load_failed_hint: \"Something went wrong on our end. Please try again.\",\n try_again: \"Try again\",\n shipping_address_map: \"Shipping address map\",\n card_fallback: \"Card\",\n} as const satisfies Record<string, string>;\n\nexport type OrdersDict = typeof ordersEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { ordersEn, type OrdersDict } from \"./translation-dictionary\";\n\nexport const ordersDomain: DomainTranslations<OrdersDict> =\n createDomainTranslations<OrdersDict>({\n fallback: ordersEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): OrdersDict => m.default as OrdersDict,\n ),\n },\n });\n\nexport function createOrdersTranslationAdapter(\n locale: string,\n dict: OrdersDict,\n): TranslationApi<OrdersDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { OrdersDict } from \"./translation-dictionary\";\n\nconst { Provider: OrdersProvider, useTranslation } =\n createTranslationContext<OrdersDict>(\"Orders\");\n\nexport const OrdersTranslationProvider: Provider<TranslationApi<OrdersDict> | null> =\n OrdersProvider;\nexport const useOrdersTranslation = useTranslation;\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n ordersDomain,\n createOrdersTranslationAdapter,\n} from \"@fluid-app/orders-core/translation-adapter\";\nimport { OrdersTranslationProvider } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport function OrdersTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(ordersDomain, locale);\n const api = useMemo(\n () => createOrdersTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <OrdersTranslationProvider value={api}>\n {children}\n </OrdersTranslationProvider>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport type { OrdersDict } from \"@fluid-app/orders-core/translation-dictionary\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\n\nexport type T = TranslationApi<OrdersDict>[\"t\"];\n\nexport type FilterKey = \"all\" | \"delivered\" | \"preparing\" | \"subscription\";\n\nexport type StatusKind =\n | \"delivered\"\n | \"preparing\"\n | \"shipped\"\n | \"cancelled\"\n | \"pending\";\n\nexport interface MappedStatus {\n kind: StatusKind;\n label: string;\n}\n\ntype StatusLabelKey =\n | \"status_delivered\"\n | \"status_shipped\"\n | \"status_preparing\"\n | \"status_processing\";\n\n// Aliases fold to the same `kind` (e.g. completed/fulfilled → delivered).\n// `labelKey` is omitted for cancelled-family statuses so the raw user-input\n// status (Cancelled / Returned / Refunded) is preserved as the label —\n// these aren't part of the translation dictionary.\nconst STATUS_LOOKUP: Record<\n string,\n { kind: StatusKind; labelKey?: StatusLabelKey }\n> = {\n delivered: { kind: \"delivered\", labelKey: \"status_delivered\" },\n completed: { kind: \"delivered\", labelKey: \"status_delivered\" },\n fulfilled: { kind: \"delivered\", labelKey: \"status_delivered\" },\n shipped: { kind: \"shipped\", labelKey: \"status_shipped\" },\n cancelled: { kind: \"cancelled\" },\n returned: { kind: \"cancelled\" },\n refunded: { kind: \"cancelled\" },\n preparing: { kind: \"preparing\", labelKey: \"status_preparing\" },\n pending: { kind: \"pending\", labelKey: \"status_processing\" },\n unfulfilled: { kind: \"pending\", labelKey: \"status_processing\" },\n processing: { kind: \"pending\", labelKey: \"status_processing\" },\n};\n\n/**\n * Map a raw `order_status` string from the BFF onto our internal status\n * vocabulary (`StatusKind`). Aliases are folded together (`completed` →\n * `delivered`, `unfulfilled` → `pending`, etc.). Unknown statuses pass\n * through with `kind: \"pending\"` and the raw label capitalized — never\n * synthesize a colored pill that pretends to be real status data.\n */\nexport function mapStatus(orderStatus: string, t: T): MappedStatus {\n const entry = STATUS_LOOKUP[(orderStatus || \"\").toLowerCase()];\n const rawLabel = orderStatus\n ? orderStatus.charAt(0).toUpperCase() + orderStatus.slice(1)\n : \"—\";\n if (!entry) return { kind: \"pending\", label: rawLabel };\n return {\n kind: entry.kind,\n label: entry.labelKey ? t(entry.labelKey) : rawLabel,\n };\n}\n\nexport const STATUS_STYLES: Record<\n StatusKind,\n { bg: string; text: string; dot: string }\n> = {\n delivered: {\n bg: \"bg-emerald-50 dark:bg-emerald-950/40\",\n text: \"text-emerald-700 dark:text-emerald-400\",\n dot: \"bg-emerald-500\",\n },\n shipped: {\n bg: \"bg-sky-50 dark:bg-sky-950/40\",\n text: \"text-sky-700 dark:text-sky-400\",\n dot: \"bg-sky-500\",\n },\n preparing: {\n bg: \"bg-amber-50 dark:bg-amber-950/40\",\n text: \"text-amber-700 dark:text-amber-400\",\n dot: \"bg-amber-500\",\n },\n pending: {\n bg: \"bg-muted\",\n text: \"text-muted-foreground\",\n dot: \"bg-muted-foreground\",\n },\n cancelled: {\n bg: \"bg-destructive/10\",\n text: \"text-destructive\",\n dot: \"bg-destructive\",\n },\n};\n\nexport function filterPredicate(\n filter: FilterKey,\n order: orders.ListOrder,\n): boolean {\n if (filter === \"all\") return true;\n if (filter === \"subscription\") return order.subscription != null;\n // Use a no-op `t` here — we only need the kind for filter classification.\n const status = mapStatus(order.order_status, identity).kind;\n if (filter === \"delivered\")\n return status === \"delivered\" || status === \"shipped\";\n if (filter === \"preparing\")\n return status === \"preparing\" || status === \"pending\";\n return true;\n}\n\nconst identity = ((k: string) => k) as T;\n\nexport function countByFilter(\n list: orders.ListOrder[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n delivered: list.filter((o) => filterPredicate(\"delivered\", o)).length,\n preparing: list.filter((o) => filterPredicate(\"preparing\", o)).length,\n subscription: list.filter((o) => filterPredicate(\"subscription\", o)).length,\n };\n}\n\nexport interface OrderGroup {\n label: string;\n orders: orders.ListOrder[];\n}\n\n/**\n * Group orders into date buckets (\"This week\", \"This month\", month name, or\n * \"{Month} {year}\" for anything older than the current year). Insertion\n * order is preserved within and between buckets so newest-first ordering\n * from the BFF carries through.\n *\n * `t` resolves the structural bucket labels (\"This week\" / \"This month\").\n * Older buckets use `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests; defaults to the current wall-clock time.\n */\nexport function groupOrdersByDate(\n list: orders.ListOrder[],\n t: T,\n now: Date = new Date(),\n): OrderGroup[] {\n if (list.length === 0) return [];\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const sevenDaysAgo = new Date(startOfToday);\n sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n const startOfYear = new Date(now.getFullYear(), 0, 1);\n\n const buckets = new Map<string, orders.ListOrder[]>();\n const order: string[] = [];\n\n for (const o of list) {\n const created = new Date(o.created_at);\n let label: string;\n if (created >= sevenDaysAgo) {\n label = t(\"group_this_week\");\n } else if (created >= startOfMonth) {\n label = t(\"group_this_month\");\n } else if (created >= startOfYear) {\n label = created.toLocaleDateString(undefined, {\n month: \"long\",\n });\n } else {\n label = created.toLocaleDateString(undefined, {\n month: \"long\",\n year: \"numeric\",\n });\n }\n let bucket = buckets.get(label);\n if (!bucket) {\n bucket = [];\n buckets.set(label, bucket);\n order.push(label);\n }\n bucket.push(o);\n }\n\n return order.map((label) => ({\n label,\n orders: buckets.get(label) ?? [],\n }));\n}\n\n/**\n * Render a friendly relative-time label for an order's created_at.\n * `t` resolves the relative-time templates; `{{n}}` placeholders are\n * substituted by the i18n system. Absolute dates use\n * `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests.\n */\nexport function formatFriendlyDate(\n iso: string,\n t: T,\n now: Date = new Date(),\n): string {\n try {\n const d = new Date(iso);\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const diffDays = Math.round(\n (startOfToday.getTime() - startOfDate.getTime()) / (1000 * 60 * 60 * 24),\n );\n\n if (diffDays === 0) return t(\"today\");\n if (diffDays === 1) return t(\"yesterday\");\n if (diffDays < 7) return t(\"n_days_ago\", { n: diffDays });\n if (diffDays < 14) return t(\"last_week\");\n if (diffDays < 30) return t(\"n_weeks_ago\", { n: Math.round(diffDays / 7) });\n if (d.getFullYear() === now.getFullYear()) {\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n }\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"\";\n }\n}\n\n/**\n * Compute the per-image transform for the photo-stack fan in `OrderRow`.\n * Index 0 is the front (centered, no rotation); index 1 peeks right;\n * index 2 peeks left.\n */\nexport function fanStyle(\n i: number,\n count: number,\n): { left: string; transform: string; zIndex: number } {\n if (i === 0) {\n return {\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 30,\n };\n }\n if (i === 1) {\n return {\n left: \"50%\",\n transform:\n count === 2\n ? \"translateX(-25%) rotate(7deg)\"\n : \"translateX(-20%) rotate(7deg)\",\n zIndex: 20,\n };\n }\n return {\n left: \"50%\",\n transform: \"translateX(-80%) rotate(-7deg)\",\n zIndex: 10,\n };\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type orders,\n useInfiniteCustomerOrders,\n formatOrderTotal,\n} from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { Search, ImageOff, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n type FilterKey,\n type MappedStatus,\n type T,\n STATUS_STYLES,\n countByFilter,\n fanStyle,\n filterPredicate,\n formatFriendlyDate,\n groupOrdersByDate,\n mapStatus,\n} from \"./portal-orders-list-helpers\";\n\nexport type { FilterKey } from \"./portal-orders-list-helpers\";\n\ninterface PortalOrdersListProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n /**\n * Translation function. Falls back to the context-provided `t` when\n * absent. Production callers should always supply `t` or ensure the\n * `OrdersTranslationBridge` is mounted above this component.\n */\n t?: T;\n}\n\nexport function PortalOrdersList({\n customerId,\n onOrderClick,\n t: tProp,\n}: PortalOrdersListProps): JSX.Element {\n const { t: tContext } = useOrdersTranslation();\n const t = tProp ?? tContext;\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteCustomerOrders(\n {\n customerId,\n limit: 10,\n search: searchTerm || undefined,\n sort: \"-created_at\",\n },\n { enabled: !!customerId },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.orders) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((o) => filterPredicate(filter, o)),\n [list, filter],\n );\n const groups = useMemo(\n () => groupOrdersByDate(filteredList, t),\n [filteredList, t],\n );\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"order_history\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-foreground flex-1 truncate text-xl font-bold tracking-tight md:text-2xl\">\n {t(\"order_history\")}\n </h1>\n <div className=\"relative hidden sm:block\">\n <Search\n className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\"\n strokeWidth={2}\n />\n <Input\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={t(\"search_orders\")}\n className=\"ring-border h-9 w-64 rounded-md bg-transparent pl-9 text-xs\"\n />\n </div>\n </div>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n t={t}\n />\n )}\n\n {isLoading ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <OrdersListSkeleton />\n </div>\n ) : isError ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <ErrorState onRetry={() => refetch()} t={t} />\n </div>\n ) : filteredList.length === 0 ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <EmptyState searching={!!searchTerm || filter !== \"all\"} t={t} />\n </div>\n ) : (\n <div className=\"mt-4 space-y-6\">\n {groups.map((group) => (\n <div key={group.label}>\n <div className=\"text-muted-foreground mb-2 px-1 text-xs font-semibold\">\n {group.label}\n </div>\n <div className=\"space-y-3\">\n {group.orders.map((order) => (\n <OrderRow\n key={order.id}\n order={order}\n onClick={() => onOrderClick(order)}\n t={t}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {hasNextPage && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"loading\") : t(\"load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{\n key: FilterKey;\n labelKey:\n | \"filter_all\"\n | \"filter_delivered\"\n | \"filter_preparing\"\n | \"filter_subscription\";\n}> = [\n { key: \"all\", labelKey: \"filter_all\" },\n { key: \"delivered\", labelKey: \"filter_delivered\" },\n { key: \"preparing\", labelKey: \"filter_preparing\" },\n { key: \"subscription\", labelKey: \"filter_subscription\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"ring-border text-foreground hover:bg-muted bg-transparent ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-xs tabular-nums ${\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ─── Order row ────────────────────────────────────────────────────────────\n\nfunction OrderRow({\n order,\n onClick,\n t,\n}: {\n order: orders.ListOrder;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(order.order_status, t);\n const dateLabel = formatFriendlyDate(order.created_at, t);\n const total = formatOrderTotal(order);\n const titleText =\n order.first_item?.title || `${t(\"order_number\")}${order.order_number}`;\n const titleSuffix =\n order.items_count > 1 ? t(\"more_items\", { n: order.items_count - 1 }) : \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-foreground/5 hover:ring-foreground/10 focus-visible:ring-foreground/30 relative flex w-full cursor-pointer items-center gap-4 rounded-2xl bg-transparent p-4 text-left shadow-sm ring-1 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-foreground truncate text-sm font-bold\">\n {titleText}\n {titleSuffix && (\n <span className=\"text-muted-foreground font-medium\">\n {titleSuffix}\n </span>\n )}\n </div>\n <StatusPill status={status} />\n </div>\n <div className=\"text-muted-foreground mt-1 truncate text-xs\">\n {dateLabel} · {total}\n </div>\n </div>\n <ThumbnailStack\n fallback={order.first_item}\n urls={order.thumbnail_image_urls}\n isSubscription={order.subscription != null}\n t={t}\n />\n </button>\n );\n}\n\nfunction ThumbnailStack({\n urls,\n fallback,\n isSubscription,\n t,\n}: {\n urls: string[] | undefined;\n fallback: orders.FirstItem | null;\n isSubscription?: boolean;\n t: T;\n}): JSX.Element {\n // Prefer the explicit thumbnail array; fall back to first_item.image_url\n // for older API responses or when only one image exists.\n const effective = (\n urls && urls.length > 0\n ? urls\n : fallback?.image_url\n ? [fallback.image_url]\n : []\n ).slice(0, 3);\n\n if (effective.length === 0) {\n return (\n <div className=\"ring-border bg-muted text-muted-foreground relative flex size-12 shrink-0 items-center justify-center rounded-xl ring-1\">\n <ImageOff className=\"size-5\" strokeWidth={1.75} />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n if (effective.length === 1) {\n return (\n <div className=\"relative size-12 shrink-0\">\n <img\n src={effective[0]}\n alt=\"\"\n className=\"ring-background size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n // Symmetric fan: front image centered, with up to 2 back images peeking\n // out behind on the left and right with a slight outward rotation. The\n // container is wider than a single thumb so back images can peek.\n const stackWidth = effective.length === 3 ? \"w-[80px]\" : \"w-[60px]\";\n return (\n <div className={`relative h-12 ${stackWidth} shrink-0`}>\n {effective.map((url, i) => (\n <img\n key={`${url}-${i}`}\n src={url}\n alt=\"\"\n className=\"ring-background absolute top-0 size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n style={fanStyle(i, effective.length)}\n />\n ))}\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n}\n\nfunction SubscriptionBadge({ t }: { t: T }): JSX.Element {\n return (\n <div\n className=\"bg-primary text-primary-foreground ring-background absolute -top-1 -right-1 z-40 flex size-5 items-center justify-center rounded-full ring-2\"\n title={t(\"from_subscription\")}\n >\n <Repeat className=\"size-2.5\" strokeWidth={2.75} />\n </div>\n );\n}\n\nfunction StatusPill({ status }: { status: MappedStatus }): JSX.Element {\n const styles = STATUS_STYLES[status.kind];\n return (\n <span\n className={`inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-0.5 text-xs font-semibold ${styles.bg} ${styles.text}`}\n >\n <span className={`size-1.5 rounded-full ${styles.dot}`} />\n {status.label}\n </span>\n );\n}\n\nfunction OrdersListSkeleton(): JSX.Element {\n return (\n <>\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <div\n key={i}\n className={`flex items-center gap-3 px-4 py-3.5 ${i < 3 ? \"border-border border-b\" : \"\"}`}\n >\n <div className=\"bg-muted size-12 shrink-0 animate-pulse rounded-xl\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"bg-muted h-4 w-1/3 animate-pulse rounded\" />\n <div className=\"bg-muted h-3 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </>\n );\n}\n\nfunction EmptyState({\n searching,\n t,\n}: {\n searching: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <Search className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {searching ? t(\"no_matching_orders\") : t(\"no_orders_yet\")}\n </div>\n <div className=\"text-muted-foreground max-w-sm text-xs\">\n {searching ? t(\"search_hint\") : t(\"empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <AlertCircle className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"load_failed_title\")}\n </div>\n <div className=\"text-muted-foreground max-w-sm text-xs\">\n {t(\"load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"try_again\")}\n </button>\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersList } from \"./orders/PortalOrdersList\";\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { t } = useOrdersTranslation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n return (\n <PortalOrdersList\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n t={t}\n />\n );\n}\n","import { cn } from \"@fluid-app/ui-primitives\";\n\nexport type BadgeColor = \"green\" | \"yellow\" | \"red\" | \"blue\" | \"gray\";\n\ntype BadgeSize = \"xs\" | \"sm\" | \"md\";\n\ninterface StatusBadgeProps {\n color: BadgeColor;\n dot?: boolean;\n size?: BadgeSize;\n className?: string;\n children: React.ReactNode;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500/15 text-foreground\",\n yellow: \"bg-yellow-500/15 text-foreground\",\n red: \"bg-red-500/15 text-foreground\",\n blue: \"bg-blue-500/15 text-foreground\",\n gray: \"bg-foreground/10 text-foreground\",\n};\n\nconst dotColorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n blue: \"bg-blue-500\",\n gray: \"bg-gray-500\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-1.5 py-0.5 text-[10px]\",\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-2.5 py-1 text-sm\",\n};\n\nexport function StatusBadge({\n color,\n dot,\n size = \"md\",\n className,\n children,\n}: StatusBadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap capitalize\",\n colorStyles[color],\n sizeStyles[size],\n className,\n )}\n >\n {dot && (\n <span\n className={cn(\"h-1.5 w-1.5 rounded-full\", dotColorStyles[color])}\n />\n )}\n {children}\n </span>\n );\n}\n","export function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function formatCurrency(symbol: string, value: string | number): string {\n return `${symbol}${Number(value).toFixed(2)}`;\n}\n","import { StatusBadge, type BadgeColor } from \"./status-badge\";\nimport { startCase } from \"../lib/format\";\n\nconst statusColorMap: Record<string, BadgeColor> = {\n paid: \"green\",\n fulfilled: \"green\",\n delivered: \"green\",\n complete: \"green\",\n pending: \"yellow\",\n unfulfilled: \"yellow\",\n partially_fulfilled: \"yellow\",\n processing: \"yellow\",\n refunded: \"red\",\n cancelled: \"red\",\n failed: \"red\",\n voided: \"red\",\n};\n\nexport interface OrderStatusBadgeProps {\n status: string;\n className?: string;\n}\n\nexport function OrderStatusBadge({ status, className }: OrderStatusBadgeProps) {\n const color = statusColorMap[status] ?? \"gray\";\n return (\n <StatusBadge color={color} dot size=\"sm\" className={className}>\n {startCase(status)}\n </StatusBadge>\n );\n}\n","import { useState } from \"react\";\nimport type {\n StaticMapAddress,\n StaticMapOptions,\n} from \"@fluid-app/orders-core\";\nimport { buildStaticMapUrl } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport interface StaticMapProps {\n apiKey: string;\n address: StaticMapAddress;\n options?: StaticMapOptions;\n alt?: string;\n className?: string;\n}\n\nexport function StaticMap({\n apiKey,\n address,\n options,\n alt,\n className,\n}: StaticMapProps) {\n const { t } = useOrdersTranslation();\n const [errored, setErrored] = useState(false);\n const url = buildStaticMapUrl(apiKey, address, options);\n\n if (!url || errored) return null;\n\n return (\n <img\n src={url}\n alt={alt ?? t(\"shipping_address_map\")}\n width={options?.width ?? 600}\n height={options?.height ?? 300}\n className={\n className ??\n \"border-border w-full rounded border object-cover shadow-xs\"\n }\n onError={() => setErrored(true)}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\nimport { StaticMap } from \"./static-map\";\n\n// Human-readable labels for the non-card entries of PaymentMethod.payment_type.\n// Card payments render via card_type (uppercased) and bypass this map entirely.\nconst PAYMENT_TYPE_LABELS: Record<string, string> = {\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n paypal: \"PayPal\",\n braintree_paypal: \"PayPal\",\n affirm: \"Affirm\",\n klarna: \"Klarna\",\n bread: \"Bread\",\n iap: \"In-App Purchase\",\n citcon: \"Citcon\",\n ppro: \"PPRO\",\n dlocal: \"dLocal\",\n droplet: \"Droplet\",\n};\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n googleMapsApiKey?: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"size-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <p className=\"text-muted-foreground\">{label}</p>\n <p className=\"text-foreground\">{value}</p>\n </div>\n );\n}\n\n/**\n * Display a positive money string as a deduction (prefixed with \"-\").\n * Idempotent: if the value already starts with \"-\" we leave it alone, so\n * a future BFF that returns signed discounts can't produce \"--$10.00\".\n */\nfunction asNegative(value: string): string {\n return value.startsWith(\"-\") ? value : `-${value}`;\n}\n\n/**\n * Pick the formatted currency string when present, falling back to the raw\n * decimal so the row still renders something for orders where the BFF left\n * the field nil (e.g. a checkout where shipping was never set).\n */\nfunction moneyDisplay(formatted: string | null, fallback: string): string {\n return formatted ?? fallback;\n}\n\nfunction formatAddressLines(address: orders.PortalTenantAddress): string[] {\n const lines: string[] = [];\n if (address.name) lines.push(address.name);\n if (address.address1) lines.push(address.address1);\n if (address.address2) lines.push(address.address2);\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n if (cityLine) lines.push(cityLine);\n if (address.country_code) lines.push(address.country_code);\n return lines;\n}\n\nfunction AddressBlock({\n address,\n title,\n}: {\n address: orders.PortalTenantAddress;\n title: string;\n}) {\n const lines = formatAddressLines(address);\n if (lines.length === 0) return null;\n return (\n <div>\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">{title}</h3>\n <div className=\"text-foreground space-y-0.5 text-sm\">\n {lines.map((line, index) => (\n <p key={index}>{line}</p>\n ))}\n </div>\n </div>\n );\n}\n\nfunction ShippingMethodSection({\n shippingMethod,\n}: {\n shippingMethod: orders.PortalTenantShippingMethod;\n}) {\n const { t } = useOrdersTranslation();\n // Mirror the checkout's ShippingMethodDisplay null-guard: hide the row when\n // the BFF returned a method without a usable label rather than rendering an\n // empty heading.\n if (!shippingMethod.title) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"shipping_method\")}\n </h3>\n <p className=\"text-foreground text-sm\">{shippingMethod.title}</p>\n </div>\n );\n}\n\nfunction PaymentMethodSection({\n paymentMethod,\n}: {\n paymentMethod: orders.PortalTenantPaymentMethod;\n}) {\n const { t } = useOrdersTranslation();\n const { card_type, last4 } = paymentMethod;\n const brand = card_type\n ? card_type.toUpperCase()\n : (PAYMENT_TYPE_LABELS[paymentMethod.payment_type] ??\n paymentMethod.payment_type);\n const label = last4 ? t(\"card_ending_in\", { brand, last4 }) : brand;\n if (!label) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"payment_method\")}\n </h3>\n <p className=\"text-foreground text-sm\">{label}</p>\n </div>\n );\n}\n\nfunction LineItemImage({ src, alt }: { src: string; alt: string }) {\n const { t } = useOrdersTranslation();\n const [errored, setErrored] = useState(false);\n if (errored) return <span className=\"text-xs\">{t(\"no_image\")}</span>;\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full object-cover\"\n onError={() => setErrored(true)}\n />\n );\n}\n\nfunction ItemRow({\n item,\n onSubscriptionClick,\n}: {\n item: orders.PortalTenantOrderLineItem;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n const { t } = useOrdersTranslation();\n const subscriptionToken = item.source_subscription?.subscription_token;\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n {item.image_url ? (\n <LineItemImage src={item.image_url} alt={item.product_name} />\n ) : (\n <span className=\"text-xs\">{t(\"no_image\")}</span>\n )}\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n {item.variant_name && (\n <p\n className=\"text-muted-foreground truncate text-xs\"\n title={item.variant_name}\n >\n {item.variant_name}\n </p>\n )}\n <p className=\"text-foreground text-sm font-medium\">\n {moneyDisplay(item.total_in_currency, item.total)}\n </p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {moneyDisplay(item.price_in_currency, item.price)} x {item.quantity}\n </p>\n )}\n {subscriptionToken && onSubscriptionClick && (\n <button\n type=\"button\"\n title={subscriptionToken}\n className=\"mt-1 max-w-full cursor-pointer truncate text-left text-xs text-blue-600 transition-colors duration-200 hover:text-blue-700 hover:underline\"\n onClick={() => onSubscriptionClick(subscriptionToken)}\n >\n {t(\"subscription_hash\", { token: subscriptionToken })}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({\n order,\n onSubscriptionClick,\n}: {\n order: orders.PortalTenantOrder;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n const { t } = useOrdersTranslation();\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n {t(\"items_count\", { count: String(order.line_items.length) })}\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow\n key={item.id}\n item={item}\n onSubscriptionClick={onSubscriptionClick}\n />\n ))}\n </div>\n\n <div className=\"border-border mb-4 space-y-1 border-t pt-4\">\n <SummaryRow\n label={t(\"subtotal\")}\n value={moneyDisplay(order.subtotal_in_currency, order.subtotal)}\n />\n {parseFloat(order.discount) > 0 && (\n <SummaryRow\n label={t(\"discount\")}\n value={asNegative(\n moneyDisplay(order.discount_in_currency, order.discount),\n )}\n />\n )}\n <SummaryRow\n label={t(\"shipping\")}\n value={moneyDisplay(order.shipping_in_currency, order.shipping)}\n />\n <SummaryRow\n label={t(\"tax\")}\n value={moneyDisplay(order.tax_in_currency, order.tax)}\n />\n <div className=\"mt-2 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"total\")}\n </p>\n <p className=\"text-foreground text-base font-bold\">\n {moneyDisplay(order.total_in_currency, order.total)}\n </p>\n </div>\n </div>\n\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n {t(\"points_earned\")}\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {t(\"points_total\", {\n count: order.customer_points_balance.toLocaleString(),\n })}\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">{t(\"points\")}</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({\n order,\n googleMapsApiKey,\n}: {\n order: orders.PortalTenantOrder;\n googleMapsApiKey?: string;\n}) {\n const { t, locale } = useOrdersTranslation();\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">\n {t(\"status_label\")}\n </span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {googleMapsApiKey && order.shipping_address && (\n <div className=\"mb-6\">\n <StaticMap\n apiKey={googleMapsApiKey}\n address={order.shipping_address}\n />\n </div>\n )}\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"order_info\")}\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">{t(\"order\")}</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">{t(\"date\")}</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">{t(\"email\")}</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"customer\")}\n </div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n\n {order.shipping_address && order.billing_address ? (\n <div className=\"border-border mb-6 grid grid-cols-2 gap-x-4 border-b pb-6\">\n <AddressBlock\n address={order.shipping_address}\n title={t(\"shipping_address\")}\n />\n <AddressBlock\n address={order.billing_address}\n title={t(\"billing_address\")}\n />\n </div>\n ) : (\n order.shipping_address && (\n <div className=\"border-border mb-6 border-b pb-6\">\n <AddressBlock\n address={order.shipping_address}\n title={t(\"shipping_address\")}\n />\n </div>\n )\n )}\n {order.shipping_method && (\n <ShippingMethodSection shippingMethod={order.shipping_method} />\n )}\n {order.payment_method && (\n <PaymentMethodSection paymentMethod={order.payment_method} />\n )}\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n googleMapsApiKey,\n onNotFound,\n onError,\n onSubscriptionClick,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} onSubscriptionClick={onSubscriptionClick} />\n <DetailsSection order={order} googleMapsApiKey={googleMapsApiKey} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n googleMapsApiKey?: string;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n googleMapsApiKey,\n onNavigateToList,\n onNotFound,\n onError,\n onSubscriptionClick,\n}: PortalOrderDetailScreenProps) {\n const { t } = useOrdersTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n {t(\"breadcrumb\")}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb_detail\", { id: String(id) })}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail\n id={id}\n googleMapsApiKey={googleMapsApiKey}\n onNotFound={onNotFound}\n onError={onError}\n onSubscriptionClick={onSubscriptionClick}\n />\n </div>\n </>\n );\n}\n","import { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { config } = useFluidContext();\n const { t } = useOrdersTranslation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n googleMapsApiKey={config.googleMapsApiKey}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(t(\"order_not_found\"), \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message = err instanceof Error ? err.message : t(\"error_generic\");\n onToast(t(\"error_loading_order\", { message }), \"error\");\n }}\n onSubscriptionClick={(subscriptionToken) =>\n navigate(`subscriptions/${subscriptionToken}`)\n }\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersTranslationBridge } from \"../providers/OrdersTranslationBridge\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = 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 OrdersScreen({\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}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <OrdersTranslationBridge>\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n </OrdersTranslationBridge>\n );\n }\n\n return (\n <OrdersTranslationBridge>\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n </OrdersTranslationBridge>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;;;AAGA,MAAM,mBAAmB,cAAgC,KAAK;AAE9D,MAAa,oBAAoB,iBAAiB;AAElD,SAAgB,eAA0B;CACxC,MAAM,MAAM,WAAW,iBAAiB;AACxC,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,yDAAyD;AAE3E,QAAO;;;;ACHT,SAAgB,mBAAmB,EACjC,KACA,YACuC;AACvC,QAAO,oBAAC,mBAAD;EAAmB,OAAO;EAAM;EAA6B,CAAA;;;;ACXtE,MAAa,aAAa;CACxB,KAAK,CAAC,SAAS;CACf,OAAO,WACL;EAAC,GAAG,WAAW;EAAK;EAAQ;EAAO;CACrC,SAAS,eACP;EAAC,GAAG,WAAW;EAAK;EAAU;EAAW;CAC5C;AAED,MAAa,yBAAyB;CACpC,KAAK,CAAC,qBAAqB;CAC3B,OAAO,WACL;EAAC,GAAG,uBAAuB;EAAK;EAAQ;EAAO;CACjD,SAAS,OACP;EAAC,GAAG,uBAAuB;EAAK;EAAU;EAAG;CAChD;;;ACXD,SAAgB,0BACd,QACA,SACA;CACA,MAAM,MAAM,cAAc;AAC1B,QAAO,iBAAiB;EACtB,UAAU;GAAC,GAAG,WAAW;GAAK;GAAiB;GAAO;EACtD,UAAU,EAAE,gBAAgB;AAC1B,OAAI,CAAC,IAAI,oBACP,OAAM,IAAI,MACR,wDACD;AAEH,UAAO,IAAI,oBAAoB;IAAE,GAAG;IAAQ,QAAQ;IAAW,CAAC;;EAElE,mBAAmB,aACjB,SAAS,MAAM,YAAY,eAAe,KAAA;EAC5C,kBAAkB,KAAA;EAClB,SAAS,SAAS,WAAW;EAC9B,CAAC;;;;ACpBJ,SAAgB,qBACd,IACA,SACA;CACA,MAAM,MAAM,cAAc;AAC1B,QAAO,SAAS;EACd,UAAU,uBAAuB,OAAO,GAAG;EAC3C,eAAe;AACb,OAAI,CAAC,IAAI,eACP,OAAM,IAAI,MAAM,mDAAmD;AAErE,UAAO,IAAI,eAAe,GAAG;;EAE/B,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC;EAC1C,CAAC;;;;AChBJ,SAAgB,iBAAiB,OAAiC;AAChE,KAAI,MAAM,uCAAuC,KAC/C,QAAO,GAAG,MAAM,mBAAmB,MAAM,OACvC,MAAM,oCACP,CAAC,QAAQ,EAAE;AAEd,QACE,MAAM,wBACN,GAAG,MAAM,mBAAmB,MAAM,OAAO,MAAM,OAAO,CAAC,QAAQ,EAAE;;;;ACIrE,SAAgB,kBACd,QACA,SACA,SACe;AACf,KACE,CAAC,QAAQ,YACT,CAAC,QAAQ,QACT,CAAC,QAAQ,SACT,CAAC,QAAQ,YAET,QAAO;CAGT,MAAM,YAAY,GAAG,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,QAAQ,MAAM,GAAG,QAAQ,YAAY,MAAM,GAAG,EAAE;CAC3G,MAAM,UAAU,mBAAmB,UAAU;CAC7C,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,SAAS,SAAS,UAAU;AAIlC,QAAO,yDAAyD,QAAQ,QAH3D,SAAS,QAAQ,GAGuD,QAAQ,MAAM,GAAG,OAAO,iCAFzF,mBAAmB,SAAS,eAAe,MAAM,CAEqF,KAAK,QAAQ,OAAO;;;;;;;;;;;;ACDhL,SAAS,kBACP,OACA,OACQ;AACR,KAAI,SAAS,KACX,OAAM,IAAI,MACR,uDAAuD,MAAM,GAC9D;AAEH,QAAO;;AAGT,SAAS,WAAW,KAAoD;AACtE,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO;EACL,IAAI,IAAI,MAAM;EACd,MAAM,IAAI,QAAQ;EAClB,UAAU,IAAI,YAAY;EAC1B,UAAU,IAAI,YAAY;EAC1B,MAAM,IAAI,QAAQ;EAClB,OAAO,IAAI,SAAS;EACpB,aAAa,IAAI,eAAe;EAChC,cAAc,IAAI,gBAAgB;EACnC;;AAGH,SAAS,iBACP,KACyC;AACzC,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO;EACL,IAAI,IAAI,MAAM;EACd,QAAQ,IAAI,UAAU;EACtB,cAAc,IAAI,gBAAgB;EAClC,WAAW,IAAI,aAAa;EAC5B,OAAO,IAAI,SAAS;EACrB;;AAGH,SAAS,kBACP,KAC0C;AAC1C,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO;EACL,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,SAAS;EACrB;;AAGH,SAAS,uBAAuB,KAAyC;CACvE,MAAM,WAAW,kBAAkB,IAAI,UAAU,WAAW;CAC5D,MAAM,WAAW,kBAAkB,IAAI,UAAU,WAAW;CAC5D,MAAM,WAAW,kBAAkB,IAAI,UAAU,WAAW;CAC5D,MAAM,MAAM,kBAAkB,IAAI,KAAK,MAAM;CAC7C,MAAM,QAAQ,kBAAkB,IAAI,OAAO,QAAQ;AACnD,QAAO;EACL,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,SAAS;EACpB,QAAS,IAAI,UAAU;EACvB;EACA,sBAAsB,IAAI,wBAAwB;EAClD;EACA,sBAAsB,IAAI,wBAAwB;EAClD;EACA,sBAAsB,IAAI,wBAAwB;EAClD;EACA,iBAAiB,IAAI,mBAAmB;EACxC;EACA,mBAAmB,IAAI,qBAAqB;EAC5C,UAAU,IAAI,YAAY;EAC1B,aAAa,IAAI,cAAc,EAAE,EAAE,KAAK,OAAO;GAC7C,MAAM,UAAU,GAAG,SAAS;GAC5B,MAAM,UAAU,GAAG,SAAS;AAC5B,UAAO;IACL,IAAI,GAAG,MAAM;IACb,YAAY,GAAG,cAAc;IAC7B,cAAc,GAAG,gBAAgB;IACjC,YAAY,GAAG,cAAc;IAC7B,cAAc,GAAG,gBAAgB;IACjC,KAAK,GAAG,OAAO;IACf,WAAW,GAAG,aAAa;IAC3B,UAAU,GAAG,YAAY;IACzB,OAAO;IACP,mBAAmB,GAAG,qBAAqB;IAC3C,OAAO;IACP,mBAAmB,GAAG,qBAAqB;IAC3C,qBAAqB,GAAG,qBAAqB,qBACzC,EAAE,oBAAoB,GAAG,oBAAoB,oBAAoB,GACjE;IACL;IACD;EACF,eAAe,IAAI,iBAAiB;EACpC,gBAAgB,IAAI,kBAAkB;EACtC,kBAAkB,WAAW,IAAI,oBAAoB,KAAK;EAC1D,iBAAiB,WAAW,IAAI,mBAAmB,KAAK;EACxD,gBAAgB,iBAAiB,IAAI,eAAe;EACpD,iBAAiB,kBAAkB,IAAI,gBAAgB;EACvD,oBAAoB,IAAI,sBAAsB;EAC9C,oBAAoB,IAAI,sBAAsB;EAE9C,uBACE,OAAQ,IAAgC,0BAA0B,WAC5D,IAAgC,wBAClC,KAAA;EACN,yBACE,OAAQ,IAAgC,4BACxC,WACM,IAAgC,0BAClC,KAAA;EACN,YAAY,IAAI,cAAc;EAC9B,YAAY,IAAI,cAAc;EAC/B;;AAGH,SAAS,eAAe,KAAiC;CACvD,MAAM,gBAAgB,IAAI,aAAa;AACvC,QAAO;EACL,IAAI,IAAI,MAAM;EACd,aAAa;EACb,cAAc;EACd,OAAO,IAAI,kBAAkB;EAC7B,YAAY,IAAI,eAAe,MAAM,IAAI,CAAC,MAAM;EAChD,WAAW,IAAI,eAAe,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;EAC/D,QAAQ,IAAI,SAAS;EACrB,QAAQ,IAAI,UAAU;EACtB,cAAc,IAAI,UAAU;EAC5B,oBAAoB;EACpB,kBAAkB;EAClB,eAAe,IAAI,YAAY;EAC/B,MAAM;EACN,OAAO,IAAI,SAAS;EACpB,cAAc;EACd,QAAQ;EACR,YAAY,IAAI,cAAc;EAC9B,YAAY,IAAI,cAAc;EAC9B,sBAAsB,IAAI,qBAAqB,IAAI,SAAS;EAC5D,UAAU;EACV,UAAU;EAGV,iBAAiB;EACjB,aAAa,IAAI,YAAY,UAAU;EACvC,gBACE,IAAI,YAAY,QAAQ,KAAK,OAAO,OAAO,GAAG,YAAY,IAAI,EAAE,IAAI;EACtE,oBAAoB;EACpB,WAAW;EACX,UAAU;EACV,YAAY,gBACR;GACE,OAAO,cAAc,gBAAgB;GACrC,WAAW,cAAc,aAAa;GACvC,GACD;EAGJ,sBACE,IAAI,YACA,KAAK,OAAO,GAAG,UAAU,CAC1B,QAAQ,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS,EAAE,CACjE,MAAM,GAAG,EAAE,IAAI,EAAE;EAKtB,cACE,IAAI,sBAAsB,IAAI,qBAC1B;GAAE,oBAAoB,IAAI;GAAoB,QAAQ;GAAU,GAChE,IAAI,qBACF;GAAE,oBAAoB;GAAI,QAAQ;GAAU,GAC5C;EACT;;AAGH,SAAgB,0BACd,QACqE;AACrE,QAAO;EACL,gBAAgB,OAAO,OAAwB;GAC7C,MAAM,WAAW,MAAMA,YAAyB,QAAQ,GAAG;AAC3D,UAAO;IACL,OAAO,uBAAuB,SAAS,SAAS,EAAE,CAAC;IACnD,MAAM;KACJ,YAAY,SAAS,MAAM,cAAc;KACzC,WAAW,SAAS,MAAM,aAAa;KACxC;IACF;;EAGH,qBAAqB,OAAO,WAAqC;GAC/D,MAAM,WAAW,MAAMC,YAAyB,QAAQ;IACtD,gBAAgB,OAAO;IACvB,eAAe,OAAO;IACtB,QAAQ,OAAO;IACf,GAAG,OAAO;IACX,CAAC;AACF,UAAO;IACL,SAAS,SAAS,UAAU,EAAE,EAAE,IAAI,eAAe;IACnD,MAAM;KACJ,YAAY,SAAS,MAAM,cAAc;KACzC,WAAW,SAAS,MAAM,aAAa;KACvC,YAAY;MACV,QAAQ,SAAS,MAAM,YAAY,UAAU;MAC7C,OAAO,SAAS,MAAM,YAAY,SAAS;MAC3C,aAAa,SAAS,MAAM,YAAY,eAAe;MACvD,aAAa,SAAS,MAAM,YAAY,eAAe;MACxD;KACF;IACF;;EAEJ;;;;AC9OH,SAAgB,wBAAwB,EACtC,YAGe;CACf,MAAM,SAAS,uBAAuB;AAItC,QAAO,oBAAC,oBAAD;EAAoB,KAFf,cAAc,0BAA0B,OAAO,EAAE,CAAC,OAAO,CAAC;EAEhC;EAA8B,CAAA;;;;AENtE,MAAa,eACX,yBAAqC;CACnC,UDVoB;EACtB,YAAY;EACZ,mBAAmB;EACnB,eAAe;EACf,cAAc;EACd,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,iBAAiB;EACjB,oBAAoB;EACpB,oBAAoB;EACpB,UAAU;EACV,+BAA+B;EAC/B,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,MAAM;EACN,YAAY;EACZ,SAAS;EACT,IAAI;EACJ,IAAI;EACJ,iBAAiB;EACjB,eAAe;EACf,qBAAqB;EACrB,aAAa;EACb,UAAU;EACV,UAAU;EACV,UAAU;EACV,eAAe;EACf,KAAK;EACL,cAAc;EACd,gBAAgB;EAChB,yBAAyB;EACzB,uBAAuB;EACvB,eAAe;EACf,cAAc;EACd,QAAQ;EACR,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,gBAAgB;EAChB,YAAY;EACZ,OAAO;EACP,oBAAoB;EACpB,OAAO;EACP,UAAU;EACV,gBAAgB;EAChB,mBAAmB;EACnB,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;EACrB,iBAAiB;EACjB,iBAAiB;EACjB,oBAAoB;EACpB,WAAW;EAGX,eAAe;EACf,SAAS;EACT,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,kBAAkB;EAClB,qBAAqB;EACrB,kBAAkB;EAClB,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;EAClB,OAAO;EACP,WAAW;EACX,YAAY;EACZ,WAAW;EACX,aAAa;EACb,YAAY;EACZ,mBAAmB;EACnB,eAAe;EACf,aAAa;EACb,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,WAAW;EACX,sBAAsB;EACtB,eAAe;EAChB;CC7EG,SAAS;EACP,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,aACE,OAAO,wBAAuB,MAC3B,MAAkB,EAAE,QACtB;EACH,aACE,OAAO,wBAAuB,MAC3B,MAAkB,EAAE,QACtB;EACJ;CACF,CAAC;AAEJ,SAAgB,+BACd,QACA,MAC4B;AAC5B,QAAO,wBAAwB,QAAQ,KAAK;;;;AC9F9C,MAAM,EAAE,UAAU,gBAAgB,mBAChC,yBAAqC,SAAS;AAEhD,MAAa,4BACX;AACF,MAAa,uBAAuB;;;ACDpC,SAAgB,wBAAwB,EACtC,YAGoB;CACpB,MAAM,EAAE,WAAW,iBAAiB;CACpC,MAAM,OAAO,cAAc,cAAc,OAAO;AAKhD,QACE,oBAAC,2BAAD;EAA2B,OALjB,cACJ,+BAA+B,QAAQ,KAAK,EAClD,CAAC,QAAQ,KAAK,CACf;EAGI;EACyB,CAAA;;;;ACOhC,MAAM,gBAGF;CACF,WAAW;EAAE,MAAM;EAAa,UAAU;EAAoB;CAC9D,WAAW;EAAE,MAAM;EAAa,UAAU;EAAoB;CAC9D,WAAW;EAAE,MAAM;EAAa,UAAU;EAAoB;CAC9D,SAAS;EAAE,MAAM;EAAW,UAAU;EAAkB;CACxD,WAAW,EAAE,MAAM,aAAa;CAChC,UAAU,EAAE,MAAM,aAAa;CAC/B,UAAU,EAAE,MAAM,aAAa;CAC/B,WAAW;EAAE,MAAM;EAAa,UAAU;EAAoB;CAC9D,SAAS;EAAE,MAAM;EAAW,UAAU;EAAqB;CAC3D,aAAa;EAAE,MAAM;EAAW,UAAU;EAAqB;CAC/D,YAAY;EAAE,MAAM;EAAW,UAAU;EAAqB;CAC/D;;;;;;;;AASD,SAAgB,UAAU,aAAqB,GAAoB;CACjE,MAAM,QAAQ,eAAe,eAAe,IAAI,aAAa;CAC7D,MAAM,WAAW,cACb,YAAY,OAAO,EAAE,CAAC,aAAa,GAAG,YAAY,MAAM,EAAE,GAC1D;AACJ,KAAI,CAAC,MAAO,QAAO;EAAE,MAAM;EAAW,OAAO;EAAU;AACvD,QAAO;EACL,MAAM,MAAM;EACZ,OAAO,MAAM,WAAW,EAAE,MAAM,SAAS,GAAG;EAC7C;;AAGH,MAAa,gBAGT;CACF,WAAW;EACT,IAAI;EACJ,MAAM;EACN,KAAK;EACN;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,KAAK;EACN;CACD,WAAW;EACT,IAAI;EACJ,MAAM;EACN,KAAK;EACN;CACD,SAAS;EACP,IAAI;EACJ,MAAM;EACN,KAAK;EACN;CACD,WAAW;EACT,IAAI;EACJ,MAAM;EACN,KAAK;EACN;CACF;AAED,SAAgB,gBACd,QACA,OACS;AACT,KAAI,WAAW,MAAO,QAAO;AAC7B,KAAI,WAAW,eAAgB,QAAO,MAAM,gBAAgB;CAE5D,MAAM,SAAS,UAAU,MAAM,cAAc,SAAS,CAAC;AACvD,KAAI,WAAW,YACb,QAAO,WAAW,eAAe,WAAW;AAC9C,KAAI,WAAW,YACb,QAAO,WAAW,eAAe,WAAW;AAC9C,QAAO;;AAGT,MAAM,aAAa,MAAc;AAEjC,SAAgB,cACd,MAC2B;AAC3B,QAAO;EACL,KAAK,KAAK;EACV,WAAW,KAAK,QAAQ,MAAM,gBAAgB,aAAa,EAAE,CAAC,CAAC;EAC/D,WAAW,KAAK,QAAQ,MAAM,gBAAgB,aAAa,EAAE,CAAC,CAAC;EAC/D,cAAc,KAAK,QAAQ,MAAM,gBAAgB,gBAAgB,EAAE,CAAC,CAAC;EACtE;;;;;;;;;;;;AAkBH,SAAgB,kBACd,MACA,GACA,sBAAY,IAAI,MAAM,EACR;AACd,KAAI,KAAK,WAAW,EAAG,QAAO,EAAE;CAChC,MAAM,eAAe,IAAI,KACvB,IAAI,aAAa,EACjB,IAAI,UAAU,EACd,IAAI,SAAS,CACd;CACD,MAAM,eAAe,IAAI,KAAK,aAAa;AAC3C,cAAa,QAAQ,aAAa,SAAS,GAAG,EAAE;CAChD,MAAM,eAAe,IAAI,KAAK,IAAI,aAAa,EAAE,IAAI,UAAU,EAAE,EAAE;CACnE,MAAM,cAAc,IAAI,KAAK,IAAI,aAAa,EAAE,GAAG,EAAE;CAErD,MAAM,0BAAU,IAAI,KAAiC;CACrD,MAAM,QAAkB,EAAE;AAE1B,MAAK,MAAM,KAAK,MAAM;EACpB,MAAM,UAAU,IAAI,KAAK,EAAE,WAAW;EACtC,IAAI;AACJ,MAAI,WAAW,aACb,SAAQ,EAAE,kBAAkB;WACnB,WAAW,aACpB,SAAQ,EAAE,mBAAmB;WACpB,WAAW,YACpB,SAAQ,QAAQ,mBAAmB,KAAA,GAAW,EAC5C,OAAO,QACR,CAAC;MAEF,SAAQ,QAAQ,mBAAmB,KAAA,GAAW;GAC5C,OAAO;GACP,MAAM;GACP,CAAC;EAEJ,IAAI,SAAS,QAAQ,IAAI,MAAM;AAC/B,MAAI,CAAC,QAAQ;AACX,YAAS,EAAE;AACX,WAAQ,IAAI,OAAO,OAAO;AAC1B,SAAM,KAAK,MAAM;;AAEnB,SAAO,KAAK,EAAE;;AAGhB,QAAO,MAAM,KAAK,WAAW;EAC3B;EACA,QAAQ,QAAQ,IAAI,MAAM,IAAI,EAAE;EACjC,EAAE;;;;;;;;;AAUL,SAAgB,mBACd,KACA,GACA,sBAAY,IAAI,MAAM,EACd;AACR,KAAI;EACF,MAAM,IAAI,IAAI,KAAK,IAAI;EACvB,MAAM,eAAe,IAAI,KACvB,IAAI,aAAa,EACjB,IAAI,UAAU,EACd,IAAI,SAAS,CACd;EACD,MAAM,cAAc,IAAI,KAAK,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC;EACxE,MAAM,WAAW,KAAK,OACnB,aAAa,SAAS,GAAG,YAAY,SAAS,KAAK,MAAO,KAAK,KAAK,IACtE;AAED,MAAI,aAAa,EAAG,QAAO,EAAE,QAAQ;AACrC,MAAI,aAAa,EAAG,QAAO,EAAE,YAAY;AACzC,MAAI,WAAW,EAAG,QAAO,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC;AACzD,MAAI,WAAW,GAAI,QAAO,EAAE,YAAY;AACxC,MAAI,WAAW,GAAI,QAAO,EAAE,eAAe,EAAE,GAAG,KAAK,MAAM,WAAW,EAAE,EAAE,CAAC;AAC3E,MAAI,EAAE,aAAa,KAAK,IAAI,aAAa,CACvC,QAAO,EAAE,mBAAmB,KAAA,GAAW;GACrC,OAAO;GACP,KAAK;GACN,CAAC;AAEJ,SAAO,EAAE,mBAAmB,KAAA,GAAW;GACrC,OAAO;GACP,KAAK;GACL,MAAM;GACP,CAAC;SACI;AACN,SAAO;;;;;;;;AASX,SAAgB,SACd,GACA,OACqD;AACrD,KAAI,MAAM,EACR,QAAO;EACL,MAAM;EACN,WAAW;EACX,QAAQ;EACT;AAEH,KAAI,MAAM,EACR,QAAO;EACL,MAAM;EACN,WACE,UAAU,IACN,kCACA;EACN,QAAQ;EACT;AAEH,QAAO;EACL,MAAM;EACN,WAAW;EACX,QAAQ;EACT;;;;AChOH,SAAgB,iBAAiB,EAC/B,YACA,cACA,GAAG,SACkC;CACrC,MAAM,EAAE,GAAG,aAAa,sBAAsB;CAC9C,MAAM,IAAI,SAAS;CAEnB,MAAM,CAAC,YAAY,iBAAiB,SAAS,GAAG;CAChD,MAAM,CAAC,QAAQ,aAAa,SAAoB,MAAM;CACtD,MAAM,EACJ,MACA,WACA,SACA,SACA,eACA,aACA,uBACE,0BACF;EACE;EACA,OAAO;EACP,QAAQ,cAAc,KAAA;EACtB,MAAM;EACP,EACD,EAAE,SAAS,CAAC,CAAC,YAAY,CAC1B;CAED,MAAM,OAAO,cACL,MAAM,MAAM,SAAS,MAAM,EAAE,OAAO,IAAI,EAAE,EAChD,CAAC,KAAK,CACP;CACD,MAAM,SAAS,cAAc,cAAc,KAAK,EAAE,CAAC,KAAK,CAAC;CACzD,MAAM,eAAe,cACb,KAAK,QAAQ,MAAM,gBAAgB,QAAQ,EAAE,CAAC,EACpD,CAAC,MAAM,OAAO,CACf;CACD,MAAM,SAAS,cACP,kBAAkB,cAAc,EAAE,EACxC,CAAC,cAAc,EAAE,CAClB;AAED,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,YAAD,EAAA,UACE,oBAAC,gBAAD;EAAgB,WAAU;YACxB,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;GAAgB,WAAU;aACvB,EAAE,gBAAgB;GACJ,CAAA,EACF,CAAA;EACF,CAAA,EACN,CAAA,EACW,CAAA,EAC1B,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,gBAAgB;MAChB,CAAA,EACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OACE,WAAU;OACV,aAAa;OACb,CAAA,EACF,oBAAC,OAAD;OACE,OAAO;OACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;OAC9C,aAAa,EAAE,gBAAgB;OAC/B,WAAU;OACV,CAAA,CACE;QACF;;IAEL,KAAK,SAAS,KACb,oBAAC,aAAD;KACE,QAAQ;KACA;KACR,UAAU;KACP;KACH,CAAA;IAGH,YACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,oBAAD,EAAsB,CAAA;KAClB,CAAA,GACJ,UACF,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,YAAD;MAAY,eAAe,SAAS;MAAK;MAAK,CAAA;KAC1C,CAAA,GACJ,aAAa,WAAW,IAC1B,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,YAAD;MAAY,WAAW,CAAC,CAAC,cAAc,WAAW;MAAU;MAAK,CAAA;KAC7D,CAAA,GAEN,oBAAC,OAAD;KAAK,WAAU;eACZ,OAAO,KAAK,UACX,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,OAAD;MAAK,WAAU;gBACZ,MAAM;MACH,CAAA,EACN,oBAAC,OAAD;MAAK,WAAU;gBACZ,MAAM,OAAO,KAAK,UACjB,oBAAC,UAAD;OAES;OACP,eAAe,aAAa,MAAM;OAC/B;OACH,EAJK,MAAM,GAIX,CACF;MACE,CAAA,CACF,EAAA,EAdI,MAAM,MAcV,CACN;KACE,CAAA;IAGP,eACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,UAAD;MACE,MAAK;MACL,eAAe,eAAe;MAC9B,UAAU;MACV,WAAU;gBAET,qBAAqB,EAAE,UAAU,GAAG,EAAE,YAAY;MAC5C,CAAA;KACL,CAAA;IAEJ;;EACF,CAAA,CACL,EAAA,CAAA;;AAMP,MAAM,cAOD;CACH;EAAE,KAAK;EAAO,UAAU;EAAc;CACtC;EAAE,KAAK;EAAa,UAAU;EAAoB;CAClD;EAAE,KAAK;EAAa,UAAU;EAAoB;CAClD;EAAE,KAAK;EAAgB,UAAU;EAAuB;CACzD;AAED,SAAS,YAAY,EACnB,QACA,QACA,UACA,KAMc;AACd,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,YAAY,KAAK,MAAM;GACtB,MAAM,WAAW,EAAE,QAAQ;GAC3B,MAAM,QAAQ,OAAO,EAAE;AACvB,UACE,qBAAC,UAAD;IAEE,MAAK;IACL,eAAe,SAAS,EAAE,IAAI;IAC9B,WAAW,4FACT,WACI,uCACA;cAPR,CAUG,EAAE,EAAE,SAAS,EACd,oBAAC,QAAD;KACE,WAAW,wBACT,WACI,+BACA;eAGL;KACI,CAAA,CACA;MAnBF,EAAE,IAmBA;IAEX;EACE,CAAA;;AAMV,SAAS,SAAS,EAChB,OACA,SACA,KAKc;CACd,MAAM,SAAS,UAAU,MAAM,cAAc,EAAE;CAC/C,MAAM,YAAY,mBAAmB,MAAM,YAAY,EAAE;CACzD,MAAM,QAAQ,iBAAiB,MAAM;CACrC,MAAM,YACJ,MAAM,YAAY,SAAS,GAAG,EAAE,eAAe,GAAG,MAAM;CAC1D,MAAM,cACJ,MAAM,cAAc,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,cAAc,GAAG,CAAC,GAAG;AAE1E,QACE,qBAAC,UAAD;EACE,MAAK;EACI;EACT,WAAU;YAHZ,CAKE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACG,WACA,eACC,oBAAC,QAAD;MAAM,WAAU;gBACb;MACI,CAAA,CAEL;QACN,oBAAC,YAAD,EAAoB,QAAU,CAAA,CAC1B;OACN,qBAAC,OAAD;IAAK,WAAU;cAAf;KACG;KAAU;KAAI;KACX;MACF;MACN,oBAAC,gBAAD;GACE,UAAU,MAAM;GAChB,MAAM,MAAM;GACZ,gBAAgB,MAAM,gBAAgB;GACnC;GACH,CAAA,CACK;;;AAIb,SAAS,eAAe,EACtB,MACA,UACA,gBACA,KAMc;CAGd,MAAM,aACJ,QAAQ,KAAK,SAAS,IAClB,OACA,UAAU,YACR,CAAC,SAAS,UAAU,GACpB,EAAE,EACR,MAAM,GAAG,EAAE;AAEb,KAAI,UAAU,WAAW,EACvB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,UAAD;GAAU,WAAU;GAAS,aAAa;GAAQ,CAAA,EACjD,kBAAkB,oBAAC,mBAAD,EAAsB,GAAK,CAAA,CAC1C;;AAIV,KAAI,UAAU,WAAW,EACvB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GACE,KAAK,UAAU;GACf,KAAI;GACJ,WAAU;GACV,CAAA,EACD,kBAAkB,oBAAC,mBAAD,EAAsB,GAAK,CAAA,CAC1C;;AAQV,QACE,qBAAC,OAAD;EAAK,WAAW,iBAFC,UAAU,WAAW,IAAI,aAAa,WAEX;YAA5C,CACG,UAAU,KAAK,KAAK,MACnB,oBAAC,OAAD;GAEE,KAAK;GACL,KAAI;GACJ,WAAU;GACV,OAAO,SAAS,GAAG,UAAU,OAAO;GACpC,EALK,GAAG,IAAI,GAAG,IAKf,CACF,EACD,kBAAkB,oBAAC,mBAAD,EAAsB,GAAK,CAAA,CAC1C;;;AAIV,SAAS,kBAAkB,EAAE,KAA4B;AACvD,QACE,oBAAC,OAAD;EACE,WAAU;EACV,OAAO,EAAE,oBAAoB;YAE7B,oBAAC,QAAD;GAAQ,WAAU;GAAW,aAAa;GAAQ,CAAA;EAC9C,CAAA;;AAIV,SAAS,WAAW,EAAE,UAAiD;CACrE,MAAM,SAAS,cAAc,OAAO;AACpC,QACE,qBAAC,QAAD;EACE,WAAW,wFAAwF,OAAO,GAAG,GAAG,OAAO;YADzH,CAGE,oBAAC,QAAD,EAAM,WAAW,yBAAyB,OAAO,OAAS,CAAA,EACzD,OAAO,MACH;;;AAIX,SAAS,qBAAkC;AACzC,QACE,oBAAA,YAAA,EAAA,UACG,MAAM,EAAE,CACN,KAAK,EAAE,CACP,KAAK,GAAG,MACP,qBAAC,OAAD;EAEE,WAAW,uCAAuC,IAAI,IAAI,2BAA2B;YAFvF,CAIE,oBAAC,OAAD,EAAK,WAAU,sDAAuD,CAAA,EACtE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD,EAAK,WAAU,4CAA6C,CAAA,EAC5D,oBAAC,OAAD,EAAK,WAAU,4CAA6C,CAAA,CACxD;KACF;IARC,EAQD,CACN,EACH,CAAA;;AAIP,SAAS,WAAW,EAClB,WACA,KAIc;AACd,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,QAAD;KAAQ,WAAU;KAA+B,aAAa;KAAK,CAAA;IAC/D,CAAA;GACN,oBAAC,OAAD;IAAK,WAAU;cACZ,YAAY,EAAE,qBAAqB,GAAG,EAAE,gBAAgB;IACrD,CAAA;GACN,oBAAC,OAAD;IAAK,WAAU;cACZ,YAAY,EAAE,cAAc,GAAG,EAAE,aAAa;IAC3C,CAAA;GACF;;;AAIV,SAAS,WAAW,EAClB,SACA,KAIc;AACd,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,aAAD;KAAa,WAAU;KAA+B,aAAa;KAAK,CAAA;IACpE,CAAA;GACN,oBAAC,OAAD;IAAK,WAAU;cACZ,EAAE,oBAAoB;IACnB,CAAA;GACN,oBAAC,OAAD;IAAK,WAAU;cACZ,EAAE,mBAAmB;IAClB,CAAA;GACN,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;cAET,EAAE,YAAY;IACR,CAAA;GACL;;;;;ACnbV,MAAM,yBAAyB;AAE/B,SAAgB,mBAAsC;CACpD,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,EAAE,MAAM,sBAAsB;CAEpC,MAAM,oBAAoB,UAA4B;AACpD,WAAS,UAAU,MAAM,QAAQ;;AAGnC,QACE,oBAAC,kBAAD;EACE,YAAY;EACZ,cAAc;EACX;EACH,CAAA;;;;ACTN,MAAM,cAA0C;CAC9C,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,MAAM;CACP;AAED,MAAM,iBAA6C;CACjD,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,MAAM;CACP;AAED,MAAM,aAAwC;CAC5C,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,SAAgB,YAAY,EAC1B,OACA,KACA,OAAO,MACP,WACA,YACmB;AACnB,QACE,qBAAC,QAAD;EACE,WAAW,GACT,wFACA,YAAY,QACZ,WAAW,OACX,UACD;YANH,CAQG,OACC,oBAAC,QAAD,EACE,WAAW,GAAG,4BAA4B,eAAe,OAAO,EAChE,CAAA,EAEH,SACI;;;;;AC1DX,SAAgB,UAAU,KAAwC;AAChE,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,aAAa,CAAC;;;;ACC9E,MAAM,iBAA6C;CACjD,MAAM;CACN,WAAW;CACX,WAAW;CACX,UAAU;CACV,SAAS;CACT,aAAa;CACb,qBAAqB;CACrB,YAAY;CACZ,UAAU;CACV,WAAW;CACX,QAAQ;CACR,QAAQ;CACT;AAOD,SAAgB,iBAAiB,EAAE,QAAQ,aAAoC;AAE7E,QACE,oBAAC,aAAD;EAAa,OAFD,eAAe,WAAW;EAEX,KAAA;EAAI,MAAK;EAAgB;YACjD,UAAU,OAAO;EACN,CAAA;;;;ACZlB,SAAgB,UAAU,EACxB,QACA,SACA,SACA,KACA,aACiB;CACjB,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,MAAM,kBAAkB,QAAQ,SAAS,QAAQ;AAEvD,KAAI,CAAC,OAAO,QAAS,QAAO;AAE5B,QACE,oBAAC,OAAD;EACE,KAAK;EACL,KAAK,OAAO,EAAE,uBAAuB;EACrC,OAAO,SAAS,SAAS;EACzB,QAAQ,SAAS,UAAU;EAC3B,WACE,aACA;EAEF,eAAe,WAAW,KAAK;EAC/B,CAAA;;;;AC9BN,MAAM,sBAA8C;CAClD,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,KAAK;CACL,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,SAAS;CACV;AAUD,SAAS,iBAAiB;AACxB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,UAAD,EAAU,WAAU,iBAAkB,CAAA;KACtC,oBAAC,OAAD;MAAK,WAAU;gBACb,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,mBAAoB,CAAA,EACxC,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,EAClC,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;UACF;;MACF,CAAA;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,cAAe,CAAA,EACnC,oBAAC,UAAD,EAAU,WAAU,cAAe,CAAA,CAC/B;;KACF;;GACF,CAAA,EACN,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,UAAD,EAAU,WAAU,4BAA6B,CAAA,EACjD,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,oBAAC,UAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;OACF;;GACF,CAAA,CACF;;;AAIV,SAAS,WAAW,EAAE,OAAO,SAA2C;AACtE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD;GAAG,WAAU;aAAyB;GAAU,CAAA,EAChD,oBAAC,KAAD;GAAG,WAAU;aAAmB;GAAU,CAAA,CACtC;;;;;;;;AASV,SAAS,WAAW,OAAuB;AACzC,QAAO,MAAM,WAAW,IAAI,GAAG,QAAQ,IAAI;;;;;;;AAQ7C,SAAS,aAAa,WAA0B,UAA0B;AACxE,QAAO,aAAa;;AAGtB,SAAS,mBAAmB,SAA+C;CACzE,MAAM,QAAkB,EAAE;AAC1B,KAAI,QAAQ,KAAM,OAAM,KAAK,QAAQ,KAAK;AAC1C,KAAI,QAAQ,SAAU,OAAM,KAAK,QAAQ,SAAS;AAClD,KAAI,QAAQ,SAAU,OAAM,KAAK,QAAQ,SAAS;CAClD,MAAM,WAAW;EAAC,QAAQ;EAAM,QAAQ;EAAO,QAAQ;EAAY,CAChE,OAAO,QAAQ,CACf,KAAK,KAAK;AACb,KAAI,SAAU,OAAM,KAAK,SAAS;AAClC,KAAI,QAAQ,aAAc,OAAM,KAAK,QAAQ,aAAa;AAC1D,QAAO;;AAGT,SAAS,aAAa,EACpB,SACA,SAIC;CACD,MAAM,QAAQ,mBAAmB,QAAQ;AACzC,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;EAAI,WAAU;YAAgD;EAAW,CAAA,EACzE,oBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,MAAM,UAChB,oBAAC,KAAD,EAAA,UAAgB,MAAS,EAAjB,MAAiB,CACzB;EACE,CAAA,CACF,EAAA,CAAA;;AAIV,SAAS,sBAAsB,EAC7B,kBAGC;CACD,MAAM,EAAE,MAAM,sBAAsB;AAIpC,KAAI,CAAC,eAAe,MAAO,QAAO;AAClC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,MAAD;GAAI,WAAU;aACX,EAAE,kBAAkB;GAClB,CAAA,EACL,oBAAC,KAAD;GAAG,WAAU;aAA2B,eAAe;GAAU,CAAA,CAC7D;;;AAIV,SAAS,qBAAqB,EAC5B,iBAGC;CACD,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EAAE,WAAW,UAAU;CAC7B,MAAM,QAAQ,YACV,UAAU,aAAa,GACtB,oBAAoB,cAAc,iBACnC,cAAc;CAClB,MAAM,QAAQ,QAAQ,EAAE,kBAAkB;EAAE;EAAO;EAAO,CAAC,GAAG;AAC9D,KAAI,CAAC,MAAO,QAAO;AACnB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,MAAD;GAAI,WAAU;aACX,EAAE,iBAAiB;GACjB,CAAA,EACL,oBAAC,KAAD;GAAG,WAAU;aAA2B;GAAU,CAAA,CAC9C;;;AAIV,SAAS,cAAc,EAAE,KAAK,OAAqC;CACjE,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;AAC7C,KAAI,QAAS,QAAO,oBAAC,QAAD;EAAM,WAAU;YAAW,EAAE,WAAW;EAAQ,CAAA;AACpE,QACE,oBAAC,OAAD;EACO;EACA;EACL,WAAU;EACV,eAAe,WAAW,KAAK;EAC/B,CAAA;;AAIN,SAAS,QAAQ,EACf,MACA,uBAIC;CACD,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,oBAAoB,KAAK,qBAAqB;AACpD,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,YACJ,oBAAC,eAAD;KAAe,KAAK,KAAK;KAAW,KAAK,KAAK;KAAgB,CAAA,GAE9D,oBAAC,QAAD;KAAM,WAAU;eAAW,EAAE,WAAW;KAAQ,CAAA;IAE9C,CAAA,EACL,KAAK,WAAW,KACf,oBAAC,QAAD;IAAM,WAAU;cACb,KAAK;IACD,CAAA,CAEL;MACN,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,KAAD;KACE,WAAU;KACV,OAAO,KAAK;eAEX,KAAK;KACJ,CAAA;IACH,KAAK,gBACJ,oBAAC,KAAD;KACE,WAAU;KACV,OAAO,KAAK;eAEX,KAAK;KACJ,CAAA;IAEN,oBAAC,KAAD;KAAG,WAAU;eACV,aAAa,KAAK,mBAAmB,KAAK,MAAM;KAC/C,CAAA;IACH,KAAK,WAAW,KACf,qBAAC,KAAD;KAAG,WAAU;eAAb;MACG,aAAa,KAAK,mBAAmB,KAAK,MAAM;MAAC;MAAI,KAAK;MACzD;;IAEL,qBAAqB,uBACpB,oBAAC,UAAD;KACE,MAAK;KACL,OAAO;KACP,WAAU;KACV,eAAe,oBAAoB,kBAAkB;eAEpD,EAAE,qBAAqB,EAAE,OAAO,mBAAmB,CAAC;KAC9C,CAAA;IAEP;KACF;;;AAIV,SAAS,aAAa,EACpB,OACA,uBAIC;CACD,MAAM,EAAE,MAAM,sBAAsB;AACpC,QACE,oBAAC,WAAD;EAAS,WAAU;YACjB,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,eAAe,EAAE,OAAO,OAAO,MAAM,WAAW,OAAO,EAAE,CAAC;MAC1D,CAAA,EACL,oBAAC,MAAD,EAAI,WAAU,iBAAkB,CAAA,CAC5B;;IAEN,oBAAC,OAAD;KAAK,WAAU;eACZ,MAAM,WAAW,KAAK,SACrB,oBAAC,SAAD;MAEQ;MACe;MACrB,EAHK,KAAK,GAGV,CACF;KACE,CAAA;IAEN,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,YAAD;OACE,OAAO,EAAE,WAAW;OACpB,OAAO,aAAa,MAAM,sBAAsB,MAAM,SAAS;OAC/D,CAAA;MACD,WAAW,MAAM,SAAS,GAAG,KAC5B,oBAAC,YAAD;OACE,OAAO,EAAE,WAAW;OACpB,OAAO,WACL,aAAa,MAAM,sBAAsB,MAAM,SAAS,CACzD;OACD,CAAA;MAEJ,oBAAC,YAAD;OACE,OAAO,EAAE,WAAW;OACpB,OAAO,aAAa,MAAM,sBAAsB,MAAM,SAAS;OAC/D,CAAA;MACF,oBAAC,YAAD;OACE,OAAO,EAAE,MAAM;OACf,OAAO,aAAa,MAAM,iBAAiB,MAAM,IAAI;OACrD,CAAA;MACF,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,QAAQ;QACT,CAAA,EACJ,oBAAC,KAAD;QAAG,WAAU;kBACV,aAAa,MAAM,mBAAmB,MAAM,MAAM;QACjD,CAAA,CACA;;MACF;;IAEL,MAAM,yBAAyB,QAC9B,MAAM,wBAAwB,KAC5B,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,gBAAgB;OACjB,CAAA,EACH,MAAM,2BAA2B,QAChC,oBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,gBAAgB,EACjB,OAAO,MAAM,wBAAwB,gBAAgB,EACtD,CAAC;OACA,CAAA,CAEF,EAAA,CAAA,EACN,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,qBAAC,KAAD;QAAG,WAAU;kBAAb,CAAqD,KACjD,MAAM,sBAAsB,gBAAgB,CAC5C;WACJ,oBAAC,KAAD;QAAG,WAAU;kBAAiC,EAAE,SAAS;QAAK,CAAA,CAC1D;SACF;;KACF,CAAA;IAEN;;EACE,CAAA;;AAId,SAAS,eAAe,EACtB,OACA,oBAIC;CACD,MAAM,EAAE,GAAG,WAAW,sBAAsB;AAC5C,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,OAAD;MAAK,WAAU;gBACb,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,QAAD;QAAM,WAAU;kBACb,EAAE,eAAe;QACb,CAAA,EACP,oBAAC,kBAAD,EAAkB,QAAQ,MAAM,QAAU,CAAA,CACtC;;MACF,CAAA;KACF,CAAA;IAEL,oBAAoB,MAAM,oBACzB,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,WAAD;MACE,QAAQ;MACR,SAAS,MAAM;MACf,CAAA;KACE,CAAA;IAIR,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,aAAa;OACb,CAAA;MACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oBAAC,OAAD;SAAK,WAAU;mBAAiC,EAAE,QAAQ;SAAO,CAAA,EACjE,qBAAC,OAAD;SAAK,WAAU;mBAAf,CAA6C,KAAE,MAAM,GAAS;WAC1D;WACN,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oBAAC,OAAD;SAAK,WAAU;mBAAiC,EAAE,OAAO;SAAO,CAAA,EAChE,oBAAC,OAAD;SAAK,WAAU;mBACZ,IAAI,KAAK,MAAM,WAAW,CAAC,mBAAmB,QAAQ;UACrD,MAAM;UACN,OAAO;UACP,KAAK;UACN,CAAC;SACE,CAAA,CACF;UACF;;MACL,MAAM,kBACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,OAAD;QAAK,WAAU;kBAAiC,EAAE,QAAQ;QAAO,CAAA,EACjE,oBAAC,OAAD;QAAK,WAAU;kBACZ,MAAM;QACH,CAAA,CACF;;MAEP,MAAM,iBACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,OAAD;QAAK,WAAU;kBACZ,EAAE,WAAW;QACV,CAAA,EACN,oBAAC,OAAD;QAAK,WAAU;kBACZ,MAAM;QACH,CAAA,CACF;;MAEJ;;IAEL,MAAM,oBAAoB,MAAM,kBAC/B,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,cAAD;MACE,SAAS,MAAM;MACf,OAAO,EAAE,mBAAmB;MAC5B,CAAA,EACF,oBAAC,cAAD;MACE,SAAS,MAAM;MACf,OAAO,EAAE,kBAAkB;MAC3B,CAAA,CACE;SAEN,MAAM,oBACJ,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,cAAD;MACE,SAAS,MAAM;MACf,OAAO,EAAE,mBAAmB;MAC5B,CAAA;KACE,CAAA;IAGT,MAAM,mBACL,oBAAC,uBAAD,EAAuB,gBAAgB,MAAM,iBAAmB,CAAA;IAEjE,MAAM,kBACL,oBAAC,sBAAD,EAAsB,eAAe,MAAM,gBAAkB,CAAA;IAE3D;;EACF,CAAA;;AAIV,SAAgB,kBAAkB,EAChC,IACA,kBACA,YACA,SACA,uBACyB;CACzB,MAAM,EAAE,MAAM,WAAW,UAAU,qBAAqB,GAAG;CAC3D,MAAM,QAAQ,MAAM;AAEpB,iBAAgB;AACd,MAAI,CAAC,aAAa,MAChB,WAAU,MAAe;IAE1B;EAAC;EAAW;EAAO;EAAQ,CAAC;AAE/B,iBAAgB;AACd,MAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAC3B,eAAc;IAEf;EAAC;EAAW;EAAO;EAAO;EAAW,CAAC;AAEzC,KAAI,UACF,QAAO,oBAAC,gBAAD,EAAkB,CAAA;AAG3B,KAAI,CAAC,MACH,QAAO;AAGT,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,cAAD;GAAqB;GAA4B;GAAuB,CAAA,EACxE,oBAAC,gBAAD;GAAuB;GAAyB;GAAoB,CAAA,CAChE;;;;;ACrcV,SAAgB,wBAAwB,EACtC,IACA,kBACA,kBACA,YACA,SACA,uBAC+B;CAC/B,MAAM,EAAE,MAAM,sBAAsB;AAEpC,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,YAAD,EAAA,UACE,qBAAC,gBAAD;EAAgB,WAAU;YAA1B;GACE,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;IACE,MAAK;IACL,UAAU,MAAM;AACd,OAAE,gBAAgB;AAClB,uBAAkB;;cAGnB,EAAE,aAAa;IACD,CAAA,EACF,CAAA;GACjB,oBAAC,qBAAD,EAAuB,CAAA;GACvB,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;IAAgB,WAAU;cACvB,EAAE,qBAAqB,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;IAC5B,CAAA,EACF,CAAA;GACF;KACN,CAAA,EACW,CAAA,EAC1B,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,mBAAD;GACM;GACc;GACN;GACH;GACY;GACrB,CAAA;EACE,CAAA,CACL,EAAA,CAAA;;;;ACzDP,SAAgB,kBAAkB,EAChC,OACA,WAC4C;CAC5C,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,EAAE,WAAW,iBAAiB;CACpC,MAAM,EAAE,MAAM,sBAAsB;AAEpC,QACE,oBAACC,yBAAD;EACE,IAAI;EACJ,kBAAkB,OAAO;EACzB,wBAAwB,SAAS,SAAS;EAC1C,kBAAkB;AAChB,WAAQ,EAAE,kBAAkB,EAAE,UAAU;AACxC,YAAS,SAAS;;EAEpB,UAAU,QAAQ;AAEhB,WAAQ,EAAE,uBAAuB,EAAE,SADnB,eAAe,QAAQ,IAAI,UAAU,EAAE,gBAAgB,EAC3B,CAAC,EAAE,QAAQ;;EAEzD,sBAAsB,sBACpB,SAAS,iBAAiB,oBAAoB;EAEhD,CAAA;;;;ACVN,SAAS,aAAa,SAAiB,MAAuC;AAC5E,YAAW;EAAE,OAAO;EAAS;EAAM,CAAC;;AAGtC,SAAgB,aAAa,EAC3B,SAEA,YACA,WACA,aACA,SACA,cAEA,GAAG,YACoC;CACvC,MAAM,EAAE,gBAAgB,kBAAkB;CAC1C,MAAM,iBAAiB,WAAW;CAGlC,MAAM,cAAc,YAAY,MAAM,IAAI,CAAC;AAG3C,KAFqB,gBAAgB,KAAA,EAGnC,QACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,yBAAD,EAAA,UACE,oBAAC,mBAAD;GAAmB,OAAO;GAAa,SAAS;GAAkB,CAAA,EAC1C,CAAA;EACtB,CAAA,EACkB,CAAA;AAI9B,QACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,yBAAD,EAAA,UACE,oBAAC,kBAAD,EAAoB,CAAA,EACI,CAAA;EACtB,CAAA,EACkB,CAAA;;AAI9B,MAAa,6BAAmD;CAC9D,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PortalTenantClientProvider-BmRtQAbi.mjs","names":[],"sources":["../../core/src/account-api-context.ts","../../../api-clients/portal-tenant/src/namespaces/portal_tenant.ts","../../../api-clients/portal-tenant-content/src/namespaces/portal_tenant_content.ts","../src/providers/PortalTenantClientProvider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AccountApi } from \"./account-api\";\n\nconst AccountApiContext = createContext<AccountApi | null>(null);\n\nexport const AccountApiProvider = AccountApiContext.Provider;\n\nexport function useAccountApi(): AccountApi {\n const api = useContext(AccountApiContext);\n if (!api) {\n throw new Error(\"useAccountApi must be used within an AccountApiProvider\");\n }\n return api;\n}\n","/**\n * Generated API client functions for portal_tenant\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant\";\n\n// ============================================================================\n// account\n// ============================================================================\n\n/**\n * Get current account\n * Returns the authenticated member's account profile and company context. This is the primary endpoint the SPA calls to check auth status and display user information.\n *\n * @param client - Fetch client instance\n \n */\nexport async function account_show(\n client: FetchClient,\n): Promise<\n operations[\"account_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/account`);\n}\n\n/**\n * Update current account\n * Updates the authenticated member's profile fields such as name, phone, bio, avatar, and social links.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function account_update(\n client: FetchClient,\n body: operations[\"account_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"account_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/account`, body);\n}\n\n// ============================================================================\n// store\n// ============================================================================\n\n/**\n * Get store branding and feature flags\n * Returns the tenant company's store branding (logo, icon, app store URLs) and feature flags such as whether subscription bundling is enabled.\n *\n * @param client - Fetch client instance\n \n */\nexport async function store_show(\n client: FetchClient,\n): Promise<\n operations[\"store_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/store`);\n}\n\n// ============================================================================\n// app\n// ============================================================================\n\n/**\n * Get the app manifest\n * Returns the rendered manifest for the tenant company's active FluidOS definition, matched against the current user's country, rank, and roles.\n *\n * @param client - Fetch client instance\n \n */\nexport async function app_manifest_show(\n client: FetchClient,\n): Promise<\n operations[\"app_manifest_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/app/manifest`);\n}\n\n// ============================================================================\n// calendar_events\n// ============================================================================\n\n/**\n * List calendar events\n * Returns a paginated list of upcoming and ongoing calendar events for the tenant company, optionally filtered by the authenticated member's country when one is set.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function calendar_events_list(\n client: FetchClient,\n params?: operations[\"calendar_events_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"calendar_events_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/calendar/events`, params);\n}\n\n// ============================================================================\n// activities\n// ============================================================================\n\n/**\n * List recent activities\n * Returns a paginated list of recent activities for the authenticated member, ordered by most recent first. Each activity includes pre-computed user_name and target_name fields ready for direct rendering by the portal SPA.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function activities_list(\n client: FetchClient,\n params?: operations[\"activities_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"activities_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/activities`, params);\n}\n\n// ============================================================================\n// catch_ups\n// ============================================================================\n\n/**\n * List catch-up suggestions\n * Returns a paginated list of catch-up suggestions for the authenticated member. Limited to suggestions with at least one pending action that have not expired.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function catch_ups_list(\n client: FetchClient,\n params?: operations[\"catch_ups_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"catch_ups_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/catch_ups`, params);\n}\n\n// ============================================================================\n// orders\n// ============================================================================\n\n/**\n * List orders\n * Returns a paginated list of orders placed through the tenant company, optionally filtered by status.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function orders_list(\n client: FetchClient,\n params?: operations[\"orders_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"orders_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/orders`, params);\n}\n\n/**\n * Get an order\n * Returns a single order by token with its line items.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function orders_show(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"orders_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/orders/${token}`);\n}\n\n// ============================================================================\n// products\n// ============================================================================\n\n/**\n * List products\n * Returns a paginated list of products available in the tenant company's catalog. Supports sorting and filtering by title, product type, collection, and stock availability.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function products_list(\n client: FetchClient,\n params?: operations[\"products_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"products_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products`, params);\n}\n\n/**\n * Get a product\n * Returns a single product by ID with its variants.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function products_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"products_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/${id}`);\n}\n\n/**\n * Search products\n * Searches the tenant company's product catalog by keyword, returning paginated results.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function products_search(\n client: FetchClient,\n params?: operations[\"products_search\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"products_search\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/search`, params);\n}\n\n/**\n * List product media\n * Returns all media (images, videos) attached to a product.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function products_media_list(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"products_media_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/${id}/media`);\n}\n\n// ============================================================================\n// enrollment_packs\n// ============================================================================\n\n/**\n * List enrollment packs\n * Returns a paginated list of active, non-discarded enrollment packs scoped to the current portal tenant's company. Each pack carries an empty `products` array — fetch a single pack via `/api/enrollment_packs/{id}` to load its visible products.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_packs_list(\n client: FetchClient,\n params?: operations[\"enrollment_packs_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_packs_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs`, params);\n}\n\n/**\n * Get an enrollment pack\n * Returns a single active, non-discarded enrollment pack scoped to the current portal tenant's company.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function enrollment_packs_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"enrollment_packs_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/${id}`);\n}\n\n// ============================================================================\n// subscriptions\n// ============================================================================\n\n/**\n * List subscription bundles\n * Returns the runtime bundle groupings for the authenticated customer's active subscriptions. Bundles are computed at request time by grouping subscriptions that share customer, address (physical only), volume rep, next bill date, and digital flag — they have no persistent id. The response is unpaginated; customers typically have a small number of bundles.\n *\n * @param client - Fetch client instance\n \n */\nexport async function subscription_bundles_list(\n client: FetchClient,\n): Promise<\n operations[\"subscription_bundles_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscription_bundles`);\n}\n\n/**\n * List subscriptions\n * Returns a paginated list of the member's active and historical subscriptions. Supports filtering by lifecycle state and a free-text search across product and plan names.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function subscriptions_list(\n client: FetchClient,\n params?: operations[\"subscriptions_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"subscriptions_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscriptions`, params);\n}\n\n/**\n * Get a subscription\n * Returns a single subscription by its token.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_show(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscriptions/${token}`);\n}\n\n/**\n * Update a subscription\n * Updates a subscription's default payment method or quantity.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param body - body\n */\nexport async function subscriptions_update(\n client: FetchClient,\n token: string | number,\n body: operations[\"subscriptions_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/subscriptions/${token}`, body);\n}\n\n/**\n * Pause a subscription\n * Pauses billing on an active subscription. When neither `next_bill_date` nor `number_of_orders` is provided, the subscription is paused indefinitely. Specifying both is rejected.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param [body] - body\n */\nexport async function subscriptions_pause(\n client: FetchClient,\n token: string | number,\n body?: NonNullable<\n operations[\"subscriptions_pause\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_pause\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/pause`, body);\n}\n\n/**\n * Resume a subscription\n * Resumes billing on a paused subscription. When `next_bill_date` is omitted, the plan's next bill date from today is used.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param [body] - body\n */\nexport async function subscriptions_resume(\n client: FetchClient,\n token: string | number,\n body?: NonNullable<\n operations[\"subscriptions_resume\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_resume\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/resume`, body);\n}\n\n/**\n * Skip next billing cycle\n * Skips the next billing cycle for a subscription without pausing it.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_skip(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_skip\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/skip_next_billing`);\n}\n\n/**\n * Cancel a subscription\n * Cancels an active subscription.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_cancel(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_cancel\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/cancel`);\n}\n\n/**\n * Reactivate a subscription\n * Reactivates a previously cancelled subscription.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_reactivate(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_reactivate\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/reactivate`);\n}\n\n/**\n * Retry billing on a past-due subscription\n * Queues an immediate retry on a past-due subscription against whatever payment method is currently on file. The customer-facing UI calls this after a successful payment-method update so the customer controls when the retry runs (vs. having it implicitly fire as a side-effect of the update).\n\n\nThe endpoint returns 200 for found subscriptions in normal operation, regardless of status — it is intentionally idempotent so the client can call it unconditionally after a payment-method update without first checking status. A 422 can still be returned if the server cannot persist the retry state. Use the response's `queued` field to distinguish the two outcomes:\n\n - `queued: true` — the subscription was past_due; a retry has been scheduled and `next_retry_at` is set to \"now\".\n - `queued: false` — the subscription was not past_due and no state change occurred. Treat as a no-op.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_retry(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_retry\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/retry`);\n}\n\n// ============================================================================\n// subscription_bundles\n// ============================================================================\n\n/**\n * Create a subscription bundle\n * Bundles two or more existing subscriptions onto a shared bill date, address, and volume rep. All subscriptions must belong to the authenticated customer. Bundles are not persisted entities — the endpoint aligns each subscription's billing attributes so that they share a runtime grouping key.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function subscription_bundles_create(\n client: FetchClient,\n body: operations[\"subscription_bundles_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscription_bundles_create\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscription_bundles/bundle`, body);\n}\n\n// ============================================================================\n// todos\n// ============================================================================\n\n/**\n * List todos\n * Returns a paginated list of incomplete tasks scoped to the authenticated member. Ordered by due date ascending, tasks without a due date sort last.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function todos_list(\n client: FetchClient,\n params?: operations[\"todos_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"todos_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/todos`, params);\n}\n\n/**\n * Toggle a todo's completion state\n * Marks a todo complete or incomplete for the authenticated member. Sending `completed: true` stamps `completed_at` with the current time; `false` clears it.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function todos_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"todos_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"todos_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/todos/${id}`, body);\n}\n\n// ============================================================================\n// carts\n// ============================================================================\n\n/**\n * Claim a cart\n * Assigns the logged-in member as buyer_rep on an unclaimed FairShare cart. Any portal member (rep or customer) can claim. Returns an error if the cart has already been claimed.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function carts_claim(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"carts_claim\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/carts/${token}/claim`);\n}\n\n// ============================================================================\n// product_metrics\n// ============================================================================\n\n/**\n * Top products by direct visits\n * Ranked list of the company's products by total visits to the product page (aggregates metrics_product_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function product_by_visits(\n client: FetchClient,\n params?: operations[\"product_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"product_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/by-visits`, params);\n}\n\n/**\n * Top products by share-link visits\n * Ranked list of the company's products by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Product').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function product_by_shares(\n client: FetchClient,\n params?: operations[\"product_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"product_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/by-shares`, params);\n}\n\n// ============================================================================\n// enrollment_pack_metrics\n// ============================================================================\n\n/**\n * Top enrollment packs by direct visits\n * Ranked list of the company's enrollment packs by total visits to the pack page (aggregates metrics_enrollment_pack_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_pack_by_visits(\n client: FetchClient,\n params?: operations[\"enrollment_pack_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_pack_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/by-visits`, params);\n}\n\n/**\n * Top enrollment packs by share-link visits\n * Ranked list of the company's enrollment packs by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='EnrollmentPack').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_pack_by_shares(\n client: FetchClient,\n params?: operations[\"enrollment_pack_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_pack_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/by-shares`, params);\n}\n","/**\n * Generated API client functions for portal_tenant_content\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant-content\";\n\n// ============================================================================\n// content\n// ============================================================================\n\n/**\n * List active languages for the tenant company\n * Returns active languages enabled for the tenant company, sorted by name. Used by the content/translation editor to populate the language switcher.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_languages_list(\n client: FetchClient,\n params?: operations[\"content_languages_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_languages_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/languages`, params);\n}\n\n/**\n * List media (own uploads and company share media)\n * Returns a paginated list of the member's own uploads and company share media. Training and update media are excluded.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function media_list(\n client: FetchClient,\n params?: operations[\"media_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media`, params);\n}\n\n/**\n * Create a new media item\n * Creates a new media item record.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function media_create(\n client: FetchClient,\n body: operations[\"media_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"media_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/media`, body);\n}\n\n/**\n * Get a specific media item\n * Returns a single media item by ID. When language_iso is provided, translatable fields (title, description, url) are returned for that language with no fallback — empty values indicate an untranslated field.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param [params] - params\n */\nexport async function media_show(\n client: FetchClient,\n id: string | number,\n params?: operations[\"media_show\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/${id}`, params);\n}\n\n/**\n * Update a media item (own uploads only)\n * Updates a media item's title, description, status, url, content_format, thumbnail, CTA, and SEO. When language_iso is provided, translatable fields are written against that language's translation row instead of the default locale.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n * @param [params] - params\n */\nexport async function media_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"media_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n params?: operations[\"media_update\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/media/${id}`, body, { params });\n}\n\n/**\n * Delete a media item (own uploads only)\n * Removes a media item.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function media_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"media_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/media/${id}`);\n}\n\n/**\n * List products associated with a media item\n * Returns a paginated list of products associated with a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param [params] - params\n */\nexport async function media_products_list(\n client: FetchClient,\n medium_id: string | number,\n params?: operations[\"media_products_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_products_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/${medium_id}/products`, params);\n}\n\n/**\n * Associate a product with a media item\n * Creates a product association for a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param body - body\n */\nexport async function media_products_add(\n client: FetchClient,\n medium_id: string | number,\n body: operations[\"media_products_add\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"media_products_add\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/media/${medium_id}/products`, body);\n}\n\n/**\n * Remove a product association from a media item\n * Removes a single product association from a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param id - id\n */\nexport async function media_products_remove(\n client: FetchClient,\n medium_id: string | number,\n id: string | number,\n): Promise<\n operations[\"media_products_remove\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/media/${medium_id}/products/${id}`);\n}\n\n/**\n * List playlists with cursor pagination\n * Returns a paginated list of playlists.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function playlists_list(\n client: FetchClient,\n params?: operations[\"playlists_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"playlists_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists`, params);\n}\n\n/**\n * Create a new playlist\n * Creates a new playlist.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function playlists_create(\n client: FetchClient,\n body: operations[\"playlists_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/playlists`, body);\n}\n\n/**\n * Get a specific playlist\n * Returns a single playlist by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function playlists_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"playlists_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/${id}`);\n}\n\n/**\n * Update a playlist\n * Updates a playlist's title or metadata.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function playlists_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"playlists_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/playlists/${id}`, body);\n}\n\n/**\n * Delete a playlist\n * Removes a playlist.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function playlists_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"playlists_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/playlists/${id}`);\n}\n\n/**\n * List items in a playlist\n * Returns a paginated list of items in a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param [params] - params\n */\nexport async function playlists_items_list(\n client: FetchClient,\n playlist_id: string | number,\n params?: operations[\"playlists_items_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"playlists_items_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/${playlist_id}/items`, params);\n}\n\n/**\n * Add an item to a playlist\n * Adds a content item (media, page, product, or enrollment_pack) to a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param body - body\n */\nexport async function playlists_items_add(\n client: FetchClient,\n playlist_id: string | number,\n body: operations[\"playlists_items_add\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_items_add\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/playlists/${playlist_id}/items`, body);\n}\n\n/**\n * Reorder items in a playlist\n * Sets the order of items in a playlist. Items not included in the payload are not moved. Flips the playlist to manual ordering.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param body - body\n */\nexport async function playlists_items_reorder(\n client: FetchClient,\n playlist_id: string | number,\n body: operations[\"playlists_items_reorder\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_items_reorder\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(\n `/api/content/playlists/${playlist_id}/items/reorder`,\n body,\n );\n}\n\n/**\n * Remove an item from a playlist\n * Removes a single item from a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param id - id\n */\nexport async function playlists_items_remove(\n client: FetchClient,\n playlist_id: string | number,\n id: string | number,\n): Promise<\n operations[\"playlists_items_remove\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/playlists/${playlist_id}/items/${id}`);\n}\n\n/**\n * List pages for the company\n * Returns a paginated list of published pages for the authenticated rep's company. Members have read-only access — there is no create, update, or destroy action for pages in the portal BFF. Response shape matches pages_show (PortalTenant::Api::PageBlueprinter).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function pages_list(\n client: FetchClient,\n params?: operations[\"pages_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"pages_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages`, params);\n}\n\n/**\n * Get a specific page\n * Returns a single page by ID, scoped to the authenticated rep's company. Response is a lean portal-BFF shape rendered by PortalTenant::Api::PageBlueprinter — not the legacy admin shape. Admin-only fields (html_code, application_theme_template, search_engine_optimizer, open_graph, prompts, etc.) are intentionally omitted.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function pages_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"pages_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/${id}`);\n}\n\n/**\n * List share links for the current user\n * Returns a paginated list of share links.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function shares_list(\n client: FetchClient,\n params?: operations[\"shares_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"shares_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/shares`, params);\n}\n\n/**\n * Create a share link\n * Creates a new share link for content.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function shares_create(\n client: FetchClient,\n body: operations[\"shares_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"shares_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/shares`, body);\n}\n\n/**\n * List DAM assets\n * Returns a paginated list of DAM assets for the company.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function dam_assets_list(\n client: FetchClient,\n params?: operations[\"dam_assets_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"dam_assets_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/dam/assets`, params);\n}\n\n/**\n * Create a DAM asset\n * Creates a new DAM asset. Supports two modes:\n1. **JSON placeholder** — send `application/json` with `asset[name]` to\n create a placeholder record for later file upload.\n\n2. **File upload** — send `multipart/form-data` with `asset[file]`,\n `asset[name]`, and optionally `asset[description]` and `asset[tags]`\n to upload a file and create the full asset with variants.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function dam_assets_create(\n client: FetchClient,\n body: operations[\"dam_assets_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_assets_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/assets`, body);\n}\n\n/**\n * List paths for a DAM asset\n * Returns a paginated list of path aliases for a DAM asset.\n *\n * @param client - Fetch client instance\n * @param asset_code - asset_code\n * @param [params] - params\n */\nexport async function dam_asset_paths_list(\n client: FetchClient,\n asset_code: string | number,\n params?: operations[\"dam_asset_paths_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"dam_asset_paths_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/dam/assets/${asset_code}/paths`, params);\n}\n\n/**\n * Create a path alias for a DAM asset\n * Creates a new path alias for an existing DAM asset.\n *\n * @param client - Fetch client instance\n * @param asset_code - asset_code\n * @param body - body\n */\nexport async function dam_asset_paths_create(\n client: FetchClient,\n asset_code: string | number,\n body: operations[\"dam_asset_paths_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_asset_paths_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/assets/${asset_code}/paths`, body);\n}\n\n/**\n * Query DAM assets using tree paths and tags\n * Searches and retrieves DAM assets using tree path pattern matching, tag-based variant filtering, wildcard name matching, and partial search. Supports cursor pagination for large result sets.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function dam_query(\n client: FetchClient,\n body: operations[\"dam_query\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_query\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/query`, body);\n}\n\n/**\n * Delete a DAM asset\n * Permanently destroys a DAM asset, including its ImageKit storage, variants, and database records.\n *\n * @param client - Fetch client instance\n * @param code - code\n */\nexport async function dam_assets_destroy(\n client: FetchClient,\n code: string | number,\n): Promise<\n operations[\"dam_assets_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/dam/assets/${code}`);\n}\n\n/**\n * Discard (soft-delete) a DAM asset\n * Soft-deletes a DAM asset. Used to discard an in-progress upload without permanently removing the record.\n *\n * @param client - Fetch client instance\n * @param code - code\n */\nexport async function dam_assets_discard(\n client: FetchClient,\n code: string | number,\n): Promise<\n operations[\"dam_assets_discard\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/dam/assets/${code}/discard`);\n}\n\n/**\n * Toggle favorite status on a content item\n * Toggles the favorite status of a content item for the authenticated member. If the item is not currently favorited, it becomes favorited. If it is already favorited, the favorite is removed.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function favorites_toggle(\n client: FetchClient,\n body: operations[\"favorites_toggle\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"favorites_toggle\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/favorites/toggle`, body);\n}\n\n// ============================================================================\n// media_metrics\n// ============================================================================\n\n/**\n * Top media by direct visits\n * Ranked list of the company's media by total visits (aggregates metrics_media_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_media_by_visits(\n client: FetchClient,\n params?: operations[\"content_media_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_media_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/by-visits`, params);\n}\n\n/**\n * Top media by share-link visits\n * Ranked list of the company's media by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Medium').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_media_by_shares(\n client: FetchClient,\n params?: operations[\"content_media_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_media_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/by-shares`, params);\n}\n\n// ============================================================================\n// playlist_metrics\n// ============================================================================\n\n/**\n * Top playlists by direct visits\n * Ranked list of the company's playlists by total visits (aggregates metrics_library_visits since playlists are stored in the libraries table).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_playlists_by_visits(\n client: FetchClient,\n params?: operations[\"content_playlists_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_playlists_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/by-visits`, params);\n}\n\n/**\n * Top playlists by share-link visits\n * Ranked list of the company's playlists by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Library').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_playlists_by_shares(\n client: FetchClient,\n params?: operations[\"content_playlists_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_playlists_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/by-shares`, params);\n}\n\n// ============================================================================\n// page_metrics\n// ============================================================================\n\n/**\n * Top pages by direct visits\n * Ranked list of the company's pages by total visits (aggregates metrics_page_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_pages_by_visits(\n client: FetchClient,\n params?: operations[\"content_pages_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_pages_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/by-visits`, params);\n}\n\n/**\n * Top pages by share-link visits\n * Ranked list of the company's pages by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Page').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_pages_by_shares(\n client: FetchClient,\n params?: operations[\"content_pages_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_pages_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/by-shares`, params);\n}\n","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":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PortalTenantClientProvider-Bpm-CZq1.cjs","names":[],"sources":["../../core/src/account-api-context.ts","../../../api-clients/portal-tenant/src/namespaces/portal_tenant.ts","../../../api-clients/portal-tenant-content/src/namespaces/portal_tenant_content.ts","../src/providers/PortalTenantClientProvider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AccountApi } from \"./account-api\";\n\nconst AccountApiContext = createContext<AccountApi | null>(null);\n\nexport const AccountApiProvider = AccountApiContext.Provider;\n\nexport function useAccountApi(): AccountApi {\n const api = useContext(AccountApiContext);\n if (!api) {\n throw new Error(\"useAccountApi must be used within an AccountApiProvider\");\n }\n return api;\n}\n","/**\n * Generated API client functions for portal_tenant\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant\";\n\n// ============================================================================\n// account\n// ============================================================================\n\n/**\n * Get current account\n * Returns the authenticated member's account profile and company context. This is the primary endpoint the SPA calls to check auth status and display user information.\n *\n * @param client - Fetch client instance\n \n */\nexport async function account_show(\n client: FetchClient,\n): Promise<\n operations[\"account_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/account`);\n}\n\n/**\n * Update current account\n * Updates the authenticated member's profile fields such as name, phone, bio, avatar, and social links.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function account_update(\n client: FetchClient,\n body: operations[\"account_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"account_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/account`, body);\n}\n\n// ============================================================================\n// store\n// ============================================================================\n\n/**\n * Get store branding and feature flags\n * Returns the tenant company's store branding (logo, icon, app store URLs) and feature flags such as whether subscription bundling is enabled.\n *\n * @param client - Fetch client instance\n \n */\nexport async function store_show(\n client: FetchClient,\n): Promise<\n operations[\"store_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/store`);\n}\n\n// ============================================================================\n// app\n// ============================================================================\n\n/**\n * Get the app manifest\n * Returns the rendered manifest for the tenant company's active FluidOS definition, matched against the current user's country, rank, and roles.\n *\n * @param client - Fetch client instance\n \n */\nexport async function app_manifest_show(\n client: FetchClient,\n): Promise<\n operations[\"app_manifest_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/app/manifest`);\n}\n\n// ============================================================================\n// calendar_events\n// ============================================================================\n\n/**\n * List calendar events\n * Returns a paginated list of upcoming and ongoing calendar events for the tenant company, optionally filtered by the authenticated member's country when one is set.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function calendar_events_list(\n client: FetchClient,\n params?: operations[\"calendar_events_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"calendar_events_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/calendar/events`, params);\n}\n\n// ============================================================================\n// activities\n// ============================================================================\n\n/**\n * List recent activities\n * Returns a paginated list of recent activities for the authenticated member, ordered by most recent first. Each activity includes pre-computed user_name and target_name fields ready for direct rendering by the portal SPA.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function activities_list(\n client: FetchClient,\n params?: operations[\"activities_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"activities_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/activities`, params);\n}\n\n// ============================================================================\n// catch_ups\n// ============================================================================\n\n/**\n * List catch-up suggestions\n * Returns a paginated list of catch-up suggestions for the authenticated member. Limited to suggestions with at least one pending action that have not expired.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function catch_ups_list(\n client: FetchClient,\n params?: operations[\"catch_ups_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"catch_ups_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/catch_ups`, params);\n}\n\n// ============================================================================\n// orders\n// ============================================================================\n\n/**\n * List orders\n * Returns a paginated list of orders placed through the tenant company, optionally filtered by status.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function orders_list(\n client: FetchClient,\n params?: operations[\"orders_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"orders_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/orders`, params);\n}\n\n/**\n * Get an order\n * Returns a single order by token with its line items.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function orders_show(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"orders_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/orders/${token}`);\n}\n\n// ============================================================================\n// products\n// ============================================================================\n\n/**\n * List products\n * Returns a paginated list of products available in the tenant company's catalog. Supports sorting and filtering by title, product type, collection, and stock availability.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function products_list(\n client: FetchClient,\n params?: operations[\"products_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"products_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products`, params);\n}\n\n/**\n * Get a product\n * Returns a single product by ID with its variants.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function products_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"products_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/${id}`);\n}\n\n/**\n * Search products\n * Searches the tenant company's product catalog by keyword, returning paginated results.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function products_search(\n client: FetchClient,\n params?: operations[\"products_search\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"products_search\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/search`, params);\n}\n\n/**\n * List product media\n * Returns all media (images, videos) attached to a product.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function products_media_list(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"products_media_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/${id}/media`);\n}\n\n// ============================================================================\n// enrollment_packs\n// ============================================================================\n\n/**\n * List enrollment packs\n * Returns a paginated list of active, non-discarded enrollment packs scoped to the current portal tenant's company. Each pack carries an empty `products` array — fetch a single pack via `/api/enrollment_packs/{id}` to load its visible products.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_packs_list(\n client: FetchClient,\n params?: operations[\"enrollment_packs_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_packs_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs`, params);\n}\n\n/**\n * Get an enrollment pack\n * Returns a single active, non-discarded enrollment pack scoped to the current portal tenant's company.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function enrollment_packs_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"enrollment_packs_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/${id}`);\n}\n\n// ============================================================================\n// subscriptions\n// ============================================================================\n\n/**\n * List subscription bundles\n * Returns the runtime bundle groupings for the authenticated customer's active subscriptions. Bundles are computed at request time by grouping subscriptions that share customer, address (physical only), volume rep, next bill date, and digital flag — they have no persistent id. The response is unpaginated; customers typically have a small number of bundles.\n *\n * @param client - Fetch client instance\n \n */\nexport async function subscription_bundles_list(\n client: FetchClient,\n): Promise<\n operations[\"subscription_bundles_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscription_bundles`);\n}\n\n/**\n * List subscriptions\n * Returns a paginated list of the member's active and historical subscriptions. Supports filtering by lifecycle state and a free-text search across product and plan names.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function subscriptions_list(\n client: FetchClient,\n params?: operations[\"subscriptions_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"subscriptions_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscriptions`, params);\n}\n\n/**\n * Get a subscription\n * Returns a single subscription by its token.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_show(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/subscriptions/${token}`);\n}\n\n/**\n * Update a subscription\n * Updates a subscription's default payment method or quantity.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param body - body\n */\nexport async function subscriptions_update(\n client: FetchClient,\n token: string | number,\n body: operations[\"subscriptions_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/subscriptions/${token}`, body);\n}\n\n/**\n * Pause a subscription\n * Pauses billing on an active subscription. When neither `next_bill_date` nor `number_of_orders` is provided, the subscription is paused indefinitely. Specifying both is rejected.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param [body] - body\n */\nexport async function subscriptions_pause(\n client: FetchClient,\n token: string | number,\n body?: NonNullable<\n operations[\"subscriptions_pause\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_pause\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/pause`, body);\n}\n\n/**\n * Resume a subscription\n * Resumes billing on a paused subscription. When `next_bill_date` is omitted, the plan's next bill date from today is used.\n *\n * @param client - Fetch client instance\n * @param token - token\n * @param [body] - body\n */\nexport async function subscriptions_resume(\n client: FetchClient,\n token: string | number,\n body?: NonNullable<\n operations[\"subscriptions_resume\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscriptions_resume\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/resume`, body);\n}\n\n/**\n * Skip next billing cycle\n * Skips the next billing cycle for a subscription without pausing it.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_skip(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_skip\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/skip_next_billing`);\n}\n\n/**\n * Cancel a subscription\n * Cancels an active subscription.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_cancel(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_cancel\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/cancel`);\n}\n\n/**\n * Reactivate a subscription\n * Reactivates a previously cancelled subscription.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_reactivate(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_reactivate\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/reactivate`);\n}\n\n/**\n * Retry billing on a past-due subscription\n * Queues an immediate retry on a past-due subscription against whatever payment method is currently on file. The customer-facing UI calls this after a successful payment-method update so the customer controls when the retry runs (vs. having it implicitly fire as a side-effect of the update).\n\n\nThe endpoint returns 200 for found subscriptions in normal operation, regardless of status — it is intentionally idempotent so the client can call it unconditionally after a payment-method update without first checking status. A 422 can still be returned if the server cannot persist the retry state. Use the response's `queued` field to distinguish the two outcomes:\n\n - `queued: true` — the subscription was past_due; a retry has been scheduled and `next_retry_at` is set to \"now\".\n - `queued: false` — the subscription was not past_due and no state change occurred. Treat as a no-op.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function subscriptions_retry(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"subscriptions_retry\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscriptions/${token}/retry`);\n}\n\n// ============================================================================\n// subscription_bundles\n// ============================================================================\n\n/**\n * Create a subscription bundle\n * Bundles two or more existing subscriptions onto a shared bill date, address, and volume rep. All subscriptions must belong to the authenticated customer. Bundles are not persisted entities — the endpoint aligns each subscription's billing attributes so that they share a runtime grouping key.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function subscription_bundles_create(\n client: FetchClient,\n body: operations[\"subscription_bundles_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"subscription_bundles_create\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/subscription_bundles/bundle`, body);\n}\n\n// ============================================================================\n// todos\n// ============================================================================\n\n/**\n * List todos\n * Returns a paginated list of incomplete tasks scoped to the authenticated member. Ordered by due date ascending, tasks without a due date sort last.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function todos_list(\n client: FetchClient,\n params?: operations[\"todos_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"todos_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/todos`, params);\n}\n\n/**\n * Toggle a todo's completion state\n * Marks a todo complete or incomplete for the authenticated member. Sending `completed: true` stamps `completed_at` with the current time; `false` clears it.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function todos_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"todos_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"todos_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/todos/${id}`, body);\n}\n\n// ============================================================================\n// carts\n// ============================================================================\n\n/**\n * Claim a cart\n * Assigns the logged-in member as buyer_rep on an unclaimed FairShare cart. Any portal member (rep or customer) can claim. Returns an error if the cart has already been claimed.\n *\n * @param client - Fetch client instance\n * @param token - token\n */\nexport async function carts_claim(\n client: FetchClient,\n token: string | number,\n): Promise<\n operations[\"carts_claim\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/carts/${token}/claim`);\n}\n\n// ============================================================================\n// product_metrics\n// ============================================================================\n\n/**\n * Top products by direct visits\n * Ranked list of the company's products by total visits to the product page (aggregates metrics_product_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function product_by_visits(\n client: FetchClient,\n params?: operations[\"product_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"product_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/by-visits`, params);\n}\n\n/**\n * Top products by share-link visits\n * Ranked list of the company's products by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Product').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function product_by_shares(\n client: FetchClient,\n params?: operations[\"product_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"product_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/products/by-shares`, params);\n}\n\n// ============================================================================\n// enrollment_pack_metrics\n// ============================================================================\n\n/**\n * Top enrollment packs by direct visits\n * Ranked list of the company's enrollment packs by total visits to the pack page (aggregates metrics_enrollment_pack_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_pack_by_visits(\n client: FetchClient,\n params?: operations[\"enrollment_pack_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_pack_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/by-visits`, params);\n}\n\n/**\n * Top enrollment packs by share-link visits\n * Ranked list of the company's enrollment packs by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='EnrollmentPack').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function enrollment_pack_by_shares(\n client: FetchClient,\n params?: operations[\"enrollment_pack_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"enrollment_pack_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/enrollment_packs/by-shares`, params);\n}\n","/**\n * Generated API client functions for portal_tenant_content\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant-content\";\n\n// ============================================================================\n// content\n// ============================================================================\n\n/**\n * List active languages for the tenant company\n * Returns active languages enabled for the tenant company, sorted by name. Used by the content/translation editor to populate the language switcher.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_languages_list(\n client: FetchClient,\n params?: operations[\"content_languages_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_languages_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/languages`, params);\n}\n\n/**\n * List media (own uploads and company share media)\n * Returns a paginated list of the member's own uploads and company share media. Training and update media are excluded.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function media_list(\n client: FetchClient,\n params?: operations[\"media_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media`, params);\n}\n\n/**\n * Create a new media item\n * Creates a new media item record.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function media_create(\n client: FetchClient,\n body: operations[\"media_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"media_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/media`, body);\n}\n\n/**\n * Get a specific media item\n * Returns a single media item by ID. When language_iso is provided, translatable fields (title, description, url) are returned for that language with no fallback — empty values indicate an untranslated field.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param [params] - params\n */\nexport async function media_show(\n client: FetchClient,\n id: string | number,\n params?: operations[\"media_show\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/${id}`, params);\n}\n\n/**\n * Update a media item (own uploads only)\n * Updates a media item's title, description, status, url, content_format, thumbnail, CTA, and SEO. When language_iso is provided, translatable fields are written against that language's translation row instead of the default locale.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n * @param [params] - params\n */\nexport async function media_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"media_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n params?: operations[\"media_update\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/media/${id}`, body, { params });\n}\n\n/**\n * Delete a media item (own uploads only)\n * Removes a media item.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function media_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"media_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/media/${id}`);\n}\n\n/**\n * List products associated with a media item\n * Returns a paginated list of products associated with a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param [params] - params\n */\nexport async function media_products_list(\n client: FetchClient,\n medium_id: string | number,\n params?: operations[\"media_products_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"media_products_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/${medium_id}/products`, params);\n}\n\n/**\n * Associate a product with a media item\n * Creates a product association for a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param body - body\n */\nexport async function media_products_add(\n client: FetchClient,\n medium_id: string | number,\n body: operations[\"media_products_add\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"media_products_add\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/media/${medium_id}/products`, body);\n}\n\n/**\n * Remove a product association from a media item\n * Removes a single product association from a media item.\n *\n * @param client - Fetch client instance\n * @param medium_id - medium_id\n * @param id - id\n */\nexport async function media_products_remove(\n client: FetchClient,\n medium_id: string | number,\n id: string | number,\n): Promise<\n operations[\"media_products_remove\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/media/${medium_id}/products/${id}`);\n}\n\n/**\n * List playlists with cursor pagination\n * Returns a paginated list of playlists.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function playlists_list(\n client: FetchClient,\n params?: operations[\"playlists_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"playlists_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists`, params);\n}\n\n/**\n * Create a new playlist\n * Creates a new playlist.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function playlists_create(\n client: FetchClient,\n body: operations[\"playlists_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/playlists`, body);\n}\n\n/**\n * Get a specific playlist\n * Returns a single playlist by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function playlists_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"playlists_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/${id}`);\n}\n\n/**\n * Update a playlist\n * Updates a playlist's title or metadata.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function playlists_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"playlists_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/playlists/${id}`, body);\n}\n\n/**\n * Delete a playlist\n * Removes a playlist.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function playlists_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"playlists_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/playlists/${id}`);\n}\n\n/**\n * List items in a playlist\n * Returns a paginated list of items in a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param [params] - params\n */\nexport async function playlists_items_list(\n client: FetchClient,\n playlist_id: string | number,\n params?: operations[\"playlists_items_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"playlists_items_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/${playlist_id}/items`, params);\n}\n\n/**\n * Add an item to a playlist\n * Adds a content item (media, page, product, or enrollment_pack) to a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param body - body\n */\nexport async function playlists_items_add(\n client: FetchClient,\n playlist_id: string | number,\n body: operations[\"playlists_items_add\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_items_add\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/playlists/${playlist_id}/items`, body);\n}\n\n/**\n * Reorder items in a playlist\n * Sets the order of items in a playlist. Items not included in the payload are not moved. Flips the playlist to manual ordering.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param body - body\n */\nexport async function playlists_items_reorder(\n client: FetchClient,\n playlist_id: string | number,\n body: operations[\"playlists_items_reorder\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"playlists_items_reorder\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(\n `/api/content/playlists/${playlist_id}/items/reorder`,\n body,\n );\n}\n\n/**\n * Remove an item from a playlist\n * Removes a single item from a playlist.\n *\n * @param client - Fetch client instance\n * @param playlist_id - playlist_id\n * @param id - id\n */\nexport async function playlists_items_remove(\n client: FetchClient,\n playlist_id: string | number,\n id: string | number,\n): Promise<\n operations[\"playlists_items_remove\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/playlists/${playlist_id}/items/${id}`);\n}\n\n/**\n * List pages for the company\n * Returns a paginated list of published pages for the authenticated rep's company. Members have read-only access — there is no create, update, or destroy action for pages in the portal BFF. Response shape matches pages_show (PortalTenant::Api::PageBlueprinter).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function pages_list(\n client: FetchClient,\n params?: operations[\"pages_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"pages_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages`, params);\n}\n\n/**\n * Get a specific page\n * Returns a single page by ID, scoped to the authenticated rep's company. Response is a lean portal-BFF shape rendered by PortalTenant::Api::PageBlueprinter — not the legacy admin shape. Admin-only fields (html_code, application_theme_template, search_engine_optimizer, open_graph, prompts, etc.) are intentionally omitted.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function pages_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"pages_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/${id}`);\n}\n\n/**\n * List share links for the current user\n * Returns a paginated list of share links.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function shares_list(\n client: FetchClient,\n params?: operations[\"shares_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"shares_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/shares`, params);\n}\n\n/**\n * Create a share link\n * Creates a new share link for content.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function shares_create(\n client: FetchClient,\n body: operations[\"shares_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"shares_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/shares`, body);\n}\n\n/**\n * List DAM assets\n * Returns a paginated list of DAM assets for the company.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function dam_assets_list(\n client: FetchClient,\n params?: operations[\"dam_assets_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"dam_assets_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/dam/assets`, params);\n}\n\n/**\n * Create a DAM asset\n * Creates a new DAM asset. Supports two modes:\n1. **JSON placeholder** — send `application/json` with `asset[name]` to\n create a placeholder record for later file upload.\n\n2. **File upload** — send `multipart/form-data` with `asset[file]`,\n `asset[name]`, and optionally `asset[description]` and `asset[tags]`\n to upload a file and create the full asset with variants.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function dam_assets_create(\n client: FetchClient,\n body: operations[\"dam_assets_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_assets_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/assets`, body);\n}\n\n/**\n * List paths for a DAM asset\n * Returns a paginated list of path aliases for a DAM asset.\n *\n * @param client - Fetch client instance\n * @param asset_code - asset_code\n * @param [params] - params\n */\nexport async function dam_asset_paths_list(\n client: FetchClient,\n asset_code: string | number,\n params?: operations[\"dam_asset_paths_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"dam_asset_paths_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/dam/assets/${asset_code}/paths`, params);\n}\n\n/**\n * Create a path alias for a DAM asset\n * Creates a new path alias for an existing DAM asset.\n *\n * @param client - Fetch client instance\n * @param asset_code - asset_code\n * @param body - body\n */\nexport async function dam_asset_paths_create(\n client: FetchClient,\n asset_code: string | number,\n body: operations[\"dam_asset_paths_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_asset_paths_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/assets/${asset_code}/paths`, body);\n}\n\n/**\n * Query DAM assets using tree paths and tags\n * Searches and retrieves DAM assets using tree path pattern matching, tag-based variant filtering, wildcard name matching, and partial search. Supports cursor pagination for large result sets.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function dam_query(\n client: FetchClient,\n body: operations[\"dam_query\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"dam_query\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/dam/query`, body);\n}\n\n/**\n * Delete a DAM asset\n * Permanently destroys a DAM asset, including its ImageKit storage, variants, and database records.\n *\n * @param client - Fetch client instance\n * @param code - code\n */\nexport async function dam_assets_destroy(\n client: FetchClient,\n code: string | number,\n): Promise<\n operations[\"dam_assets_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/content/dam/assets/${code}`);\n}\n\n/**\n * Discard (soft-delete) a DAM asset\n * Soft-deletes a DAM asset. Used to discard an in-progress upload without permanently removing the record.\n *\n * @param client - Fetch client instance\n * @param code - code\n */\nexport async function dam_assets_discard(\n client: FetchClient,\n code: string | number,\n): Promise<\n operations[\"dam_assets_discard\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/content/dam/assets/${code}/discard`);\n}\n\n/**\n * Toggle favorite status on a content item\n * Toggles the favorite status of a content item for the authenticated member. If the item is not currently favorited, it becomes favorited. If it is already favorited, the favorite is removed.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function favorites_toggle(\n client: FetchClient,\n body: operations[\"favorites_toggle\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"favorites_toggle\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/content/favorites/toggle`, body);\n}\n\n// ============================================================================\n// media_metrics\n// ============================================================================\n\n/**\n * Top media by direct visits\n * Ranked list of the company's media by total visits (aggregates metrics_media_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_media_by_visits(\n client: FetchClient,\n params?: operations[\"content_media_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_media_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/by-visits`, params);\n}\n\n/**\n * Top media by share-link visits\n * Ranked list of the company's media by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Medium').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_media_by_shares(\n client: FetchClient,\n params?: operations[\"content_media_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_media_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/media/by-shares`, params);\n}\n\n// ============================================================================\n// playlist_metrics\n// ============================================================================\n\n/**\n * Top playlists by direct visits\n * Ranked list of the company's playlists by total visits (aggregates metrics_library_visits since playlists are stored in the libraries table).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_playlists_by_visits(\n client: FetchClient,\n params?: operations[\"content_playlists_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_playlists_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/by-visits`, params);\n}\n\n/**\n * Top playlists by share-link visits\n * Ranked list of the company's playlists by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Library').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_playlists_by_shares(\n client: FetchClient,\n params?: operations[\"content_playlists_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_playlists_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/playlists/by-shares`, params);\n}\n\n// ============================================================================\n// page_metrics\n// ============================================================================\n\n/**\n * Top pages by direct visits\n * Ranked list of the company's pages by total visits (aggregates metrics_page_visits across all visit sources).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_pages_by_visits(\n client: FetchClient,\n params?: operations[\"content_pages_by_visits\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_pages_by_visits\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/by-visits`, params);\n}\n\n/**\n * Top pages by share-link visits\n * Ranked list of the company's pages by click-throughs on rep share links (aggregates metrics_share_shareable_visits where shareable_type='Page').\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function content_pages_by_shares(\n client: FetchClient,\n params?: operations[\"content_pages_by_shares\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"content_pages_by_shares\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/content/pages/by-shares`, params);\n}\n","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":"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"}
|