@fluid-app/portal-sdk 0.1.95 → 0.1.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/{ContactsScreen-hJYLdIT9.mjs → ContactsScreen-CjpjEyvy.mjs} +4 -4
  2. package/dist/{ContactsScreen-hJYLdIT9.mjs.map → ContactsScreen-CjpjEyvy.mjs.map} +1 -1
  3. package/dist/{ContactsScreen-DuTrcBkd.cjs → ContactsScreen-DEyVCqot.cjs} +5 -5
  4. package/dist/{ContactsScreen-BELhEJNe.cjs → ContactsScreen-VUKuxFcj.cjs} +4 -4
  5. package/dist/{ContactsScreen-BELhEJNe.cjs.map → ContactsScreen-VUKuxFcj.cjs.map} +1 -1
  6. package/dist/{MessagingScreen-B9V9dTBn.mjs → MessagingScreen-BDuOpf7k.mjs} +3 -3
  7. package/dist/{MessagingScreen-2a1oJ9yj.cjs → MessagingScreen-C2QId8w5.cjs} +3 -3
  8. package/dist/{MessagingScreen-CcPPK1J6.mjs → MessagingScreen-Cg1qPb5E.mjs} +3 -3
  9. package/dist/{MessagingScreen-CcPPK1J6.mjs.map → MessagingScreen-Cg1qPb5E.mjs.map} +1 -1
  10. package/dist/{MessagingScreen-dJZWI4fa.cjs → MessagingScreen-UyuRUgcd.cjs} +3 -3
  11. package/dist/{MessagingScreen-dJZWI4fa.cjs.map → MessagingScreen-UyuRUgcd.cjs.map} +1 -1
  12. package/dist/{OrdersScreen-k0x7wLRV.cjs → OrdersScreen-BDeDhRmY.cjs} +4 -4
  13. package/dist/{OrdersScreen-k0x7wLRV.cjs.map → OrdersScreen-BDeDhRmY.cjs.map} +1 -1
  14. package/dist/{OrdersScreen-hzKwBSYF.mjs → OrdersScreen-Svoa_Tgo.mjs} +4 -4
  15. package/dist/{OrdersScreen-hzKwBSYF.mjs.map → OrdersScreen-Svoa_Tgo.mjs.map} +1 -1
  16. package/dist/{OrdersScreen-DRp79-k9.cjs → OrdersScreen-kg_SQsyH.cjs} +2 -2
  17. package/dist/{ProductsScreen-BxNldFw6.cjs → ProductsScreen-CcXrvhEt.cjs} +3 -3
  18. package/dist/{ProductsScreen-BxNldFw6.cjs.map → ProductsScreen-CcXrvhEt.cjs.map} +1 -1
  19. package/dist/{ProductsScreen-hdAragYJ.cjs → ProductsScreen-DhPXnjaT.cjs} +5 -5
  20. package/dist/{ProductsScreen-B54KA40V.mjs → ProductsScreen-qNXEgjC9.mjs} +3 -3
  21. package/dist/{ProductsScreen-B54KA40V.mjs.map → ProductsScreen-qNXEgjC9.mjs.map} +1 -1
  22. package/dist/{ProductsScreen-BLHW3MHq.mjs → ProductsScreen-zQJ1iQRR.mjs} +5 -5
  23. package/dist/{ProfileScreen-DRLPIEQT.cjs → ProfileScreen-2_nSQ-oq.cjs} +2 -2
  24. package/dist/{ProfileScreen-DRLPIEQT.cjs.map → ProfileScreen-2_nSQ-oq.cjs.map} +1 -1
  25. package/dist/{ProfileScreen-DtDAJ45D.cjs → ProfileScreen-CF8Acn81.cjs} +1 -1
  26. package/dist/{ProfileScreen-Btqo-rsk.mjs → ProfileScreen-DMpBY-TD.mjs} +2 -2
  27. package/dist/{ProfileScreen-Btqo-rsk.mjs.map → ProfileScreen-DMpBY-TD.mjs.map} +1 -1
  28. package/dist/{ShareablesScreen-EJidIq4N.cjs → ShareablesScreen-DggEBWBJ.cjs} +5 -5
  29. package/dist/{ShareablesScreen-DrAZ49Iv.cjs → ShareablesScreen-DjUvqq49.cjs} +3 -3
  30. package/dist/{ShareablesScreen-DrAZ49Iv.cjs.map → ShareablesScreen-DjUvqq49.cjs.map} +1 -1
  31. package/dist/{ShareablesScreen-mJR5_fnx.mjs → ShareablesScreen-DlOwqlbr.mjs} +5 -5
  32. package/dist/{ShareablesScreen-UBSyLEbL.mjs → ShareablesScreen-q3pSmRdU.mjs} +3 -3
  33. package/dist/{ShareablesScreen-UBSyLEbL.mjs.map → ShareablesScreen-q3pSmRdU.mjs.map} +1 -1
  34. package/dist/{ShopScreen-BUri9nlR.cjs → ShopScreen-BMidW8lK.cjs} +2 -2
  35. package/dist/{ShopScreen-BUri9nlR.cjs.map → ShopScreen-BMidW8lK.cjs.map} +1 -1
  36. package/dist/{ShopScreen-Dr44ppZ7.mjs → ShopScreen-oOHel7N7.mjs} +2 -2
  37. package/dist/{ShopScreen-Dr44ppZ7.mjs.map → ShopScreen-oOHel7N7.mjs.map} +1 -1
  38. package/dist/{ShopScreen-B-9Qito4.cjs → ShopScreen-qkJC3t_U.cjs} +1 -1
  39. package/dist/{SubscriptionsScreen-BMMKqvmT.cjs → SubscriptionsScreen-DGLo_agH.cjs} +39 -114
  40. package/dist/SubscriptionsScreen-DGLo_agH.cjs.map +1 -0
  41. package/dist/{SubscriptionsScreen-DymuNO2u.mjs → SubscriptionsScreen-DGfzLW1d.mjs} +40 -115
  42. package/dist/SubscriptionsScreen-DGfzLW1d.mjs.map +1 -0
  43. package/dist/{SubscriptionsScreen-Bi0KJRf9.cjs → SubscriptionsScreen-DPgOsgwI.cjs} +3 -3
  44. package/dist/{dist-DkYXiQQ1.cjs → dist-Ck9MGRmE.cjs} +2 -2
  45. package/dist/{dist-DkYXiQQ1.cjs.map → dist-Ck9MGRmE.cjs.map} +1 -1
  46. package/dist/{dist-BbS_7TvS.cjs → dist-DRVtlgQ1.cjs} +1 -1
  47. package/dist/{dist-BbS_7TvS.cjs.map → dist-DRVtlgQ1.cjs.map} +1 -1
  48. package/dist/{dist-CMGXkSgZ.mjs → dist-NMbUD0qE.mjs} +1 -1
  49. package/dist/{dist-CMGXkSgZ.mjs.map → dist-NMbUD0qE.mjs.map} +1 -1
  50. package/dist/{dist-B1HwSrso.mjs → dist-oYNtEpKP.mjs} +2 -2
  51. package/dist/{dist-B1HwSrso.mjs.map → dist-oYNtEpKP.mjs.map} +1 -1
  52. package/dist/{es-1KItbbYg.mjs → es-C77ihvEl.mjs} +1 -1
  53. package/dist/{es-1KItbbYg.mjs.map → es-C77ihvEl.mjs.map} +1 -1
  54. package/dist/{es-BSkb3AZk.cjs → es-DlWO6buB.cjs} +1 -1
  55. package/dist/{es-BSkb3AZk.cjs.map → es-DlWO6buB.cjs.map} +1 -1
  56. package/dist/index.cjs +31 -31
  57. package/dist/index.mjs +31 -31
  58. package/dist/{order-detail-9-MS70Zm.cjs → order-detail-B5KmsBKU.cjs} +1 -1
  59. package/dist/{order-detail-9-MS70Zm.cjs.map → order-detail-B5KmsBKU.cjs.map} +1 -1
  60. package/dist/{order-detail-CYkWN7-L.mjs → order-detail-BzbdcFnt.mjs} +1 -1
  61. package/dist/{order-detail-CYkWN7-L.mjs.map → order-detail-BzbdcFnt.mjs.map} +1 -1
  62. package/dist/{src-C7RYt83r.mjs → src-iiLozCqU.mjs} +4 -4
  63. package/dist/{src-C7RYt83r.mjs.map → src-iiLozCqU.mjs.map} +1 -1
  64. package/dist/{src-DdIO0lIo.cjs → src-vyacfB0K.cjs} +4 -4
  65. package/dist/{src-DdIO0lIo.cjs.map → src-vyacfB0K.cjs.map} +1 -1
  66. package/dist/{use-account-clients-CFfdmi36.cjs → use-account-clients-BrlAG2os.cjs} +108 -6
  67. package/dist/use-account-clients-BrlAG2os.cjs.map +1 -0
  68. package/dist/{use-account-clients-0kFq_8i7.mjs → use-account-clients-vOToQZNB.mjs} +107 -5
  69. package/dist/use-account-clients-vOToQZNB.mjs.map +1 -0
  70. package/dist/{use-customer-account-Be70QBp3.mjs → use-customer-account-Bufu7Mae.mjs} +2 -2
  71. package/dist/{use-customer-account-Be70QBp3.mjs.map → use-customer-account-Bufu7Mae.mjs.map} +1 -1
  72. package/dist/{use-customer-account-BH-hwjbg.cjs → use-customer-account-CeNalSBy.cjs} +2 -2
  73. package/dist/{use-customer-account-BH-hwjbg.cjs.map → use-customer-account-CeNalSBy.cjs.map} +1 -1
  74. package/package.json +8 -8
  75. package/dist/SubscriptionsScreen-BMMKqvmT.cjs.map +0 -1
  76. package/dist/SubscriptionsScreen-DymuNO2u.mjs.map +0 -1
  77. package/dist/use-account-clients-0kFq_8i7.mjs.map +0 -1
  78. package/dist/use-account-clients-CFfdmi36.cjs.map +0 -1
  79. /package/dist/{src-B7j_mfeS.mjs → src-BakNjVTk.mjs} +0 -0
  80. /package/dist/{src-Bp-dRR29.cjs → src-C_kOrGdZ.cjs} +0 -0
@@ -34,6 +34,6 @@ require("./TableWidget-Duw_7iyh.cjs");
34
34
  require("./ToDoWidget-eGB9cfou.cjs");
35
35
  require("./VideoWidget-CNHJrY7I.cjs");
36
36
  require("./ScreenHeaderContext-wrJlkhgN.cjs");
37
- const require_ShopScreen = require("./ShopScreen-BUri9nlR.cjs");
37
+ const require_ShopScreen = require("./ShopScreen-BMidW8lK.cjs");
38
38
  exports.ShopScreen = require_ShopScreen.ShopScreen;
39
39
  exports.shopScreenPropertySchema = require_ShopScreen.shopScreenPropertySchema;
@@ -1,103 +1,29 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
2
  const require_src = require("./src-DGjAAfmN.cjs");
3
- const require_use_account_clients = require("./use-account-clients-CFfdmi36.cjs");
3
+ const require_use_account_clients = require("./use-account-clients-BrlAG2os.cjs");
4
4
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-wrJlkhgN.cjs");
5
5
  const require_AppNavigationContext = require("./AppNavigationContext-DnwdUAjn.cjs");
6
- const require_order_detail = require("./order-detail-9-MS70Zm.cjs");
7
- const require_use_customer_account = require("./use-customer-account-BH-hwjbg.cjs");
6
+ const require_order_detail = require("./order-detail-B5KmsBKU.cjs");
7
+ const require_use_customer_account = require("./use-customer-account-CeNalSBy.cjs");
8
8
  let react = require("react");
9
9
  let _tanstack_react_query = require("@tanstack/react-query");
10
10
  let react_jsx_runtime = require("react/jsx-runtime");
11
11
  let lucide_react = require("lucide-react");
12
12
  let clsx = require("clsx");
13
13
  let tailwind_merge = require("tailwind-merge");
14
- //#region ../../subscriptions/api-client/src/namespaces/subscriptions.ts
15
- /**
16
- * Fetch a paginated list of customer subscriptions.
17
- * Endpoint: GET /subscriptions
18
- */
19
- async function fetchCustomerSubscriptions(client, params) {
20
- const input = {
21
- customer_id: params.customerId.toString(),
22
- page: (params.page ?? 1).toString(),
23
- per_page: (params.perPage ?? 10).toString()
24
- };
25
- if (params.status != null) input.status = params.status;
26
- if (params.search != null) input.search = params.search;
27
- if (params.sortBy != null) input.sort_by = params.sortBy;
28
- if (params.sortDirection != null) input.sort_direction = params.sortDirection;
29
- return client.get("/subscriptions", input);
30
- }
31
- /**
32
- * Fetch a single subscription by token.
33
- * Endpoint: GET /subscriptions/{token}
34
- */
35
- async function fetchSubscription(client, subscriptionToken) {
36
- return client.get(`/subscriptions/${subscriptionToken}`);
37
- }
38
- /**
39
- * Pause a subscription.
40
- * Endpoint: POST /subscriptions/{token}/pause
41
- */
42
- async function pauseSubscription(client, subscriptionToken, params) {
43
- const queryParams = { customer_id: params.customerId.toString() };
44
- if (params.nextBillDate != null) queryParams.next_bill_date = params.nextBillDate;
45
- if (params.numberOfOrders != null) queryParams.number_of_orders = params.numberOfOrders.toString();
46
- const query = new URLSearchParams(queryParams).toString();
47
- return client.post(`/subscriptions/${subscriptionToken}/pause?${query}`);
48
- }
49
- /**
50
- * Resume a paused subscription.
51
- * Endpoint: POST /subscriptions/{token}/resume
52
- */
53
- async function resumeSubscription(client, subscriptionToken, params) {
54
- const query = new URLSearchParams({
55
- customer_id: params.customerId.toString(),
56
- next_bill_date: params.nextBillDate
57
- }).toString();
58
- return client.post(`/subscriptions/${subscriptionToken}/resume?${query}`);
59
- }
60
- /**
61
- * Skip the next billing cycle.
62
- * Endpoint: POST /subscriptions/{token}/skip_next_billing
63
- */
64
- async function skipSubscription(client, subscriptionToken, params) {
65
- const query = new URLSearchParams({
66
- customer_id: params.customerId.toString(),
67
- next_bill_date: params.nextBillDate
68
- }).toString();
69
- return client.post(`/subscriptions/${subscriptionToken}/skip_next_billing?${query}`);
70
- }
71
- /**
72
- * Cancel a subscription.
73
- * Endpoint: POST /subscriptions/{token}/cancel
74
- */
75
- async function cancelSubscription(client, subscriptionToken, customerId) {
76
- const query = new URLSearchParams({ customer_id: customerId.toString() }).toString();
77
- return client.post(`/subscriptions/${subscriptionToken}/cancel?${query}`);
78
- }
79
- /**
80
- * Reactivate a cancelled subscription.
81
- * Endpoint: POST /subscriptions/{token}/reactivate
82
- */
83
- async function reactivateSubscription(client, subscriptionToken, params) {
84
- const body = params.process_immediately === true ? { process_immediately: true } : params.next_bill_date ? { next_bill_date: params.next_bill_date } : {};
85
- return client.post(`/subscriptions/${subscriptionToken}/reactivate`, Object.keys(body).length > 0 ? body : void 0);
86
- }
87
- //#endregion
88
14
  //#region ../../subscriptions/core/src/context.ts
89
- const SubscriptionsClientContext = (0, react.createContext)(null);
90
- const SubscriptionsClientProvider = SubscriptionsClientContext.Provider;
91
- function useSubscriptionsClient() {
92
- const client = (0, react.useContext)(SubscriptionsClientContext);
93
- if (!client) throw new Error("useSubscriptionsClient must be used within a SubscriptionsCoreProvider");
94
- return client;
15
+ const SubscriptionsApiContext = (0, react.createContext)(null);
16
+ const SubscriptionsApiProvider = SubscriptionsApiContext.Provider;
17
+ function useSubscriptionsApi() {
18
+ const api = (0, react.useContext)(SubscriptionsApiContext);
19
+ if (!api) throw new Error("useSubscriptionsApi must be used within a SubscriptionsCoreProvider");
20
+ return api;
95
21
  }
96
22
  //#endregion
97
23
  //#region ../../subscriptions/core/src/provider.tsx
98
- function SubscriptionsCoreProvider({ client, children }) {
99
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionsClientProvider, {
100
- value: client,
24
+ function SubscriptionsCoreProvider({ api, children }) {
25
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionsApiProvider, {
26
+ value: api,
101
27
  children
102
28
  });
103
29
  }
@@ -119,30 +45,30 @@ const subscriptionsKeys = {
119
45
  //#endregion
120
46
  //#region ../../subscriptions/core/src/hooks/use-subscriptions.ts
121
47
  function useSubscriptions(params, options) {
122
- const client = useSubscriptionsClient();
48
+ const api = useSubscriptionsApi();
123
49
  return (0, _tanstack_react_query.useQuery)({
124
50
  queryKey: subscriptionsKeys.list(params),
125
- queryFn: () => fetchCustomerSubscriptions(client, params),
51
+ queryFn: () => api.fetchCustomerSubscriptions(params),
126
52
  enabled: options?.enabled ?? !!params.customerId
127
53
  });
128
54
  }
129
55
  //#endregion
130
56
  //#region ../../subscriptions/core/src/hooks/use-subscription.ts
131
57
  function useSubscription(token, options) {
132
- const client = useSubscriptionsClient();
58
+ const api = useSubscriptionsApi();
133
59
  return (0, _tanstack_react_query.useQuery)({
134
60
  queryKey: subscriptionsKeys.detail(token),
135
- queryFn: () => fetchSubscription(client, token),
61
+ queryFn: () => api.fetchSubscription(token),
136
62
  enabled: (options?.enabled ?? true) && !!token
137
63
  });
138
64
  }
139
65
  //#endregion
140
66
  //#region ../../subscriptions/core/src/hooks/use-pause-subscription.ts
141
67
  function usePauseSubscription(options) {
142
- const client = useSubscriptionsClient();
68
+ const api = useSubscriptionsApi();
143
69
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
144
70
  return (0, _tanstack_react_query.useMutation)({
145
- mutationFn: (params) => pauseSubscription(client, params.subscriptionToken, params.pauseParams),
71
+ mutationFn: (params) => api.pauseSubscription(params.subscriptionToken, params.pauseParams),
146
72
  onSuccess: () => {
147
73
  queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });
148
74
  options?.onSuccess?.();
@@ -153,10 +79,10 @@ function usePauseSubscription(options) {
153
79
  //#endregion
154
80
  //#region ../../subscriptions/core/src/hooks/use-resume-subscription.ts
155
81
  function useResumeSubscription(options) {
156
- const client = useSubscriptionsClient();
82
+ const api = useSubscriptionsApi();
157
83
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
158
84
  return (0, _tanstack_react_query.useMutation)({
159
- mutationFn: (params) => resumeSubscription(client, params.subscriptionToken, params.resumeParams),
85
+ mutationFn: (params) => api.resumeSubscription(params.subscriptionToken, params.resumeParams),
160
86
  onSuccess: () => {
161
87
  queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });
162
88
  options?.onSuccess?.();
@@ -167,10 +93,10 @@ function useResumeSubscription(options) {
167
93
  //#endregion
168
94
  //#region ../../subscriptions/core/src/hooks/use-skip-subscription.ts
169
95
  function useSkipSubscription(options) {
170
- const client = useSubscriptionsClient();
96
+ const api = useSubscriptionsApi();
171
97
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
172
98
  return (0, _tanstack_react_query.useMutation)({
173
- mutationFn: (params) => skipSubscription(client, params.subscriptionToken, params.skipParams),
99
+ mutationFn: (params) => api.skipSubscription(params.subscriptionToken, params.skipParams),
174
100
  onSuccess: () => {
175
101
  queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });
176
102
  options?.onSuccess?.();
@@ -181,10 +107,10 @@ function useSkipSubscription(options) {
181
107
  //#endregion
182
108
  //#region ../../subscriptions/core/src/hooks/use-cancel-subscription.ts
183
109
  function useCancelSubscription(options) {
184
- const client = useSubscriptionsClient();
110
+ const api = useSubscriptionsApi();
185
111
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
186
112
  return (0, _tanstack_react_query.useMutation)({
187
- mutationFn: (params) => cancelSubscription(client, params.subscriptionToken, params.customerId),
113
+ mutationFn: (params) => api.cancelSubscription(params.subscriptionToken, params.customerId),
188
114
  onSuccess: () => {
189
115
  queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });
190
116
  options?.onSuccess?.();
@@ -195,10 +121,10 @@ function useCancelSubscription(options) {
195
121
  //#endregion
196
122
  //#region ../../subscriptions/core/src/hooks/use-reactivate-subscription.ts
197
123
  function useReactivateSubscription(options) {
198
- const client = useSubscriptionsClient();
124
+ const api = useSubscriptionsApi();
199
125
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
200
126
  return (0, _tanstack_react_query.useMutation)({
201
- mutationFn: (params) => reactivateSubscription(client, params.subscriptionToken, params.reactivateParams),
127
+ mutationFn: (params) => api.reactivateSubscription(params.subscriptionToken, params.reactivateParams),
202
128
  onSuccess: () => {
203
129
  queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });
204
130
  options?.onSuccess?.();
@@ -643,10 +569,10 @@ const translations = {
643
569
  pagination: "Pagination"
644
570
  };
645
571
  function SubscriptionsListScreen({ customerId, isLoadingCustomer }) {
646
- const subscriptionsClient = require_use_account_clients.useSubscriptionsClient();
572
+ const subscriptionsApi = require_use_account_clients.useSubscriptionsApiClient();
647
573
  const { navigate } = require_AppNavigationContext.useAppNavigation();
648
574
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionsCoreProvider, {
649
- client: subscriptionsClient,
575
+ api: subscriptionsApi,
650
576
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionsListScreen$1, {
651
577
  customerId,
652
578
  isLoadingCustomer,
@@ -1136,20 +1062,19 @@ function SubscriptionDetail({ token, onNotFound, onError, onSuccess, onMutationE
1136
1062
  onSuccess: () => onSuccess?.("Subscription reactivated"),
1137
1063
  onError: (err) => onMutationError?.("Failed to reactivate subscription", err)
1138
1064
  });
1065
+ const onErrorRef = (0, react.useRef)(onError);
1066
+ onErrorRef.current = onError;
1067
+ const onNotFoundRef = (0, react.useRef)(onNotFound);
1068
+ onNotFoundRef.current = onNotFound;
1139
1069
  (0, react.useEffect)(() => {
1140
- if (!isLoading && error) onError?.(error);
1141
- }, [
1142
- isLoading,
1143
- error,
1144
- onError
1145
- ]);
1070
+ if (!isLoading && error) onErrorRef.current?.(error);
1071
+ }, [isLoading, error]);
1146
1072
  (0, react.useEffect)(() => {
1147
- if (!isLoading && !error && !subscription) onNotFound?.();
1073
+ if (!isLoading && !error && !subscription) onNotFoundRef.current?.();
1148
1074
  }, [
1149
1075
  isLoading,
1150
1076
  error,
1151
- subscription,
1152
- onNotFound
1077
+ subscription
1153
1078
  ]);
1154
1079
  if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionDetailSkeleton, {});
1155
1080
  if (!subscription) return null;
@@ -1254,10 +1179,10 @@ function SubscriptionDetailScreen$1({ token, onNavigateToList, onNotFound, onErr
1254
1179
  //#endregion
1255
1180
  //#region src/screens/SubscriptionDetailScreen.tsx
1256
1181
  function SubscriptionDetailScreen({ token, onToast }) {
1257
- const client = require_use_account_clients.useSubscriptionsClient();
1182
+ const subscriptionsApi = require_use_account_clients.useSubscriptionsApiClient();
1258
1183
  const { navigate } = require_AppNavigationContext.useAppNavigation();
1259
1184
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionsCoreProvider, {
1260
- client,
1185
+ api: subscriptionsApi,
1261
1186
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SubscriptionDetailScreen$1, {
1262
1187
  token,
1263
1188
  onNavigateToList: () => navigate("subscriptions"),
@@ -1334,4 +1259,4 @@ Object.defineProperty(exports, "subscriptionsScreenPropertySchema", {
1334
1259
  }
1335
1260
  });
1336
1261
 
1337
- //# sourceMappingURL=SubscriptionsScreen-BMMKqvmT.cjs.map
1262
+ //# sourceMappingURL=SubscriptionsScreen-DGLo_agH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriptionsScreen-DGLo_agH.cjs","names":["Button","Search","Input","Skeleton","TableColumn","PaginationFooter","SubscriptionsListScreen","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","useSubscriptionsApiClient","useAppNavigation","SubscriptionsListScreenContent","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Skeleton","Button","SkipForward","Pause","Play","XCircle","RotateCcw","SubscriptionDetailScreen","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useSubscriptionsApiClient","useAppNavigation","SubscriptionDetailScreenContent","useAppNavigation","useCustomerAccount"],"sources":["../../../subscriptions/core/src/context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/components/subscriptions-list.tsx","../../../subscriptions/ui/src/screens/SubscriptionsListScreen.tsx","../src/screens/SubscriptionsListScreen.tsx","../../../subscriptions/ui/src/components/confirm-dialog.tsx","../../../subscriptions/ui/src/components/subscription-detail.tsx","../../../subscriptions/ui/src/screens/SubscriptionDetailScreen.tsx","../src/screens/SubscriptionDetailScreen.tsx","../src/screens/SubscriptionsScreen.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\n\nconst SubscriptionsApiContext = createContext<SubscriptionsApi | null>(null);\n\nexport const SubscriptionsApiProvider = SubscriptionsApiContext.Provider;\n\nexport function useSubscriptionsApi(): SubscriptionsApi {\n const api = useContext(SubscriptionsApiContext);\n if (!api) {\n throw new Error(\n \"useSubscriptionsApi must be used within a SubscriptionsCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\nimport { SubscriptionsApiProvider } from \"./context\";\n\nexport interface SubscriptionsCoreProviderProps {\n api: SubscriptionsApi;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n api,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsApiProvider value={api}>{children}</SubscriptionsApiProvider>\n );\n}\n","import type { subscriptions } from \"./types\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => api.fetchCustomerSubscriptions(params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => api.fetchSubscription(token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) => api.pauseSubscription(params.subscriptionToken, params.pauseParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) => api.resumeSubscription(params.subscriptionToken, params.resumeParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) => api.skipSubscription(params.subscriptionToken, params.skipParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId: number }) =>\n api.cancelSubscription(params.subscriptionToken, params.customerId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n api.reactivateSubscription(\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const datePortion = dateString.split(\"T\")[0] ?? dateString;\n const parts = datePortion.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport 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\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","import { useState, useEffect, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptions } from \"@fluid-app/subscriptions-core\";\nimport { TableColumn, PaginationFooter } from \"@fluid-app/orders-ui\";\nimport { Search } from \"lucide-react\";\nimport { Button, Input, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport { formatCurrency, startCase, formatNextBillDate } from \"../lib/format\";\nimport { StatusPill } from \"./status-pill\";\n\nexport interface SubscriptionsListProps {\n customerId: number | undefined;\n onSubscriptionClick: (subscriptionToken: string) => void;\n t: (key: string) => string;\n pageSize?: number;\n}\n\nexport function SubscriptionsList({\n customerId,\n onSubscriptionClick,\n t,\n pageSize = 10,\n}: SubscriptionsListProps): JSX.Element {\n const [currentPage, setCurrentPage] = useState(1);\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [search, setSearch] = useState<string | null>(null);\n const [sortBy, setSortBy] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n }>({\n column: \"next_bill_date\",\n direction: \"desc\",\n });\n\n const params: subscriptions.FetchSubscriptionsParams = {\n customerId: customerId ?? 0,\n page: currentPage,\n perPage: pageSize,\n status: statusFilter,\n search,\n sortBy: sortBy.column,\n sortDirection: sortBy.direction,\n };\n\n const { data, isLoading } = useSubscriptions(params, {\n enabled: !!customerId,\n });\n\n // Reset page when filters change\n useEffect(() => {\n setCurrentPage(1);\n }, [statusFilter, search, sortBy]);\n\n const items = data?.subscriptions ?? [];\n const totalItems = data?.meta?.pagination?.total_count ?? 0;\n const totalPages = data?.meta?.pagination?.total_pages ?? 1;\n\n const handleSubscriptionClick = (token: string) => {\n if (token) {\n onSubscriptionClick(token);\n }\n };\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n {/* header: filter buttons + search */}\n <div className=\"flex flex-col gap-2 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(null)}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === null && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"all\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"active\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"active\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"active\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"inactive\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"inactive\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"inactive\")}\n </Button>\n </div>\n <div className=\"relative w-full sm:w-auto sm:min-w-[220px]\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n <Search className=\"text-muted-foreground h-4 w-4\" />\n </div>\n <Input\n type=\"search\"\n value={search ?? \"\"}\n onChange={(e) => setSearch(e.target.value || null)}\n className=\"h-10 w-full pl-10\"\n placeholder={t(\"subscriptions\")}\n />\n </div>\n </div>\n\n {/* mobile view */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <div\n key={`skeleton-${index}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"flex space-x-3\">\n <Skeleton className=\"h-12 w-12 rounded-md\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n </div>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n {t(\"no_subscriptions_found\")}\n </div>\n ) : (\n items.map((subscription) => (\n <div\n key={subscription.subscription_token}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors duration-200 ease-in-out last:border-b-0\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <div className=\"flex items-start space-x-3\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <div className=\"w-0 min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </p>\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-sm\">\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"next_bill_date\")}\n </span>\n <span className=\"text-muted-foreground\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"price\")}\n </span>\n <span className=\"text-foreground font-medium\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </div>\n </div>\n <div className=\"mt-2\">\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"status\")}\n </span>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* desktop view */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-[45%] min-w-[240px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n <col className=\"w-[15%] min-w-[100px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n </colgroup>\n <thead className=\"bg-muted\">\n <tr className=\"h-10\">\n <TableColumn label={t(\"product\")} sortable={false} />\n <TableColumn\n label={t(\"next_bill_date\")}\n sortBy=\"next_bill_date\"\n sortData={sortBy}\n onSortClick={(value: string) =>\n setSortBy({\n column: value,\n direction: sortBy.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n />\n <TableColumn label={t(\"price\")} sortable={false} />\n <TableColumn label={t(\"status\")} sortable={false} />\n </tr>\n </thead>\n <tbody className=\"divide-border bg-background divide-y\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <tr key={`skeleton-${index}`}>\n <td className=\"px-3 py-4\">\n <div className=\"flex items-center space-x-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-16\" />\n </td>\n </tr>\n ))\n ) : items.length === 0 ? (\n <tr>\n <td\n colSpan={4}\n className=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {t(\"no_subscriptions_found\")}\n </td>\n </tr>\n ) : (\n items.map((subscription) => (\n <tr\n key={subscription.subscription_token}\n className=\"hover:bg-muted cursor-pointer transition-colors duration-200 ease-in-out\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <td className=\"text-muted-foreground flex max-w-[280px] items-center space-x-3 py-4 pr-3 pl-3 text-sm\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <span className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </span>\n </td>\n <td className=\"text-muted-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <span className=\"text-muted-foreground\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={totalItems}\n onPageChange={setCurrentPage}\n t={t}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { SubscriptionsList } from \"../components/subscriptions-list\";\n\nexport interface SubscriptionsListScreenProps {\n customerId: number | undefined;\n onSubscriptionClick: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function SubscriptionsListScreen({\n customerId,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: SubscriptionsListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Subscriptions\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\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 <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\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 <SubscriptionsList\n customerId={customerId}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionsListScreen as SubscriptionsListScreenContent } from \"@fluid-app/subscriptions-ui/screens/SubscriptionsListScreen\";\nimport { useSubscriptionsApiClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n search: \"Search\",\n subscriptions: \"Search subscriptions...\",\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\ninterface SubscriptionsListScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nexport function SubscriptionsListScreen({\n customerId,\n isLoadingCustomer,\n}: SubscriptionsListScreenProps): React.JSX.Element {\n const subscriptionsApi = useSubscriptionsApiClient();\n const { navigate } = useAppNavigation();\n\n return (\n <SubscriptionsCoreProvider api={subscriptionsApi}>\n <SubscriptionsListScreenContent\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onSubscriptionClick={(subscriptionToken) =>\n navigate(`subscriptions/${subscriptionToken}`)\n }\n t={(key) => translations[key] ?? key}\n />\n </SubscriptionsCoreProvider>\n );\n}\n","import { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogCancel,\n AlertDialogAction,\n} from \"@fluid-app/ui-primitives\";\n\ninterface ConfirmDialogProps {\n title: string;\n description: string;\n actionButtonText?: string;\n cancelButtonText?: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n}\n\nexport function ConfirmDialog({\n title,\n description,\n actionButtonText = \"Delete\",\n cancelButtonText = \"Cancel\",\n open,\n setOpen,\n onConfirm,\n}: ConfirmDialogProps) {\n const [isPending, setIsPending] = useState(false);\n\n const handleConfirm = async () => {\n try {\n const result = onConfirm();\n if (result instanceof Promise) {\n setIsPending(true);\n await result;\n }\n } catch (error) {\n console.error(\"ConfirmDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n setOpen(false);\n }\n };\n\n return (\n <AlertDialog open={open} onOpenChange={(v) => !isPending && setOpen(v)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isPending}>\n {cancelButtonText}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleConfirm}\n disabled={isPending}\n className=\"bg-red-600 text-white hover:bg-red-500\"\n >\n {isPending ? \"...\" : actionButtonText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useState, useEffect, useRef, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport {\n useSubscription,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n formatSubscriptionFrequency,\n formatDate,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { SkipForward, Pause, Play, XCircle, RotateCcw } from \"lucide-react\";\nimport { Skeleton, Button } from \"@fluid-app/ui-primitives\";\nimport { ConfirmDialog } from \"./confirm-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\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=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-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 <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\nfunction SubscriptionItemsSection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\n\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 {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Your Upcoming Order\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Order Date\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {getNextBillDisplay(subscription)}\n </div>\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Bill Amount\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center space-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row space-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || \"Product image\"}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center\">\n No image\n </div>\n )}\n {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 {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Subtotal\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Discount\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n *Tax and shipping calculated at checkout\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}) {\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Actions\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next Order</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause Subscription</span>\n </Button>\n )}\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume Subscription</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled ? \"Cancelled\" : \"Cancel Subscription\"}\n </span>\n </Button>\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate Subscription</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Subscription Details\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n Order Frequency\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">Next Payment</div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n </div>\n {subscription.last_bill_date && (\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Last Billed</div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Payment & Shipping\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n Shipping Address\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Payment Method\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? \"Card\"}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ending in ${paymentDetails.last4}`\n : \"\"}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Order History */}\n {subscription.orders.length > 0 && (\n <div className=\"border-border mb-4 border-b pb-4\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order History\n </h3>\n <div className=\"overflow-x-auto\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead>\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 text-left font-medium\">\n Order\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Date\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Status\n </th>\n <th className=\"text-muted-foreground py-2 pl-3 text-right font-medium\">\n Amount\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : \"N/A\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n}: SubscriptionDetailProps): JSX.Element | null {\n const [showCancelModal, setShowCancelModal] = useState(false);\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(\"Subscription paused\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to pause subscription\", err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(\"Subscription resumed\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to resume subscription\", err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(\"Next billing skipped\"),\n onError: (err: unknown) => onMutationError?.(\"Failed to skip billing\", err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(\"Subscription cancelled\");\n setShowCancelModal(false);\n },\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to cancel subscription\", err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(\"Subscription reactivated\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to reactivate subscription\", err),\n });\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onNotFoundRef = useRef(onNotFound);\n onNotFoundRef.current = onNotFound;\n\n useEffect(() => {\n if (!isLoading && error) {\n onErrorRef.current?.(error as Error);\n }\n }, [isLoading, error]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFoundRef.current?.();\n }\n }, [isLoading, error, subscription]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending;\n\n const handlePause = () => {\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: { customerId },\n });\n };\n\n const handleResume = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n resumeMutation.mutate({\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n });\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n return (\n <>\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection subscription={subscription} />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={handlePause}\n onResume={handleResume}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n />\n </div>\n <ConfirmDialog\n title=\"Cancel Subscription\"\n actionButtonText=\"Cancel Subscription\"\n description=\"Are you sure you want to cancel this subscription? You can reactivate it later.\"\n open={showCancelModal}\n setOpen={setShowCancelModal}\n onConfirm={handleCancel}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate</span>\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { SubscriptionDetail } from \"../components/subscription-detail\";\n\nexport interface SubscriptionDetailScreenProps {\n token: string;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onNavigateToList,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n}: SubscriptionDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Subscriptions\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Subscription #{token}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [token, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\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 <SubscriptionDetail\n token={token}\n onNotFound={onNotFound}\n onError={onError}\n onSuccess={onSuccess}\n onMutationError={onMutationError}\n />\n </div>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionDetailScreen as SubscriptionDetailScreenContent } from \"@fluid-app/subscriptions-ui/screens/SubscriptionDetailScreen\";\nimport { useSubscriptionsApiClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface SubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onToast,\n}: SubscriptionDetailScreenProps): React.JSX.Element {\n const subscriptionsApi = useSubscriptionsApiClient();\n const { navigate } = useAppNavigation();\n\n return (\n <SubscriptionsCoreProvider api={subscriptionsApi}>\n <SubscriptionDetailScreenContent\n token={token}\n onNavigateToList={() => navigate(\"subscriptions\")}\n onNotFound={() => {\n onToast(\"Subscription not found\", \"warning\");\n navigate(\"subscriptions\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load subscription: ${message}`, \"error\");\n }}\n onSuccess={(message) => {\n onToast(message, \"success\");\n }}\n onMutationError={(message, err) => {\n const detail =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`${message}: ${detail}`, \"error\");\n }}\n />\n </SubscriptionsCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\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 { useCustomerAccount } from \"../account/use-customer-account\";\nimport { SubscriptionsListScreen } from \"./SubscriptionsListScreen\";\nimport { SubscriptionDetailScreen } from \"./SubscriptionDetailScreen\";\n\ntype SubscriptionsScreenProps = 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 if (type === \"error\" || type === \"warning\") {\n console.warn(\"[Subscriptions]\", message);\n } else {\n console.info(\"[Subscriptions]\", message);\n }\n}\n\nexport function SubscriptionsScreen({\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}: SubscriptionsScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"subscriptions\" → list, \"subscriptions/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n const { customerId, isLoadingCustomer, isCustomerError } = useCustomerAccount(\n { enabled: !isDetailView },\n );\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <SubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n </div>\n );\n }\n\n if (isCustomerError && !isLoadingCustomer) {\n return (\n <div {...divProps}>\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <SubscriptionsListScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n </div>\n );\n}\n\nexport const subscriptionsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"SubscriptionsScreen\",\n displayName: \"Subscriptions Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}