@sudobility/subscription_pages 0.0.5 → 0.0.6
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/index.js +144 -141
- package/dist/pages/SubscriptionByOfferPage.d.ts +6 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { jsx as i, jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { usePackagesByDuration as
|
|
4
|
-
import { SubscriptionLayout as
|
|
5
|
-
function
|
|
1
|
+
import { jsx as i, jsxs as E } from "react/jsx-runtime";
|
|
2
|
+
import { useState as S } from "react";
|
|
3
|
+
import { usePackagesByDuration as oe, useUserSubscription as V, getSubscriptionInstance as X, refreshSubscription as Z, useAllOfferings as le, useOfferingPackages as se, periodToMonths as J } from "@sudobility/subscription_lib";
|
|
4
|
+
import { SubscriptionLayout as L, SubscriptionTile as ue, SegmentedControl as ee } from "@sudobility/subscription-components";
|
|
5
|
+
function me({
|
|
6
6
|
isLoggedIn: n,
|
|
7
|
-
onNavigateToLogin:
|
|
8
|
-
userId:
|
|
7
|
+
onNavigateToLogin: l,
|
|
8
|
+
userId: p,
|
|
9
9
|
userEmail: o,
|
|
10
|
-
featuresByPackage:
|
|
11
|
-
freeFeatures:
|
|
12
|
-
title:
|
|
13
|
-
className:
|
|
10
|
+
featuresByPackage: f,
|
|
11
|
+
freeFeatures: s,
|
|
12
|
+
title: g = "Choose Your Plan",
|
|
13
|
+
className: y
|
|
14
14
|
}) {
|
|
15
15
|
const {
|
|
16
|
-
packagesByDuration:
|
|
17
|
-
availableDurations:
|
|
18
|
-
isLoading:
|
|
19
|
-
error:
|
|
20
|
-
} =
|
|
16
|
+
packagesByDuration: x,
|
|
17
|
+
availableDurations: h,
|
|
18
|
+
isLoading: D,
|
|
19
|
+
error: b
|
|
20
|
+
} = oe(), {
|
|
21
21
|
subscription: r,
|
|
22
|
-
isLoading:
|
|
23
|
-
error:
|
|
24
|
-
} = V({ userId:
|
|
22
|
+
isLoading: $,
|
|
23
|
+
error: B
|
|
24
|
+
} = V({ userId: p, userEmail: o }), [e, N] = S(null), [F, u] = S(null), [M, P] = S(!1), C = e ?? h[0] ?? null, O = D || $, I = b || B, w = async (t, m) => {
|
|
25
25
|
try {
|
|
26
|
-
|
|
26
|
+
P(!0), u(null), await X().purchase({
|
|
27
27
|
packageId: t,
|
|
28
|
-
offeringId:
|
|
28
|
+
offeringId: m,
|
|
29
29
|
customerEmail: o
|
|
30
30
|
}), await Z();
|
|
31
|
-
} catch (
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
} catch (d) {
|
|
32
|
+
u(
|
|
33
|
+
d instanceof Error ? d.message : "Purchase failed"
|
|
34
34
|
);
|
|
35
35
|
} finally {
|
|
36
|
-
|
|
36
|
+
P(!1);
|
|
37
37
|
}
|
|
38
|
-
},
|
|
38
|
+
}, R = () => n ? (r == null ? void 0 : r.isActive) && r.packageId ? {
|
|
39
39
|
title: "Free",
|
|
40
40
|
price: "$0",
|
|
41
|
-
features:
|
|
41
|
+
features: s ?? [],
|
|
42
42
|
ctaButton: {
|
|
43
43
|
label: "Cancel Subscription",
|
|
44
44
|
onClick: () => {
|
|
@@ -48,7 +48,7 @@ function he({
|
|
|
48
48
|
} : {
|
|
49
49
|
title: "Free",
|
|
50
50
|
price: "$0",
|
|
51
|
-
features:
|
|
51
|
+
features: s ?? [],
|
|
52
52
|
ctaButton: {
|
|
53
53
|
label: "Current Plan"
|
|
54
54
|
},
|
|
@@ -56,38 +56,38 @@ function he({
|
|
|
56
56
|
} : {
|
|
57
57
|
title: "Free",
|
|
58
58
|
price: "$0",
|
|
59
|
-
features:
|
|
59
|
+
features: s ?? [],
|
|
60
60
|
ctaButton: {
|
|
61
61
|
label: "Try it for Free",
|
|
62
|
-
onClick:
|
|
62
|
+
onClick: l
|
|
63
63
|
}
|
|
64
|
-
},
|
|
64
|
+
}, A = (t) => {
|
|
65
65
|
if (!n)
|
|
66
66
|
return {
|
|
67
67
|
label: "Log in to Continue",
|
|
68
|
-
onClick:
|
|
68
|
+
onClick: l
|
|
69
69
|
};
|
|
70
|
-
const
|
|
70
|
+
const m = (r == null ? void 0 : r.isActive) && r.packageId;
|
|
71
71
|
if ((r == null ? void 0 : r.packageId) !== t.package.packageId)
|
|
72
|
-
return
|
|
72
|
+
return m ? {
|
|
73
73
|
label: "Change Subscription",
|
|
74
|
-
onClick: () =>
|
|
74
|
+
onClick: () => w(t.package.packageId, t.offerId)
|
|
75
75
|
} : {
|
|
76
76
|
label: "Subscribe",
|
|
77
|
-
onClick: () =>
|
|
77
|
+
onClick: () => w(t.package.packageId, t.offerId)
|
|
78
78
|
};
|
|
79
79
|
};
|
|
80
|
-
if (
|
|
80
|
+
if (O)
|
|
81
81
|
return /* @__PURE__ */ i(
|
|
82
|
-
|
|
82
|
+
L,
|
|
83
83
|
{
|
|
84
|
-
title:
|
|
85
|
-
className:
|
|
84
|
+
title: g,
|
|
85
|
+
className: y,
|
|
86
86
|
variant: "cta",
|
|
87
87
|
children: /* @__PURE__ */ i("p", { children: "Loading subscription plans..." })
|
|
88
88
|
}
|
|
89
89
|
);
|
|
90
|
-
const
|
|
90
|
+
const T = F ?? (I ? I.message : null), U = n && (r != null && r.isActive) && r.packageId ? {
|
|
91
91
|
isActive: !0,
|
|
92
92
|
activeContent: {
|
|
93
93
|
title: "Active Subscription",
|
|
@@ -107,44 +107,44 @@ function he({
|
|
|
107
107
|
] : []
|
|
108
108
|
]
|
|
109
109
|
}
|
|
110
|
-
} : void 0,
|
|
110
|
+
} : void 0, Y = C ? x[C] ?? [] : [];
|
|
111
111
|
return /* @__PURE__ */ i(
|
|
112
|
-
|
|
112
|
+
L,
|
|
113
113
|
{
|
|
114
|
-
title:
|
|
115
|
-
className:
|
|
114
|
+
title: g,
|
|
115
|
+
className: y,
|
|
116
116
|
variant: "cta",
|
|
117
|
-
error:
|
|
118
|
-
currentStatus:
|
|
119
|
-
freeTileConfig:
|
|
120
|
-
aboveProducts:
|
|
117
|
+
error: T,
|
|
118
|
+
currentStatus: U,
|
|
119
|
+
freeTileConfig: R(),
|
|
120
|
+
aboveProducts: h.length > 1 ? /* @__PURE__ */ i(
|
|
121
121
|
ee,
|
|
122
122
|
{
|
|
123
|
-
options:
|
|
123
|
+
options: h.map((t) => ({
|
|
124
124
|
value: t,
|
|
125
125
|
label: t.charAt(0).toUpperCase() + t.slice(1)
|
|
126
126
|
})),
|
|
127
|
-
value:
|
|
128
|
-
onChange: (t) =>
|
|
127
|
+
value: C ?? h[0],
|
|
128
|
+
onChange: (t) => N(t)
|
|
129
129
|
}
|
|
130
130
|
) : void 0,
|
|
131
|
-
children:
|
|
132
|
-
var
|
|
133
|
-
const
|
|
131
|
+
children: Y.map((t) => {
|
|
132
|
+
var k;
|
|
133
|
+
const m = n && (r == null ? void 0 : r.isActive) && r.packageId === t.package.packageId, d = A(t);
|
|
134
134
|
return /* @__PURE__ */ i(
|
|
135
|
-
|
|
135
|
+
ue,
|
|
136
136
|
{
|
|
137
137
|
id: t.package.packageId,
|
|
138
138
|
title: t.package.name,
|
|
139
|
-
price: ((
|
|
139
|
+
price: ((k = t.package.product) == null ? void 0 : k.priceString) ?? "$0",
|
|
140
140
|
periodLabel: t.package.product ? `/${t.package.product.period}` : void 0,
|
|
141
|
-
features: (
|
|
141
|
+
features: (f == null ? void 0 : f[t.package.packageId]) ?? [],
|
|
142
142
|
isSelected: !1,
|
|
143
143
|
onSelect: () => {
|
|
144
144
|
},
|
|
145
|
-
isCurrentPlan:
|
|
146
|
-
ctaButton:
|
|
147
|
-
disabled:
|
|
145
|
+
isCurrentPlan: m,
|
|
146
|
+
ctaButton: d,
|
|
147
|
+
disabled: M
|
|
148
148
|
},
|
|
149
149
|
`${t.offerId}-${t.package.packageId}`
|
|
150
150
|
);
|
|
@@ -155,73 +155,76 @@ function he({
|
|
|
155
155
|
function K(n) {
|
|
156
156
|
return n.charAt(0).toUpperCase() + n.slice(1);
|
|
157
157
|
}
|
|
158
|
-
const
|
|
158
|
+
const de = {
|
|
159
159
|
weekly: "Weekly",
|
|
160
160
|
monthly: "Monthly",
|
|
161
161
|
quarterly: "Quarterly",
|
|
162
162
|
yearly: "Yearly",
|
|
163
163
|
lifetime: "Lifetime"
|
|
164
164
|
};
|
|
165
|
-
function
|
|
166
|
-
if (!n.product || !
|
|
167
|
-
const
|
|
168
|
-
if (
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
171
|
-
const
|
|
172
|
-
(
|
|
165
|
+
function pe(n, l) {
|
|
166
|
+
if (!n.product || !l.product) return null;
|
|
167
|
+
const p = J(n.product.period), o = J(l.product.period);
|
|
168
|
+
if (p <= 0 || o <= 0 || p === 1 / 0 || o === 1 / 0 || p === o) return null;
|
|
169
|
+
const f = n.product.price / p, s = l.product.price / o;
|
|
170
|
+
if (f <= 0) return null;
|
|
171
|
+
const g = Math.round(
|
|
172
|
+
(f - s) / f * 100
|
|
173
173
|
);
|
|
174
|
-
return
|
|
174
|
+
return g > 0 ? g : null;
|
|
175
175
|
}
|
|
176
|
-
function
|
|
176
|
+
function ve({
|
|
177
177
|
isLoggedIn: n,
|
|
178
|
-
onNavigateToLogin:
|
|
179
|
-
userId:
|
|
178
|
+
onNavigateToLogin: l,
|
|
179
|
+
userId: p,
|
|
180
180
|
userEmail: o,
|
|
181
|
-
featuresByPackage:
|
|
182
|
-
freeFeatures:
|
|
183
|
-
title:
|
|
184
|
-
className:
|
|
185
|
-
t:
|
|
186
|
-
renderOfferingContent:
|
|
181
|
+
featuresByPackage: f,
|
|
182
|
+
freeFeatures: s,
|
|
183
|
+
title: g = "Choose Your Plan",
|
|
184
|
+
className: y,
|
|
185
|
+
t: x,
|
|
186
|
+
renderOfferingContent: h,
|
|
187
|
+
initialOfferId: D
|
|
187
188
|
}) {
|
|
188
189
|
var q;
|
|
189
|
-
const
|
|
190
|
-
offerings:
|
|
191
|
-
isLoading:
|
|
192
|
-
error:
|
|
193
|
-
} =
|
|
190
|
+
const b = (a, c) => x ? x(a, c) : c, {
|
|
191
|
+
offerings: r,
|
|
192
|
+
isLoading: $,
|
|
193
|
+
error: B
|
|
194
|
+
} = le(), {
|
|
194
195
|
subscription: e,
|
|
195
|
-
isLoading:
|
|
196
|
-
error:
|
|
197
|
-
} = V({ userId:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
196
|
+
isLoading: N,
|
|
197
|
+
error: F
|
|
198
|
+
} = V({ userId: p, userEmail: o }), [u, M] = S(
|
|
199
|
+
D ?? "free"
|
|
200
|
+
), [P, C] = S(null), [O, I] = S(!1), w = ((q = r[0]) == null ? void 0 : q.offerId) ?? "", R = u !== "free" ? u : w, {
|
|
201
|
+
packages: A,
|
|
202
|
+
isLoading: T,
|
|
203
|
+
error: U
|
|
204
|
+
} = se(R), Y = $ || N || T, t = B || F || U, m = async (a, c) => {
|
|
202
205
|
try {
|
|
203
|
-
|
|
206
|
+
I(!0), C(null), await X().purchase({
|
|
204
207
|
packageId: a,
|
|
205
208
|
offeringId: c,
|
|
206
209
|
customerEmail: o
|
|
207
210
|
}), await Z();
|
|
208
211
|
} catch (v) {
|
|
209
|
-
|
|
212
|
+
C(
|
|
210
213
|
v instanceof Error ? v.message : "Purchase failed"
|
|
211
214
|
);
|
|
212
215
|
} finally {
|
|
213
|
-
|
|
216
|
+
I(!1);
|
|
214
217
|
}
|
|
215
|
-
},
|
|
216
|
-
{ value: "free", label:
|
|
217
|
-
...
|
|
218
|
+
}, d = [
|
|
219
|
+
{ value: "free", label: b("free", "Free") },
|
|
220
|
+
...r.map((a) => ({
|
|
218
221
|
value: a.offerId,
|
|
219
|
-
label:
|
|
222
|
+
label: b(a.offerId, K(a.offerId))
|
|
220
223
|
}))
|
|
221
|
-
],
|
|
222
|
-
title:
|
|
224
|
+
], k = A[0] ?? null, re = () => n ? (e == null ? void 0 : e.isActive) && e.packageId ? {
|
|
225
|
+
title: b("free", "Free"),
|
|
223
226
|
price: "$0",
|
|
224
|
-
features:
|
|
227
|
+
features: s ?? [],
|
|
225
228
|
ctaButton: {
|
|
226
229
|
label: "Cancel Subscription",
|
|
227
230
|
onClick: () => {
|
|
@@ -229,37 +232,37 @@ function me({
|
|
|
229
232
|
}
|
|
230
233
|
}
|
|
231
234
|
} : {
|
|
232
|
-
title:
|
|
235
|
+
title: b("free", "Free"),
|
|
233
236
|
price: "$0",
|
|
234
|
-
features:
|
|
237
|
+
features: s ?? [],
|
|
235
238
|
ctaButton: {
|
|
236
239
|
label: "Current Plan"
|
|
237
240
|
},
|
|
238
241
|
topBadge: { text: "Current Plan", color: "blue" }
|
|
239
242
|
} : {
|
|
240
|
-
title:
|
|
243
|
+
title: b("free", "Free"),
|
|
241
244
|
price: "$0",
|
|
242
|
-
features:
|
|
245
|
+
features: s ?? [],
|
|
243
246
|
ctaButton: {
|
|
244
247
|
label: "Try it for Free",
|
|
245
|
-
onClick:
|
|
248
|
+
onClick: l
|
|
246
249
|
}
|
|
247
|
-
},
|
|
248
|
-
if (!n) return
|
|
250
|
+
}, te = (a) => n ? (e == null ? void 0 : e.packageId) === a.packageId ? "Current Plan" : (e == null ? void 0 : e.isActive) && e.packageId ? "Change Subscription" : "Subscribe" : "Log in to Continue", ae = (a, c) => {
|
|
251
|
+
if (!n) return l;
|
|
249
252
|
if ((e == null ? void 0 : e.packageId) !== a.packageId)
|
|
250
|
-
return () =>
|
|
253
|
+
return () => m(a.packageId, c);
|
|
251
254
|
};
|
|
252
|
-
if (
|
|
255
|
+
if (Y)
|
|
253
256
|
return /* @__PURE__ */ i(
|
|
254
|
-
|
|
257
|
+
L,
|
|
255
258
|
{
|
|
256
|
-
title:
|
|
257
|
-
className:
|
|
259
|
+
title: g,
|
|
260
|
+
className: y,
|
|
258
261
|
variant: "cta",
|
|
259
262
|
children: /* @__PURE__ */ i("p", { children: "Loading subscription plans..." })
|
|
260
263
|
}
|
|
261
264
|
);
|
|
262
|
-
const
|
|
265
|
+
const ne = P ?? (t ? t.message : null), ie = n && (e != null && e.isActive) && e.packageId ? {
|
|
263
266
|
isActive: !0,
|
|
264
267
|
activeContent: {
|
|
265
268
|
title: "Active Subscription",
|
|
@@ -279,50 +282,50 @@ function me({
|
|
|
279
282
|
] : []
|
|
280
283
|
]
|
|
281
284
|
}
|
|
282
|
-
} : void 0, _ =
|
|
285
|
+
} : void 0, _ = u === "free";
|
|
283
286
|
return /* @__PURE__ */ i(
|
|
284
|
-
|
|
287
|
+
L,
|
|
285
288
|
{
|
|
286
|
-
title:
|
|
287
|
-
className:
|
|
289
|
+
title: g,
|
|
290
|
+
className: y,
|
|
288
291
|
variant: "cta",
|
|
289
|
-
error:
|
|
290
|
-
currentStatus:
|
|
291
|
-
freeTileConfig: _ ?
|
|
292
|
-
aboveProducts:
|
|
292
|
+
error: ne,
|
|
293
|
+
currentStatus: ie,
|
|
294
|
+
freeTileConfig: _ ? re() : void 0,
|
|
295
|
+
aboveProducts: d.length > 1 ? /* @__PURE__ */ i("div", { className: "flex justify-center mb-6", children: /* @__PURE__ */ i(
|
|
293
296
|
ee,
|
|
294
297
|
{
|
|
295
|
-
options:
|
|
296
|
-
value:
|
|
297
|
-
onChange:
|
|
298
|
+
options: d,
|
|
299
|
+
value: u,
|
|
300
|
+
onChange: M
|
|
298
301
|
}
|
|
299
302
|
) }) : void 0,
|
|
300
|
-
children: !_ && /* @__PURE__ */
|
|
301
|
-
|
|
302
|
-
/* @__PURE__ */ i("div", { className: "space-y-3", children:
|
|
303
|
+
children: !_ && /* @__PURE__ */ E("div", { className: "col-span-full space-y-6", children: [
|
|
304
|
+
h && /* @__PURE__ */ i("div", { className: "rounded-xl bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 p-5", children: h(u) }),
|
|
305
|
+
/* @__PURE__ */ i("div", { className: "space-y-3", children: A.map((a) => {
|
|
303
306
|
var G, H;
|
|
304
|
-
const c = (G = a.product) == null ? void 0 : G.period, v = c ?
|
|
305
|
-
return /* @__PURE__ */
|
|
307
|
+
const c = (G = a.product) == null ? void 0 : G.period, v = c ? b(c, de[c] ?? K(c)) : a.name, j = n && (e == null ? void 0 : e.isActive) && e.packageId === a.packageId, z = k && a.packageId !== k.packageId ? pe(k, a) : null, Q = te(a), W = ae(a, u), ce = ((H = a.product) == null ? void 0 : H.priceString) ?? "$0";
|
|
308
|
+
return /* @__PURE__ */ E(
|
|
306
309
|
"div",
|
|
307
310
|
{
|
|
308
|
-
className: "flex items-center justify-between rounded-xl p-4 transition-all " + (
|
|
311
|
+
className: "flex items-center justify-between rounded-xl p-4 transition-all " + (j ? "bg-blue-50 dark:bg-blue-900/20 border-2 border-blue-500 dark:border-blue-400" : "bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700"),
|
|
309
312
|
children: [
|
|
310
|
-
/* @__PURE__ */
|
|
313
|
+
/* @__PURE__ */ E("div", { className: "min-w-0 flex-1", children: [
|
|
311
314
|
/* @__PURE__ */ i("p", { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: v }),
|
|
312
315
|
/* @__PURE__ */ i("p", { className: "text-xs text-gray-400 dark:text-gray-500", children: a.packageId }),
|
|
313
|
-
z !== null ? /* @__PURE__ */
|
|
316
|
+
z !== null ? /* @__PURE__ */ E("p", { className: "text-sm font-medium text-green-600 dark:text-green-400", children: [
|
|
314
317
|
"Save ",
|
|
315
318
|
z,
|
|
316
319
|
"%"
|
|
317
|
-
] }) :
|
|
320
|
+
] }) : j ? /* @__PURE__ */ i("p", { className: "text-sm font-medium text-blue-600 dark:text-blue-400", children: "Current Plan" }) : null
|
|
318
321
|
] }),
|
|
319
|
-
/* @__PURE__ */ i(
|
|
322
|
+
j ? /* @__PURE__ */ i("span", { className: "ml-4 flex-shrink-0 text-sm font-semibold text-blue-600 dark:text-blue-400", children: Q }) : /* @__PURE__ */ i(
|
|
320
323
|
"button",
|
|
321
324
|
{
|
|
322
325
|
onClick: W,
|
|
323
|
-
disabled:
|
|
324
|
-
className: "ml-4 flex-shrink-0 rounded-lg px-4 py-2 text-sm font-semibold transition-colors
|
|
325
|
-
children:
|
|
326
|
+
disabled: O || !W,
|
|
327
|
+
className: "ml-4 flex-shrink-0 rounded-lg px-4 py-2 text-sm font-semibold transition-colors bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
328
|
+
children: `${ce} · ${Q}`
|
|
326
329
|
}
|
|
327
330
|
)
|
|
328
331
|
]
|
|
@@ -335,6 +338,6 @@ function me({
|
|
|
335
338
|
);
|
|
336
339
|
}
|
|
337
340
|
export {
|
|
338
|
-
|
|
339
|
-
|
|
341
|
+
me as SubscriptionByDurationPage,
|
|
342
|
+
ve as SubscriptionByOfferPage
|
|
340
343
|
};
|
|
@@ -29,5 +29,10 @@ export interface SubscriptionByOfferPageProps {
|
|
|
29
29
|
* Return a list of strings or React elements shown in a styled container.
|
|
30
30
|
*/
|
|
31
31
|
renderOfferingContent?: (offerId: string) => React.ReactNode;
|
|
32
|
+
/**
|
|
33
|
+
* If set, automatically select the specified offering on mount.
|
|
34
|
+
* Must match an offering identifier from RevenueCat.
|
|
35
|
+
*/
|
|
36
|
+
initialOfferId?: string;
|
|
32
37
|
}
|
|
33
|
-
export declare function SubscriptionByOfferPage({ isLoggedIn, onNavigateToLogin, userId, userEmail, featuresByPackage: _featuresByPackage, freeFeatures, title, className, t: translate, renderOfferingContent, }: SubscriptionByOfferPageProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export declare function SubscriptionByOfferPage({ isLoggedIn, onNavigateToLogin, userId, userEmail, featuresByPackage: _featuresByPackage, freeFeatures, title, className, t: translate, renderOfferingContent, initialOfferId, }: SubscriptionByOfferPageProps): import("react/jsx-runtime").JSX.Element;
|