@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,11 +1,11 @@
|
|
|
1
|
-
import { J as orders_show, n as usePortalTenantClient, q as orders_list } from "./PortalTenantClientProvider-
|
|
2
|
-
import { n as useFluidContext } from "./FluidProvider-
|
|
3
|
-
import { a as useActiveLocale, n as createDomainTranslations, r as useDomainDict, t as createStaticDictAdapter } from "./static-dict-adapter-
|
|
4
|
-
import { t as createTranslationContext } from "./translation-api-context-factory-
|
|
1
|
+
import { J as orders_show, n as usePortalTenantClient, q as orders_list } from "./PortalTenantClientProvider-DVClpfbi.mjs";
|
|
2
|
+
import { n as useFluidContext } from "./FluidProvider-tPt9UpYz.mjs";
|
|
3
|
+
import { a as useActiveLocale, n as createDomainTranslations, r as useDomainDict, t as createStaticDictAdapter } from "./static-dict-adapter-DRBq3ndO.mjs";
|
|
4
|
+
import { t as createTranslationContext } from "./translation-api-context-factory-DFr9yJ6Q.mjs";
|
|
5
5
|
import { dn as BreadcrumbLink, f as fluidToast, fn as BreadcrumbList, h as Skeleton, k as Input, kn as cn, ln as Breadcrumb, mn as BreadcrumbSeparator, pn as BreadcrumbPage, un as BreadcrumbItem } from "./src-CJw6JbdS.mjs";
|
|
6
|
-
import { n as ScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-
|
|
7
|
-
import { n as useAppNavigation } from "./AppNavigationContext-
|
|
8
|
-
import { createContext,
|
|
6
|
+
import { n as ScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-cuVMk00X.mjs";
|
|
7
|
+
import { n as useAppNavigation } from "./AppNavigationContext-B-wToUBG.mjs";
|
|
8
|
+
import { createContext, use, useEffect, useMemo, useState } from "react";
|
|
9
9
|
import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
|
|
10
10
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
11
11
|
import { AlertCircle, ImageOff, Repeat, Search } from "lucide-react";
|
|
@@ -13,7 +13,7 @@ import { AlertCircle, ImageOff, Repeat, Search } from "lucide-react";
|
|
|
13
13
|
const OrdersApiContext = createContext(null);
|
|
14
14
|
const OrdersApiProvider = OrdersApiContext.Provider;
|
|
15
15
|
function useOrdersApi() {
|
|
16
|
-
const api =
|
|
16
|
+
const api = use(OrdersApiContext);
|
|
17
17
|
if (!api) throw new Error("useOrdersApi must be used within an OrdersCoreProvider");
|
|
18
18
|
return api;
|
|
19
19
|
}
|
|
@@ -1006,7 +1006,7 @@ function DetailSkeleton() {
|
|
|
1006
1006
|
/* @__PURE__ */ jsx("div", {
|
|
1007
1007
|
className: "space-y-4",
|
|
1008
1008
|
children: /* @__PURE__ */ jsxs("div", {
|
|
1009
|
-
className: "flex items-center
|
|
1009
|
+
className: "flex items-center gap-x-4",
|
|
1010
1010
|
children: [/* @__PURE__ */ jsx(Skeleton, { className: "size-24 rounded" }), /* @__PURE__ */ jsxs("div", {
|
|
1011
1011
|
className: "flex-1 space-y-2",
|
|
1012
1012
|
children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-3/4" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-1/2" })]
|
|
@@ -1136,7 +1136,7 @@ function ItemRow({ item, onSubscriptionClick }) {
|
|
|
1136
1136
|
const { t } = useOrdersTranslation();
|
|
1137
1137
|
const subscriptionToken = item.source_subscription?.subscription_token;
|
|
1138
1138
|
return /* @__PURE__ */ jsxs("div", {
|
|
1139
|
-
className: "flex items-center
|
|
1139
|
+
className: "flex items-center gap-x-4 py-4",
|
|
1140
1140
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
1141
1141
|
className: "relative shrink-0",
|
|
1142
1142
|
children: [/* @__PURE__ */ jsx("div", {
|
|
@@ -1153,7 +1153,7 @@ function ItemRow({ item, onSubscriptionClick }) {
|
|
|
1153
1153
|
children: item.quantity
|
|
1154
1154
|
})]
|
|
1155
1155
|
}), /* @__PURE__ */ jsxs("div", {
|
|
1156
|
-
className: "flex min-w-0 flex-1 flex-col
|
|
1156
|
+
className: "flex min-w-0 flex-1 flex-col gap-y-0.5",
|
|
1157
1157
|
children: [
|
|
1158
1158
|
/* @__PURE__ */ jsx("p", {
|
|
1159
1159
|
className: "text-foreground truncate text-sm font-medium",
|
|
@@ -1489,4 +1489,4 @@ const ordersScreenPropertySchema = {
|
|
|
1489
1489
|
//#endregion
|
|
1490
1490
|
export { ordersScreenPropertySchema as n, OrdersScreen as t };
|
|
1491
1491
|
|
|
1492
|
-
//# sourceMappingURL=OrdersScreen-
|
|
1492
|
+
//# sourceMappingURL=OrdersScreen-DsKspc_8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrdersScreen-DsKspc_8.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, use } 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 = use(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 gap-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 gap-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 gap-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":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { vt as __exportAll } from "./PortalTenantClientProvider-
|
|
2
|
-
import { n as useDataSourceRegistryConfig } from "./registry-context-
|
|
3
|
-
import { r as useWidgetsApi, t as ErrorState } from "./error-state-
|
|
1
|
+
import { vt as __exportAll } from "./PortalTenantClientProvider-DVClpfbi.mjs";
|
|
2
|
+
import { n as useDataSourceRegistryConfig } from "./registry-context-CcoVxCii.mjs";
|
|
3
|
+
import { r as useWidgetsApi, t as ErrorState } from "./error-state-BUe589mD.mjs";
|
|
4
4
|
import { i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-59Barbhg.mjs";
|
|
5
|
-
import { t as useWidgetPreviewContext } from "./preview-context-
|
|
5
|
+
import { t as useWidgetPreviewContext } from "./preview-context-BXEGWx9T.mjs";
|
|
6
6
|
import { useId, useState } from "react";
|
|
7
7
|
import { useQuery } from "@tanstack/react-query";
|
|
8
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -301,4 +301,4 @@ const pointsWidgetPropertySchema = {
|
|
|
301
301
|
//#endregion
|
|
302
302
|
export { PointsWidget_exports as n, pointsWidgetPropertySchema as r, PointsWidget as t };
|
|
303
303
|
|
|
304
|
-
//# sourceMappingURL=PointsWidget-
|
|
304
|
+
//# sourceMappingURL=PointsWidget-BJlOIK6o.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointsWidget-BvGANrJq.mjs","names":[],"sources":["../../widgets/src/hooks/use-points-ledger.preview.ts","../../widgets/src/hooks/use-points-ledger.ts","../../widgets/src/widgets/PointsWidget.tsx"],"sourcesContent":["import type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysAgo(days: number): string {\n return new Date(now.getTime() - days * 86_400_000).toISOString();\n}\n\nexport const PREVIEW_DATA: PointsData = {\n balance: 25,\n entries: [\n {\n id: 1,\n amount: 20,\n createdAt: daysAgo(3),\n transactionType: \"new_order\",\n hasSource: true,\n },\n {\n id: 2,\n amount: 50,\n createdAt: daysAgo(14),\n transactionType: \"referral_bonus\",\n hasSource: true,\n },\n {\n id: 3,\n amount: -75,\n createdAt: daysAgo(60),\n transactionType: null,\n hasSource: true,\n },\n {\n id: 4,\n amount: 30,\n createdAt: daysAgo(90),\n transactionType: \"welcome_reward\",\n hasSource: true,\n },\n ],\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-points-ledger.preview\";\nimport type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type {\n PointsData,\n PointsEntry,\n} from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport const POINTS_LEDGER_QUERY_KEY = \"points-ledger\" as const;\n\nexport function usePointsLedger(): UseQueryResult<PointsData, Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const registryConfig = useDataSourceRegistryConfig();\n const { baseUrl } = registryConfig;\n const customerId = registryConfig.variables?.customer_id;\n\n // Contract: the BFF adapter (portal app, composite factory spreads BFF over\n // legacy) ignores customerId and infers the customer from the JWT, so the\n // portal renders this widget with no registry-variable plumbing. The legacy\n // adapter (fluid-admin) builds /v202506/customers/{customerId}/points_ledgers\n // and MUST receive a real id; that consumer always supplies one via registry\n // variables, so empty string never reaches the legacy URL in practice. If a\n // future caller wires this hook to a legacy-only adapter, configure\n // registry variables.customer_id at the provider — otherwise the request\n // would 404 on /customers//points_ledgers.\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n POINTS_LEDGER_QUERY_KEY,\n isPreview ? \"preview\" : baseUrl,\n customerId ?? null,\n ] as const,\n queryFn: ({ signal }) =>\n widgetsApi.fetchPointsLedger(customerId ?? \"\", signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useId, useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport { usePointsLedger, type PointsEntry } from \"../hooks/use-points-ledger\";\nimport { ErrorState } from \"../components/error-state\";\nimport { ChevronDown, Coins } from \"lucide-react\";\n\nconst formatBalance = (balance: number): string => {\n return balance.toLocaleString(\"en-US\");\n};\n\nfunction formatTransactionType(entry: PointsEntry): string {\n if (entry.transactionType) {\n return entry.transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n }\n if (entry.hasSource) {\n return entry.amount > 0 ? \"Points Awarded\" : \"Points Redeemed\";\n }\n return \"Transaction\";\n}\n\nfunction formatEntryDate(dateString: string): string {\n if (!dateString) return \"\";\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\ntype PointsWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Balance\n balanceColor?: ColorOptions;\n\n // History\n historyEnabled?: boolean;\n historyTitle?: string;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nfunction PointsEntryRow({\n entry,\n isLast,\n textColor,\n accentColor,\n backgroundColor,\n}: {\n entry: PointsEntry;\n isLast: boolean;\n textColor: ColorOptions;\n accentColor: ColorOptions;\n backgroundColor: ColorOptions;\n}) {\n const isPositive = entry.amount >= 0;\n const prefix = isPositive ? \"+\" : \"\";\n return (\n <div className=\"flex flex-row items-stretch gap-3\">\n <div className=\"relative flex w-2 flex-col items-center\">\n {!isLast && (\n <div\n className={`bg-${textColor}/40 absolute top-3 -bottom-3 left-1/2 w-px -translate-x-1/2`}\n />\n )}\n <div\n className={`border-${textColor}/60 bg-${backgroundColor} relative mt-3 h-2 w-2 shrink-0 rounded-full border`}\n />\n </div>\n <div className=\"flex flex-1 flex-row items-start justify-between py-1.5\">\n <div className=\"flex min-w-0 flex-col\">\n <div className={`text-sm font-medium text-${textColor} truncate`}>\n {formatTransactionType(entry)}\n </div>\n <div className={`text-sm text-${textColor} opacity-70`}>\n {formatEntryDate(entry.createdAt)}\n </div>\n </div>\n <div\n className={`text-sm font-medium ${isPositive ? `text-${accentColor}` : \"text-destructive\"}`}\n >\n {prefix}\n {entry.amount.toLocaleString(\"en-US\")}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PointsWidget({\n // Title\n titleEnabled = true,\n title = \"Points\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n // Balance\n balanceColor = \"primary\",\n\n // History\n historyEnabled = true,\n historyTitle = \"History\",\n\n // Styling\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: PointsWidgetProps): React.JSX.Element {\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyPanelId = useId();\n\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const { data, isLoading, isError } = usePointsLedger();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-2.5`}>\n {/* Header: Title + Balance */}\n {titleEnabled && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n {!isLoading && data && (\n <span\n className={`text-3xl font-semibold text-${balanceColor} font-header leading-snug`}\n >\n {formatBalance(data.balance)}\n </span>\n )}\n\n {/* Loading */}\n {isLoading ? (\n <div className=\"flex min-h-[60px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : historyEnabled && (!data || data.entries.length === 0) ? (\n /* Empty state — only shown when history is enabled but no entries */\n <div className=\"flex min-h-[60px] flex-col items-center justify-center gap-2\">\n <Coins className={`size-10 text-${textColor} opacity-30`} />\n <p className={`text-sm font-semibold text-${textColor} opacity-50`}>\n No Points Activity\n </p>\n </div>\n ) : historyEnabled && data && data.entries.length > 0 ? (\n /* History dropdown */\n <div className=\"flex flex-col gap-2\">\n {/* Dropdown toggle */}\n <button\n type=\"button\"\n aria-expanded={historyOpen}\n aria-controls={historyPanelId}\n onClick={() => setHistoryOpen((prev) => !prev)}\n className={`flex w-full items-center text-xs font-semibold text-${textColor} cursor-pointer`}\n >\n <span className=\"flex-1 text-left\">{historyTitle}</span>\n <ChevronDown\n className={`size-4 transition-transform duration-200 ${historyOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n <div className={`bg-${textColor}/20 h-px w-full`} />\n\n {/* Collapsible entries */}\n <div\n id={historyPanelId}\n className={`flex flex-col ${!historyOpen ? \"hidden\" : \"\"}`}\n >\n {data.entries.map((entry, index) => (\n <PointsEntryRow\n key={entry.id}\n entry={entry}\n isLast={index === data.entries.length - 1}\n textColor={textColor}\n accentColor={accentColor}\n backgroundColor={backgroundColor}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport const pointsWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"PointsWidget\",\n displayName: \"Points\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Toggle title visibility\",\n defaultValue: true,\n\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the balance\",\n defaultValue: \"Points\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"md\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Balance group\n getColorField({\n key: \"balanceColor\",\n label: \"Balance Color\",\n description: \"Color for the points balance number\",\n defaultValue: \"primary\",\n\n group: \"Balance\",\n }),\n\n // History group\n {\n key: \"historyEnabled\",\n label: \"Show History\",\n type: \"boolean\",\n description: \"Show a collapsible history dropdown below the balance\",\n defaultValue: true,\n\n group: \"History\",\n },\n {\n key: \"historyTitle\",\n label: \"History Title\",\n type: \"text\",\n description: \"Title for the history dropdown\",\n defaultValue: \"History\",\n\n group: \"History\",\n requiresKeyToBeTrue: \"historyEnabled\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget\",\n defaultValue: \"background\",\n\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color\",\n defaultValue: \"foreground\",\n\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color for positive points amounts\",\n defaultValue: \"primary\",\n\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Widget padding\",\n defaultValue: 4,\n\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Widget border radius\",\n defaultValue: \"md\",\n\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;AAEA,MAAM,sBAAM,IAAI,MAAM;AAEtB,SAAS,QAAQ,MAAsB;AACrC,yBAAO,IAAI,KAAK,IAAI,SAAS,GAAG,OAAO,MAAW,EAAC,aAAa;;AAGlE,MAAa,eAA2B;CACtC,SAAS;CACT,SAAS;EACP;GACE,IAAI;GACJ,QAAQ;GACR,WAAW,QAAQ,EAAE;GACrB,iBAAiB;GACjB,WAAW;GACZ;EACD;GACE,IAAI;GACJ,QAAQ;GACR,WAAW,QAAQ,GAAG;GACtB,iBAAiB;GACjB,WAAW;GACZ;EACD;GACE,IAAI;GACJ,QAAQ;GACR,WAAW,QAAQ,GAAG;GACtB,iBAAiB;GACjB,WAAW;GACZ;EACD;GACE,IAAI;GACJ,QAAQ;GACR,WAAW,QAAQ,GAAG;GACtB,iBAAiB;GACjB,WAAW;GACZ;EACF;CACF;;;AC5BD,MAAa,0BAA0B;AAEvC,SAAgB,kBAAqD;CACnE,MAAM,aAAa,eAAe;CAClC,MAAM,EAAE,cAAc,yBAAyB;CAC/C,MAAM,iBAAiB,6BAA6B;CACpD,MAAM,EAAE,YAAY;CACpB,MAAM,aAAa,eAAe,WAAW;AAW7C,QAAO,SAAS;EACd,UAAU;GACR;GACA;GACA,YAAY,YAAY;GACxB,cAAc;GACf;EACD,UAAU,EAAE,aACV,WAAW,kBAAkB,cAAc,IAAI,OAAO;EACxD,SAAS,CAAC;EACV,GAAI,aAAa,EAAE,iBAAiB,cAAc;EACnD,CAAC;;;;;;;;AChBJ,MAAM,iBAAiB,YAA4B;AACjD,QAAO,QAAQ,eAAe,QAAQ;;AAGxC,SAAS,sBAAsB,OAA4B;AACzD,KAAI,MAAM,gBACR,QAAO,MAAM,gBACV,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,IAAI;AAEd,KAAI,MAAM,UACR,QAAO,MAAM,SAAS,IAAI,mBAAmB;AAE/C,QAAO;;AAGT,SAAS,gBAAgB,YAA4B;AACnD,KAAI,CAAC,WAAY,QAAO;AAExB,QADa,IAAI,KAAK,WAAW,CACrB,mBAAmB,KAAA,GAAW;EACxC,OAAO;EACP,KAAK;EACL,MAAM;EACP,CAAC;;AA2BJ,SAAS,eAAe,EACtB,OACA,QACA,WACA,aACA,mBAOC;CACD,MAAM,aAAa,MAAM,UAAU;CACnC,MAAM,SAAS,aAAa,MAAM;AAClC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,CAAC,UACA,oBAAC,OAAD,EACE,WAAW,MAAM,UAAU,8DAC3B,CAAA,EAEJ,oBAAC,OAAD,EACE,WAAW,UAAU,UAAU,SAAS,gBAAgB,sDACxD,CAAA,CACE;MACN,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD;KAAK,WAAW,4BAA4B,UAAU;eACnD,sBAAsB,MAAM;KACzB,CAAA,EACN,oBAAC,OAAD;KAAK,WAAW,gBAAgB,UAAU;eACvC,gBAAgB,MAAM,UAAU;KAC7B,CAAA,CACF;OACN,qBAAC,OAAD;IACE,WAAW,uBAAuB,aAAa,QAAQ,gBAAgB;cADzE,CAGG,QACA,MAAM,OAAO,eAAe,QAAQ,CACjC;MACF;KACF;;;AAIV,SAAgB,aAAa,EAE3B,eAAe,MACf,QAAQ,UACR,gBAAgB,MAChB,aAAa,cAGb,eAAe,WAGf,iBAAiB,MACjB,eAAe,WAGf,aAAa;CAAE,MAAM;CAAS,OAAO;CAAc,EACnD,YAAY,cACZ,cAAc,WACd,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAEd,WACA,GAAG,SACoC;CACvC,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,iBAAiB,OAAO;CAE9B,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,WAAW,SAAS,UAChB,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CAEN,MAAM,EAAE,MAAM,WAAW,YAAY,iBAAiB;AAEtD,QACE,oBAAC,OAAD;EACE,WAAW,sCAAsC,aAAa,MAAM,gBAAgB,GAAG,mBAAmB,aAAa,GAAG,gBAAgB,SAAS,mBAAmB,eAAe,GAAG,GAAG,aAAa;EACxM,OAAO,EAAE,iBAAiB;EAC1B,GAAI;YAEJ,qBAAC,OAAD;GAAK,WAAW,KAAK,QAAQ;aAA7B;IAEG,gBACC,oBAAC,MAAD;KACE,WAAW,QAAQ,cAAc,8BAA8B;eAE9D;KACE,CAAA;IAEN,CAAC,aAAa,QACb,oBAAC,QAAD;KACE,WAAW,+BAA+B,aAAa;eAEtD,cAAc,KAAK,QAAQ;KACvB,CAAA;IAIR,YACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;KAC9F,CAAA,GACJ,UACF,oBAAC,YAAD,EAAc,CAAA,GACZ,mBAAmB,CAAC,QAAQ,KAAK,QAAQ,WAAW,KAEtD,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD,EAAO,WAAW,gBAAgB,UAAU,cAAgB,CAAA,EAC5D,oBAAC,KAAD;MAAG,WAAW,8BAA8B,UAAU;gBAAc;MAEhE,CAAA,CACA;SACJ,kBAAkB,QAAQ,KAAK,QAAQ,SAAS,IAElD,qBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,qBAAC,UAAD;OACE,MAAK;OACL,iBAAe;OACf,iBAAe;OACf,eAAe,gBAAgB,SAAS,CAAC,KAAK;OAC9C,WAAW,uDAAuD,UAAU;iBAL9E,CAOE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;QAAoB,CAAA,EACxD,oBAAC,aAAD,EACE,WAAW,4CAA4C,cAAc,eAAe,MACpF,CAAA,CACK;;MACT,oBAAC,OAAD,EAAK,WAAW,MAAM,UAAU,kBAAoB,CAAA;MAGpD,oBAAC,OAAD;OACE,IAAI;OACJ,WAAW,iBAAiB,CAAC,cAAc,WAAW;iBAErD,KAAK,QAAQ,KAAK,OAAO,UACxB,oBAAC,gBAAD;QAES;QACP,QAAQ,UAAU,KAAK,QAAQ,SAAS;QAC7B;QACE;QACI;QACjB,EANK,MAAM,GAMX,CACF;OACE,CAAA;MACF;SACJ;IACA;;EACF,CAAA;;AAIV,MAAa,6BAAmD;CAC9D,YAAY;CACZ,aAAa;CACb,QAAQ;EAEN;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GAEd,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GAEd,OAAO;GACP,qBAAqB;GACtB;EACD,iBAAiB;GACf,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACP,qBAAqB;GACtB,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GAEd,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GAEd,OAAO;GACP,qBAAqB;GACtB;EAGD;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR;EACD,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GAEP,OAAO;GACR;EACD,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACF,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GAEd,OAAO;GACR,CAAC;EACH;CACF"}
|
|
1
|
+
{"version":3,"file":"PointsWidget-BJlOIK6o.mjs","names":[],"sources":["../../widgets/src/hooks/use-points-ledger.preview.ts","../../widgets/src/hooks/use-points-ledger.ts","../../widgets/src/widgets/PointsWidget.tsx"],"sourcesContent":["import type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysAgo(days: number): string {\n return new Date(now.getTime() - days * 86_400_000).toISOString();\n}\n\nexport const PREVIEW_DATA: PointsData = {\n balance: 25,\n entries: [\n {\n id: 1,\n amount: 20,\n createdAt: daysAgo(3),\n transactionType: \"new_order\",\n hasSource: true,\n },\n {\n id: 2,\n amount: 50,\n createdAt: daysAgo(14),\n transactionType: \"referral_bonus\",\n hasSource: true,\n },\n {\n id: 3,\n amount: -75,\n createdAt: daysAgo(60),\n transactionType: null,\n hasSource: true,\n },\n {\n id: 4,\n amount: 30,\n createdAt: daysAgo(90),\n transactionType: \"welcome_reward\",\n hasSource: true,\n },\n ],\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-points-ledger.preview\";\nimport type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type {\n PointsData,\n PointsEntry,\n} from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport const POINTS_LEDGER_QUERY_KEY = \"points-ledger\" as const;\n\nexport function usePointsLedger(): UseQueryResult<PointsData, Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const registryConfig = useDataSourceRegistryConfig();\n const { baseUrl } = registryConfig;\n const customerId = registryConfig.variables?.customer_id;\n\n // Contract: the BFF adapter (portal app, composite factory spreads BFF over\n // legacy) ignores customerId and infers the customer from the JWT, so the\n // portal renders this widget with no registry-variable plumbing. The legacy\n // adapter (fluid-admin) builds /v202506/customers/{customerId}/points_ledgers\n // and MUST receive a real id; that consumer always supplies one via registry\n // variables, so empty string never reaches the legacy URL in practice. If a\n // future caller wires this hook to a legacy-only adapter, configure\n // registry variables.customer_id at the provider — otherwise the request\n // would 404 on /customers//points_ledgers.\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n POINTS_LEDGER_QUERY_KEY,\n isPreview ? \"preview\" : baseUrl,\n customerId ?? null,\n ] as const,\n queryFn: ({ signal }) =>\n widgetsApi.fetchPointsLedger(customerId ?? \"\", signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useId, useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport { usePointsLedger, type PointsEntry } from \"../hooks/use-points-ledger\";\nimport { ErrorState } from \"../components/error-state\";\nimport { ChevronDown, Coins } from \"lucide-react\";\n\nconst formatBalance = (balance: number): string => {\n return balance.toLocaleString(\"en-US\");\n};\n\nfunction formatTransactionType(entry: PointsEntry): string {\n if (entry.transactionType) {\n return entry.transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n }\n if (entry.hasSource) {\n return entry.amount > 0 ? \"Points Awarded\" : \"Points Redeemed\";\n }\n return \"Transaction\";\n}\n\nfunction formatEntryDate(dateString: string): string {\n if (!dateString) return \"\";\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\ntype PointsWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Balance\n balanceColor?: ColorOptions;\n\n // History\n historyEnabled?: boolean;\n historyTitle?: string;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nfunction PointsEntryRow({\n entry,\n isLast,\n textColor,\n accentColor,\n backgroundColor,\n}: {\n entry: PointsEntry;\n isLast: boolean;\n textColor: ColorOptions;\n accentColor: ColorOptions;\n backgroundColor: ColorOptions;\n}) {\n const isPositive = entry.amount >= 0;\n const prefix = isPositive ? \"+\" : \"\";\n return (\n <div className=\"flex flex-row items-stretch gap-3\">\n <div className=\"relative flex w-2 flex-col items-center\">\n {!isLast && (\n <div\n className={`bg-${textColor}/40 absolute top-3 -bottom-3 left-1/2 w-px -translate-x-1/2`}\n />\n )}\n <div\n className={`border-${textColor}/60 bg-${backgroundColor} relative mt-3 h-2 w-2 shrink-0 rounded-full border`}\n />\n </div>\n <div className=\"flex flex-1 flex-row items-start justify-between py-1.5\">\n <div className=\"flex min-w-0 flex-col\">\n <div className={`text-sm font-medium text-${textColor} truncate`}>\n {formatTransactionType(entry)}\n </div>\n <div className={`text-sm text-${textColor} opacity-70`}>\n {formatEntryDate(entry.createdAt)}\n </div>\n </div>\n <div\n className={`text-sm font-medium ${isPositive ? `text-${accentColor}` : \"text-destructive\"}`}\n >\n {prefix}\n {entry.amount.toLocaleString(\"en-US\")}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PointsWidget({\n // Title\n titleEnabled = true,\n title = \"Points\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n // Balance\n balanceColor = \"primary\",\n\n // History\n historyEnabled = true,\n historyTitle = \"History\",\n\n // Styling\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: PointsWidgetProps): React.JSX.Element {\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyPanelId = useId();\n\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const { data, isLoading, isError } = usePointsLedger();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-2.5`}>\n {/* Header: Title + Balance */}\n {titleEnabled && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n {!isLoading && data && (\n <span\n className={`text-3xl font-semibold text-${balanceColor} font-header leading-snug`}\n >\n {formatBalance(data.balance)}\n </span>\n )}\n\n {/* Loading */}\n {isLoading ? (\n <div className=\"flex min-h-[60px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : historyEnabled && (!data || data.entries.length === 0) ? (\n /* Empty state — only shown when history is enabled but no entries */\n <div className=\"flex min-h-[60px] flex-col items-center justify-center gap-2\">\n <Coins className={`size-10 text-${textColor} opacity-30`} />\n <p className={`text-sm font-semibold text-${textColor} opacity-50`}>\n No Points Activity\n </p>\n </div>\n ) : historyEnabled && data && data.entries.length > 0 ? (\n /* History dropdown */\n <div className=\"flex flex-col gap-2\">\n {/* Dropdown toggle */}\n <button\n type=\"button\"\n aria-expanded={historyOpen}\n aria-controls={historyPanelId}\n onClick={() => setHistoryOpen((prev) => !prev)}\n className={`flex w-full items-center text-xs font-semibold text-${textColor} cursor-pointer`}\n >\n <span className=\"flex-1 text-left\">{historyTitle}</span>\n <ChevronDown\n className={`size-4 transition-transform duration-200 ${historyOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n <div className={`bg-${textColor}/20 h-px w-full`} />\n\n {/* Collapsible entries */}\n <div\n id={historyPanelId}\n className={`flex flex-col ${!historyOpen ? \"hidden\" : \"\"}`}\n >\n {data.entries.map((entry, index) => (\n <PointsEntryRow\n key={entry.id}\n entry={entry}\n isLast={index === data.entries.length - 1}\n textColor={textColor}\n accentColor={accentColor}\n backgroundColor={backgroundColor}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport const pointsWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"PointsWidget\",\n displayName: \"Points\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Toggle title visibility\",\n defaultValue: true,\n\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the balance\",\n defaultValue: \"Points\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"md\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Balance group\n getColorField({\n key: \"balanceColor\",\n label: \"Balance Color\",\n description: \"Color for the points balance number\",\n defaultValue: \"primary\",\n\n group: \"Balance\",\n }),\n\n // History group\n {\n key: \"historyEnabled\",\n label: \"Show History\",\n type: \"boolean\",\n description: \"Show a collapsible history dropdown below the balance\",\n defaultValue: true,\n\n group: \"History\",\n },\n {\n key: \"historyTitle\",\n label: \"History Title\",\n type: \"text\",\n description: \"Title for the history dropdown\",\n defaultValue: \"History\",\n\n group: \"History\",\n requiresKeyToBeTrue: \"historyEnabled\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget\",\n defaultValue: \"background\",\n\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color\",\n defaultValue: \"foreground\",\n\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color for positive points amounts\",\n defaultValue: \"primary\",\n\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Widget padding\",\n defaultValue: 4,\n\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Widget border radius\",\n defaultValue: \"md\",\n\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_registry_context = require("./registry-context-
|
|
3
|
-
const require_error_state = require("./error-state-
|
|
2
|
+
const require_registry_context = require("./registry-context-Q_1Iq2Ea.cjs");
|
|
3
|
+
const require_error_state = require("./error-state-CU87JUpz.cjs");
|
|
4
4
|
const require_registries = require("./registries-CpUM406S.cjs");
|
|
5
|
-
const require_preview_context = require("./preview-context-
|
|
5
|
+
const require_preview_context = require("./preview-context-DrXkIImI.cjs");
|
|
6
6
|
let react = require("react");
|
|
7
7
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
8
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -318,4 +318,4 @@ Object.defineProperty(exports, "pointsWidgetPropertySchema", {
|
|
|
318
318
|
}
|
|
319
319
|
});
|
|
320
320
|
|
|
321
|
-
//# sourceMappingURL=PointsWidget-
|
|
321
|
+
//# sourceMappingURL=PointsWidget-Him7U2k2.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointsWidget-Byd2-eEi.cjs","names":["useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","borderWidthClasses","borderColorClasses","ErrorState","Coins","ChevronDown","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/hooks/use-points-ledger.preview.ts","../../widgets/src/hooks/use-points-ledger.ts","../../widgets/src/widgets/PointsWidget.tsx"],"sourcesContent":["import type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysAgo(days: number): string {\n return new Date(now.getTime() - days * 86_400_000).toISOString();\n}\n\nexport const PREVIEW_DATA: PointsData = {\n balance: 25,\n entries: [\n {\n id: 1,\n amount: 20,\n createdAt: daysAgo(3),\n transactionType: \"new_order\",\n hasSource: true,\n },\n {\n id: 2,\n amount: 50,\n createdAt: daysAgo(14),\n transactionType: \"referral_bonus\",\n hasSource: true,\n },\n {\n id: 3,\n amount: -75,\n createdAt: daysAgo(60),\n transactionType: null,\n hasSource: true,\n },\n {\n id: 4,\n amount: 30,\n createdAt: daysAgo(90),\n transactionType: \"welcome_reward\",\n hasSource: true,\n },\n ],\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-points-ledger.preview\";\nimport type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type {\n PointsData,\n PointsEntry,\n} from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport const POINTS_LEDGER_QUERY_KEY = \"points-ledger\" as const;\n\nexport function usePointsLedger(): UseQueryResult<PointsData, Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const registryConfig = useDataSourceRegistryConfig();\n const { baseUrl } = registryConfig;\n const customerId = registryConfig.variables?.customer_id;\n\n // Contract: the BFF adapter (portal app, composite factory spreads BFF over\n // legacy) ignores customerId and infers the customer from the JWT, so the\n // portal renders this widget with no registry-variable plumbing. The legacy\n // adapter (fluid-admin) builds /v202506/customers/{customerId}/points_ledgers\n // and MUST receive a real id; that consumer always supplies one via registry\n // variables, so empty string never reaches the legacy URL in practice. If a\n // future caller wires this hook to a legacy-only adapter, configure\n // registry variables.customer_id at the provider — otherwise the request\n // would 404 on /customers//points_ledgers.\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n POINTS_LEDGER_QUERY_KEY,\n isPreview ? \"preview\" : baseUrl,\n customerId ?? null,\n ] as const,\n queryFn: ({ signal }) =>\n widgetsApi.fetchPointsLedger(customerId ?? \"\", signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useId, useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport { usePointsLedger, type PointsEntry } from \"../hooks/use-points-ledger\";\nimport { ErrorState } from \"../components/error-state\";\nimport { ChevronDown, Coins } from \"lucide-react\";\n\nconst formatBalance = (balance: number): string => {\n return balance.toLocaleString(\"en-US\");\n};\n\nfunction formatTransactionType(entry: PointsEntry): string {\n if (entry.transactionType) {\n return entry.transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n }\n if (entry.hasSource) {\n return entry.amount > 0 ? \"Points Awarded\" : \"Points Redeemed\";\n }\n return \"Transaction\";\n}\n\nfunction formatEntryDate(dateString: string): string {\n if (!dateString) return \"\";\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\ntype PointsWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Balance\n balanceColor?: ColorOptions;\n\n // History\n historyEnabled?: boolean;\n historyTitle?: string;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nfunction PointsEntryRow({\n entry,\n isLast,\n textColor,\n accentColor,\n backgroundColor,\n}: {\n entry: PointsEntry;\n isLast: boolean;\n textColor: ColorOptions;\n accentColor: ColorOptions;\n backgroundColor: ColorOptions;\n}) {\n const isPositive = entry.amount >= 0;\n const prefix = isPositive ? \"+\" : \"\";\n return (\n <div className=\"flex flex-row items-stretch gap-3\">\n <div className=\"relative flex w-2 flex-col items-center\">\n {!isLast && (\n <div\n className={`bg-${textColor}/40 absolute top-3 -bottom-3 left-1/2 w-px -translate-x-1/2`}\n />\n )}\n <div\n className={`border-${textColor}/60 bg-${backgroundColor} relative mt-3 h-2 w-2 shrink-0 rounded-full border`}\n />\n </div>\n <div className=\"flex flex-1 flex-row items-start justify-between py-1.5\">\n <div className=\"flex min-w-0 flex-col\">\n <div className={`text-sm font-medium text-${textColor} truncate`}>\n {formatTransactionType(entry)}\n </div>\n <div className={`text-sm text-${textColor} opacity-70`}>\n {formatEntryDate(entry.createdAt)}\n </div>\n </div>\n <div\n className={`text-sm font-medium ${isPositive ? `text-${accentColor}` : \"text-destructive\"}`}\n >\n {prefix}\n {entry.amount.toLocaleString(\"en-US\")}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PointsWidget({\n // Title\n titleEnabled = true,\n title = \"Points\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n // Balance\n balanceColor = \"primary\",\n\n // History\n historyEnabled = true,\n historyTitle = \"History\",\n\n // Styling\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: PointsWidgetProps): React.JSX.Element {\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyPanelId = useId();\n\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const { data, isLoading, isError } = usePointsLedger();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-2.5`}>\n {/* Header: Title + Balance */}\n {titleEnabled && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n {!isLoading && data && (\n <span\n className={`text-3xl font-semibold text-${balanceColor} font-header leading-snug`}\n >\n {formatBalance(data.balance)}\n </span>\n )}\n\n {/* Loading */}\n {isLoading ? (\n <div className=\"flex min-h-[60px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : historyEnabled && (!data || data.entries.length === 0) ? (\n /* Empty state — only shown when history is enabled but no entries */\n <div className=\"flex min-h-[60px] flex-col items-center justify-center gap-2\">\n <Coins className={`size-10 text-${textColor} opacity-30`} />\n <p className={`text-sm font-semibold text-${textColor} opacity-50`}>\n No Points Activity\n </p>\n </div>\n ) : historyEnabled && data && data.entries.length > 0 ? (\n /* History dropdown */\n <div className=\"flex flex-col gap-2\">\n {/* Dropdown toggle */}\n <button\n type=\"button\"\n aria-expanded={historyOpen}\n aria-controls={historyPanelId}\n onClick={() => setHistoryOpen((prev) => !prev)}\n className={`flex w-full items-center text-xs font-semibold text-${textColor} cursor-pointer`}\n >\n <span className=\"flex-1 text-left\">{historyTitle}</span>\n <ChevronDown\n className={`size-4 transition-transform duration-200 ${historyOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n <div className={`bg-${textColor}/20 h-px w-full`} />\n\n {/* Collapsible entries */}\n <div\n id={historyPanelId}\n className={`flex flex-col ${!historyOpen ? \"hidden\" : \"\"}`}\n >\n {data.entries.map((entry, index) => (\n <PointsEntryRow\n key={entry.id}\n entry={entry}\n isLast={index === data.entries.length - 1}\n textColor={textColor}\n accentColor={accentColor}\n backgroundColor={backgroundColor}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport const pointsWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"PointsWidget\",\n displayName: \"Points\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Toggle title visibility\",\n defaultValue: true,\n\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the balance\",\n defaultValue: \"Points\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"md\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Balance group\n getColorField({\n key: \"balanceColor\",\n label: \"Balance Color\",\n description: \"Color for the points balance number\",\n defaultValue: \"primary\",\n\n group: \"Balance\",\n }),\n\n // History group\n {\n key: \"historyEnabled\",\n label: \"Show History\",\n type: \"boolean\",\n description: \"Show a collapsible history dropdown below the balance\",\n defaultValue: true,\n\n group: \"History\",\n },\n {\n key: \"historyTitle\",\n label: \"History Title\",\n type: \"text\",\n description: \"Title for the history dropdown\",\n defaultValue: \"History\",\n\n group: \"History\",\n requiresKeyToBeTrue: \"historyEnabled\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget\",\n defaultValue: \"background\",\n\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color\",\n defaultValue: \"foreground\",\n\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color for positive points amounts\",\n defaultValue: \"primary\",\n\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Widget padding\",\n defaultValue: 4,\n\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Widget border radius\",\n defaultValue: \"md\",\n\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PointsWidget-Him7U2k2.cjs","names":["useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","borderWidthClasses","borderColorClasses","ErrorState","Coins","ChevronDown","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/hooks/use-points-ledger.preview.ts","../../widgets/src/hooks/use-points-ledger.ts","../../widgets/src/widgets/PointsWidget.tsx"],"sourcesContent":["import type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysAgo(days: number): string {\n return new Date(now.getTime() - days * 86_400_000).toISOString();\n}\n\nexport const PREVIEW_DATA: PointsData = {\n balance: 25,\n entries: [\n {\n id: 1,\n amount: 20,\n createdAt: daysAgo(3),\n transactionType: \"new_order\",\n hasSource: true,\n },\n {\n id: 2,\n amount: 50,\n createdAt: daysAgo(14),\n transactionType: \"referral_bonus\",\n hasSource: true,\n },\n {\n id: 3,\n amount: -75,\n createdAt: daysAgo(60),\n transactionType: null,\n hasSource: true,\n },\n {\n id: 4,\n amount: 30,\n createdAt: daysAgo(90),\n transactionType: \"welcome_reward\",\n hasSource: true,\n },\n ],\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-points-ledger.preview\";\nimport type { PointsData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type {\n PointsData,\n PointsEntry,\n} from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport const POINTS_LEDGER_QUERY_KEY = \"points-ledger\" as const;\n\nexport function usePointsLedger(): UseQueryResult<PointsData, Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const registryConfig = useDataSourceRegistryConfig();\n const { baseUrl } = registryConfig;\n const customerId = registryConfig.variables?.customer_id;\n\n // Contract: the BFF adapter (portal app, composite factory spreads BFF over\n // legacy) ignores customerId and infers the customer from the JWT, so the\n // portal renders this widget with no registry-variable plumbing. The legacy\n // adapter (fluid-admin) builds /v202506/customers/{customerId}/points_ledgers\n // and MUST receive a real id; that consumer always supplies one via registry\n // variables, so empty string never reaches the legacy URL in practice. If a\n // future caller wires this hook to a legacy-only adapter, configure\n // registry variables.customer_id at the provider — otherwise the request\n // would 404 on /customers//points_ledgers.\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n POINTS_LEDGER_QUERY_KEY,\n isPreview ? \"preview\" : baseUrl,\n customerId ?? null,\n ] as const,\n queryFn: ({ signal }) =>\n widgetsApi.fetchPointsLedger(customerId ?? \"\", signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useId, useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport { usePointsLedger, type PointsEntry } from \"../hooks/use-points-ledger\";\nimport { ErrorState } from \"../components/error-state\";\nimport { ChevronDown, Coins } from \"lucide-react\";\n\nconst formatBalance = (balance: number): string => {\n return balance.toLocaleString(\"en-US\");\n};\n\nfunction formatTransactionType(entry: PointsEntry): string {\n if (entry.transactionType) {\n return entry.transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n }\n if (entry.hasSource) {\n return entry.amount > 0 ? \"Points Awarded\" : \"Points Redeemed\";\n }\n return \"Transaction\";\n}\n\nfunction formatEntryDate(dateString: string): string {\n if (!dateString) return \"\";\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\ntype PointsWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Balance\n balanceColor?: ColorOptions;\n\n // History\n historyEnabled?: boolean;\n historyTitle?: string;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nfunction PointsEntryRow({\n entry,\n isLast,\n textColor,\n accentColor,\n backgroundColor,\n}: {\n entry: PointsEntry;\n isLast: boolean;\n textColor: ColorOptions;\n accentColor: ColorOptions;\n backgroundColor: ColorOptions;\n}) {\n const isPositive = entry.amount >= 0;\n const prefix = isPositive ? \"+\" : \"\";\n return (\n <div className=\"flex flex-row items-stretch gap-3\">\n <div className=\"relative flex w-2 flex-col items-center\">\n {!isLast && (\n <div\n className={`bg-${textColor}/40 absolute top-3 -bottom-3 left-1/2 w-px -translate-x-1/2`}\n />\n )}\n <div\n className={`border-${textColor}/60 bg-${backgroundColor} relative mt-3 h-2 w-2 shrink-0 rounded-full border`}\n />\n </div>\n <div className=\"flex flex-1 flex-row items-start justify-between py-1.5\">\n <div className=\"flex min-w-0 flex-col\">\n <div className={`text-sm font-medium text-${textColor} truncate`}>\n {formatTransactionType(entry)}\n </div>\n <div className={`text-sm text-${textColor} opacity-70`}>\n {formatEntryDate(entry.createdAt)}\n </div>\n </div>\n <div\n className={`text-sm font-medium ${isPositive ? `text-${accentColor}` : \"text-destructive\"}`}\n >\n {prefix}\n {entry.amount.toLocaleString(\"en-US\")}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PointsWidget({\n // Title\n titleEnabled = true,\n title = \"Points\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n // Balance\n balanceColor = \"primary\",\n\n // History\n historyEnabled = true,\n historyTitle = \"History\",\n\n // Styling\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: PointsWidgetProps): React.JSX.Element {\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyPanelId = useId();\n\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const { data, isLoading, isError } = usePointsLedger();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-2.5`}>\n {/* Header: Title + Balance */}\n {titleEnabled && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n {!isLoading && data && (\n <span\n className={`text-3xl font-semibold text-${balanceColor} font-header leading-snug`}\n >\n {formatBalance(data.balance)}\n </span>\n )}\n\n {/* Loading */}\n {isLoading ? (\n <div className=\"flex min-h-[60px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : historyEnabled && (!data || data.entries.length === 0) ? (\n /* Empty state — only shown when history is enabled but no entries */\n <div className=\"flex min-h-[60px] flex-col items-center justify-center gap-2\">\n <Coins className={`size-10 text-${textColor} opacity-30`} />\n <p className={`text-sm font-semibold text-${textColor} opacity-50`}>\n No Points Activity\n </p>\n </div>\n ) : historyEnabled && data && data.entries.length > 0 ? (\n /* History dropdown */\n <div className=\"flex flex-col gap-2\">\n {/* Dropdown toggle */}\n <button\n type=\"button\"\n aria-expanded={historyOpen}\n aria-controls={historyPanelId}\n onClick={() => setHistoryOpen((prev) => !prev)}\n className={`flex w-full items-center text-xs font-semibold text-${textColor} cursor-pointer`}\n >\n <span className=\"flex-1 text-left\">{historyTitle}</span>\n <ChevronDown\n className={`size-4 transition-transform duration-200 ${historyOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n <div className={`bg-${textColor}/20 h-px w-full`} />\n\n {/* Collapsible entries */}\n <div\n id={historyPanelId}\n className={`flex flex-col ${!historyOpen ? \"hidden\" : \"\"}`}\n >\n {data.entries.map((entry, index) => (\n <PointsEntryRow\n key={entry.id}\n entry={entry}\n isLast={index === data.entries.length - 1}\n textColor={textColor}\n accentColor={accentColor}\n backgroundColor={backgroundColor}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport const pointsWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"PointsWidget\",\n displayName: \"Points\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Toggle title visibility\",\n defaultValue: true,\n\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the balance\",\n defaultValue: \"Points\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"md\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Balance group\n getColorField({\n key: \"balanceColor\",\n label: \"Balance Color\",\n description: \"Color for the points balance number\",\n defaultValue: \"primary\",\n\n group: \"Balance\",\n }),\n\n // History group\n {\n key: \"historyEnabled\",\n label: \"Show History\",\n type: \"boolean\",\n description: \"Show a collapsible history dropdown below the balance\",\n defaultValue: true,\n\n group: \"History\",\n },\n {\n key: \"historyTitle\",\n label: \"History Title\",\n type: \"text\",\n description: \"Title for the history dropdown\",\n defaultValue: \"History\",\n\n group: \"History\",\n requiresKeyToBeTrue: \"historyEnabled\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget\",\n defaultValue: \"background\",\n\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color\",\n defaultValue: \"foreground\",\n\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color for positive points amounts\",\n defaultValue: \"primary\",\n\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Widget padding\",\n defaultValue: 4,\n\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Widget border radius\",\n defaultValue: \"md\",\n\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
package/dist/{PortalTenantClientProvider-Bpm-CZq1.cjs → PortalTenantClientProvider-C0eJp8MN.cjs}
RENAMED
|
@@ -4,7 +4,7 @@ let react = require("react");
|
|
|
4
4
|
const AccountApiContext = (0, react.createContext)(null);
|
|
5
5
|
const AccountApiProvider = AccountApiContext.Provider;
|
|
6
6
|
function useAccountApi() {
|
|
7
|
-
const api = (0, react.
|
|
7
|
+
const api = (0, react.use)(AccountApiContext);
|
|
8
8
|
if (!api) throw new Error("useAccountApi must be used within an AccountApiProvider");
|
|
9
9
|
return api;
|
|
10
10
|
}
|
|
@@ -710,7 +710,7 @@ const PortalTenantClientProvider = PortalTenantClientContext.Provider;
|
|
|
710
710
|
* Must be used within a FluidProvider.
|
|
711
711
|
*/
|
|
712
712
|
function usePortalTenantClient() {
|
|
713
|
-
const client = (0, react.
|
|
713
|
+
const client = (0, react.use)(PortalTenantClientContext);
|
|
714
714
|
if (!client) throw new Error("usePortalTenantClient must be used within a FluidProvider");
|
|
715
715
|
return client;
|
|
716
716
|
}
|
|
@@ -1136,4 +1136,4 @@ Object.defineProperty(exports, "usePortalTenantClient", {
|
|
|
1136
1136
|
}
|
|
1137
1137
|
});
|
|
1138
1138
|
|
|
1139
|
-
//# sourceMappingURL=PortalTenantClientProvider-
|
|
1139
|
+
//# sourceMappingURL=PortalTenantClientProvider-C0eJp8MN.cjs.map
|