@solvapay/react 1.0.8-preview.6 → 1.0.8-preview.8
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/README.md +12 -95
- package/dist/CancelPlanButton-Bb7cvym9.d.cts +1105 -0
- package/dist/CancelPlanButton-CieT9swn.d.cts +1102 -0
- package/dist/CancelPlanButton-Cq117t7h.d.ts +1105 -0
- package/dist/CancelPlanButton-f56UlQN-.d.ts +1102 -0
- package/dist/PaymentForm-B5dw0i1X.d.ts +934 -0
- package/dist/PaymentForm-CesoRQWu.d.cts +934 -0
- package/dist/chunk-C7SKOENW.js +1889 -0
- package/dist/chunk-ISYAH4ZL.js +1889 -0
- package/dist/chunk-MOP3ZBGC.js +4749 -0
- package/dist/chunk-Q7GPX6X4.js +4748 -0
- package/dist/chunk-TP4JPKE2.js +3126 -0
- package/dist/chunk-VTGIXJQU.js +4755 -0
- package/dist/chunk-XMQ4GBWQ.js +4752 -0
- package/dist/index-DLl3UwO3.d.ts +798 -0
- package/dist/index-Sj2lHLl8.d.cts +798 -0
- package/dist/index.cjs +11 -25
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/primitives/index.cjs +4 -21
- package/dist/primitives/index.d.cts +2 -2
- package/dist/primitives/index.d.ts +2 -2
- package/dist/primitives/index.js +1 -1
- package/dist/src/PaymentForm.d.ts +56 -0
- package/dist/src/PaymentForm.d.ts.map +1 -0
- package/dist/src/PaymentForm.js +212 -0
- package/dist/src/PaymentForm.js.map +1 -0
- package/dist/src/SolvaPayProvider.d.ts +84 -0
- package/dist/src/SolvaPayProvider.d.ts.map +1 -0
- package/dist/src/SolvaPayProvider.js +537 -0
- package/dist/src/SolvaPayProvider.js.map +1 -0
- package/dist/src/adapters/auth.d.ts +43 -0
- package/dist/src/adapters/auth.d.ts.map +1 -0
- package/dist/src/adapters/auth.js +38 -0
- package/dist/src/adapters/auth.js.map +1 -0
- package/dist/src/components/PlanBadge.d.ts +31 -0
- package/dist/src/components/PlanBadge.d.ts.map +1 -0
- package/dist/src/components/PlanBadge.js +119 -0
- package/dist/src/components/PlanBadge.js.map +1 -0
- package/dist/src/components/PlanSelector.d.ts +49 -0
- package/dist/src/components/PlanSelector.d.ts.map +1 -0
- package/dist/src/components/PlanSelector.js +82 -0
- package/dist/src/components/PlanSelector.js.map +1 -0
- package/dist/src/components/Spinner.d.ts +10 -0
- package/dist/src/components/Spinner.d.ts.map +1 -0
- package/dist/src/components/Spinner.js +14 -0
- package/dist/src/components/Spinner.js.map +1 -0
- package/dist/src/components/StripePaymentFormWrapper.d.ts +17 -0
- package/dist/src/components/StripePaymentFormWrapper.d.ts.map +1 -0
- package/dist/src/components/StripePaymentFormWrapper.js +158 -0
- package/dist/src/components/StripePaymentFormWrapper.js.map +1 -0
- package/dist/src/components/SubscriptionGate.d.ts +21 -0
- package/dist/src/components/SubscriptionGate.d.ts.map +1 -0
- package/dist/src/components/SubscriptionGate.js +32 -0
- package/dist/src/components/SubscriptionGate.js.map +1 -0
- package/dist/src/hooks/__tests__/useSubscription.test.d.ts +2 -0
- package/dist/src/hooks/__tests__/useSubscription.test.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/useSubscription.test.js +554 -0
- package/dist/src/hooks/__tests__/useSubscription.test.js.map +1 -0
- package/dist/src/hooks/__tests__/useSubscriptionStatus.test.d.ts +2 -0
- package/dist/src/hooks/__tests__/useSubscriptionStatus.test.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/useSubscriptionStatus.test.js +719 -0
- package/dist/src/hooks/__tests__/useSubscriptionStatus.test.js.map +1 -0
- package/dist/src/hooks/useCheckout.d.ts +59 -0
- package/dist/src/hooks/useCheckout.d.ts.map +1 -0
- package/dist/src/hooks/useCheckout.js +138 -0
- package/dist/src/hooks/useCheckout.js.map +1 -0
- package/dist/src/hooks/useCustomer.d.ts +43 -0
- package/dist/src/hooks/useCustomer.d.ts.map +1 -0
- package/dist/src/hooks/useCustomer.js +31 -0
- package/dist/src/hooks/useCustomer.js.map +1 -0
- package/dist/src/hooks/usePlans.d.ts +28 -0
- package/dist/src/hooks/usePlans.d.ts.map +1 -0
- package/dist/src/hooks/usePlans.js +181 -0
- package/dist/src/hooks/usePlans.js.map +1 -0
- package/dist/src/hooks/useSolvaPay.d.ts +44 -0
- package/dist/src/hooks/useSolvaPay.d.ts.map +1 -0
- package/dist/src/hooks/useSolvaPay.js +52 -0
- package/dist/src/hooks/useSolvaPay.js.map +1 -0
- package/dist/src/hooks/useSubscription.d.ts +46 -0
- package/dist/src/hooks/useSubscription.d.ts.map +1 -0
- package/dist/src/hooks/useSubscription.js +50 -0
- package/dist/src/hooks/useSubscription.js.map +1 -0
- package/dist/src/hooks/useSubscriptionStatus.d.ts +19 -0
- package/dist/src/hooks/useSubscriptionStatus.d.ts.map +1 -0
- package/dist/src/hooks/useSubscriptionStatus.js +68 -0
- package/dist/src/hooks/useSubscriptionStatus.js.map +1 -0
- package/dist/src/index.d.ts +24 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +26 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types/index.d.ts +339 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +5 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/__tests__/subscriptions.test.d.ts +2 -0
- package/dist/src/utils/__tests__/subscriptions.test.d.ts.map +1 -0
- package/dist/src/utils/__tests__/subscriptions.test.js +121 -0
- package/dist/src/utils/__tests__/subscriptions.test.js.map +1 -0
- package/dist/src/utils/subscriptions.d.ts +57 -0
- package/dist/src/utils/subscriptions.d.ts.map +1 -0
- package/dist/src/utils/subscriptions.js +85 -0
- package/dist/src/utils/subscriptions.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/__tests__/subscriptions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isPaidSubscription, filterSubscriptions, getActiveSubscriptions, getCancelledSubscriptionsWithEndDate, } from '../subscriptions';
|
|
3
|
+
const createSubscription = (overrides = {}) => ({
|
|
4
|
+
reference: 'sub_123',
|
|
5
|
+
planName: 'Test Plan',
|
|
6
|
+
agentName: 'Test Agent',
|
|
7
|
+
status: 'active',
|
|
8
|
+
startDate: '2024-01-01T00:00:00Z',
|
|
9
|
+
amount: 1000,
|
|
10
|
+
...overrides,
|
|
11
|
+
});
|
|
12
|
+
describe('filterSubscriptions', () => {
|
|
13
|
+
it('should filter to only include active subscriptions', () => {
|
|
14
|
+
const subscriptions = [
|
|
15
|
+
createSubscription({ status: 'active', planName: 'Active Plan' }),
|
|
16
|
+
createSubscription({ status: 'cancelled', planName: 'Cancelled Plan' }),
|
|
17
|
+
createSubscription({ status: 'expired', planName: 'Expired Plan' }),
|
|
18
|
+
createSubscription({ status: 'active', planName: 'Another Active' }),
|
|
19
|
+
];
|
|
20
|
+
const filtered = filterSubscriptions(subscriptions);
|
|
21
|
+
expect(filtered).toHaveLength(2);
|
|
22
|
+
expect(filtered.every(sub => sub.status === 'active')).toBe(true);
|
|
23
|
+
expect(filtered.some(sub => sub.planName === 'Active Plan')).toBe(true);
|
|
24
|
+
expect(filtered.some(sub => sub.planName === 'Another Active')).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('should include cancelled subscriptions with status active', () => {
|
|
27
|
+
const subscriptions = [
|
|
28
|
+
createSubscription({
|
|
29
|
+
status: 'active',
|
|
30
|
+
planName: 'Cancelled but Active',
|
|
31
|
+
cancelledAt: '2024-06-01T00:00:00Z',
|
|
32
|
+
}),
|
|
33
|
+
];
|
|
34
|
+
const filtered = filterSubscriptions(subscriptions);
|
|
35
|
+
expect(filtered).toHaveLength(1);
|
|
36
|
+
expect(filtered[0].status).toBe('active');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('getActiveSubscriptions', () => {
|
|
40
|
+
it('should return only subscriptions with status active', () => {
|
|
41
|
+
const subscriptions = [
|
|
42
|
+
createSubscription({ status: 'active', planName: 'Active 1' }),
|
|
43
|
+
createSubscription({ status: 'active', planName: 'Active 2' }),
|
|
44
|
+
createSubscription({ status: 'cancelled', planName: 'Cancelled' }),
|
|
45
|
+
];
|
|
46
|
+
const active = getActiveSubscriptions(subscriptions);
|
|
47
|
+
expect(active).toHaveLength(2);
|
|
48
|
+
expect(active.every(sub => sub.status === 'active')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('getCancelledSubscriptionsWithEndDate', () => {
|
|
52
|
+
it('should return cancelled subscriptions with status active and future endDate', () => {
|
|
53
|
+
const futureDate = new Date();
|
|
54
|
+
futureDate.setFullYear(futureDate.getFullYear() + 1);
|
|
55
|
+
const subscriptions = [
|
|
56
|
+
createSubscription({
|
|
57
|
+
status: 'active',
|
|
58
|
+
cancelledAt: '2024-06-01T00:00:00Z',
|
|
59
|
+
endDate: futureDate.toISOString(),
|
|
60
|
+
planName: 'Cancelled Active',
|
|
61
|
+
}),
|
|
62
|
+
createSubscription({
|
|
63
|
+
status: 'active',
|
|
64
|
+
cancelledAt: undefined,
|
|
65
|
+
planName: 'Not Cancelled',
|
|
66
|
+
}),
|
|
67
|
+
createSubscription({
|
|
68
|
+
status: 'active',
|
|
69
|
+
cancelledAt: '2024-06-01T00:00:00Z',
|
|
70
|
+
endDate: '2024-01-01T00:00:00Z', // Past date
|
|
71
|
+
planName: 'Expired Cancelled',
|
|
72
|
+
}),
|
|
73
|
+
];
|
|
74
|
+
const cancelled = getCancelledSubscriptionsWithEndDate(subscriptions);
|
|
75
|
+
expect(cancelled).toHaveLength(1);
|
|
76
|
+
expect(cancelled[0].planName).toBe('Cancelled Active');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('isPaidSubscription', () => {
|
|
80
|
+
it('should return true for subscription with amount > 0', () => {
|
|
81
|
+
const sub = createSubscription({ amount: 1000 });
|
|
82
|
+
expect(isPaidSubscription(sub)).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('should return false for subscription with amount === 0', () => {
|
|
85
|
+
const sub = createSubscription({ amount: 0 });
|
|
86
|
+
expect(isPaidSubscription(sub)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it('should return false for subscription with undefined amount', () => {
|
|
89
|
+
const sub = createSubscription({ amount: undefined });
|
|
90
|
+
expect(isPaidSubscription(sub)).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('Integration: status active + isPaidSubscription', () => {
|
|
94
|
+
it('should correctly identify cancelled paid subscription with status active as granting access', () => {
|
|
95
|
+
const futureDate = new Date();
|
|
96
|
+
futureDate.setFullYear(futureDate.getFullYear() + 1);
|
|
97
|
+
const sub = createSubscription({
|
|
98
|
+
status: 'active',
|
|
99
|
+
amount: 2000,
|
|
100
|
+
cancelledAt: '2024-06-01T00:00:00Z',
|
|
101
|
+
endDate: futureDate.toISOString(),
|
|
102
|
+
});
|
|
103
|
+
expect(sub.status === 'active').toBe(true);
|
|
104
|
+
expect(isPaidSubscription(sub)).toBe(true);
|
|
105
|
+
// This combination should grant access
|
|
106
|
+
expect(sub.status === 'active' && isPaidSubscription(sub)).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
it('should correctly identify expired subscription as not granting access', () => {
|
|
109
|
+
const sub = createSubscription({
|
|
110
|
+
status: 'expired',
|
|
111
|
+
amount: 2000,
|
|
112
|
+
cancelledAt: '2024-06-01T00:00:00Z',
|
|
113
|
+
endDate: '2024-01-01T00:00:00Z', // Past date
|
|
114
|
+
});
|
|
115
|
+
expect(sub.status === 'active').toBe(false);
|
|
116
|
+
expect(isPaidSubscription(sub)).toBe(true);
|
|
117
|
+
// This combination should NOT grant access
|
|
118
|
+
expect(sub.status === 'active' && isPaidSubscription(sub)).toBe(false);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=subscriptions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/subscriptions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EAEnB,sBAAsB,EACtB,oCAAoC,GACrC,MAAM,kBAAkB,CAAA;AAGzB,MAAM,kBAAkB,GAAG,CAAC,YAAuC,EAAE,EAAoB,EAAE,CAAC,CAAC;IAC3F,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE,IAAI;IACZ,GAAG,SAAS;CACb,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,aAAa,GAAG;YACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;YACjE,kBAAkB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YACvE,kBAAkB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;YACnE,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;SACrE,CAAA;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;QAEnD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,aAAa,GAAG;YACpB,kBAAkB,CAAC;gBACjB,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,sBAAsB;gBAChC,WAAW,EAAE,sBAAsB;aACpC,CAAC;SACH,CAAA;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;QAEnD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,aAAa,GAAG;YACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YAC9D,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YAC9D,kBAAkB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;SACnE,CAAA;QAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAA;QAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAA;QAC7B,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;QAEpD,MAAM,aAAa,GAAG;YACpB,kBAAkB,CAAC;gBACjB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,sBAAsB;gBACnC,OAAO,EAAE,UAAU,CAAC,WAAW,EAAE;gBACjC,QAAQ,EAAE,kBAAkB;aAC7B,CAAC;YACF,kBAAkB,CAAC;gBACjB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,SAAS;gBACtB,QAAQ,EAAE,eAAe;aAC1B,CAAC;YACF,kBAAkB,CAAC;gBACjB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,sBAAsB;gBACnC,OAAO,EAAE,sBAAsB,EAAE,YAAY;gBAC7C,QAAQ,EAAE,mBAAmB;aAC9B,CAAC;SACH,CAAA;QAED,MAAM,SAAS,GAAG,oCAAoC,CAAC,aAAa,CAAC,CAAA;QAErE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAChD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACrD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACrG,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAA;QAC7B,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,kBAAkB,CAAC;YAC7B,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,sBAAsB;YACnC,OAAO,EAAE,UAAU,CAAC,WAAW,EAAE;SAClC,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,uCAAuC;QACvC,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,GAAG,GAAG,kBAAkB,CAAC;YAC7B,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,sBAAsB;YACnC,OAAO,EAAE,sBAAsB,EAAE,YAAY;SAC9C,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,2CAA2C;QAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription utility functions
|
|
3
|
+
*
|
|
4
|
+
* Provides shared logic for filtering and prioritizing subscriptions
|
|
5
|
+
*/
|
|
6
|
+
import type { SubscriptionInfo } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Filter subscriptions to only include active ones
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* - Keep subscriptions with status === 'active'
|
|
12
|
+
* - Filter out subscriptions with status === 'cancelled', 'expired', 'suspended', 'refunded', etc.
|
|
13
|
+
*
|
|
14
|
+
* Note: Backend now keeps subscriptions with status 'active' until expiration,
|
|
15
|
+
* even when cancelled. Cancellation is tracked via cancelledAt field.
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterSubscriptions(subscriptions: SubscriptionInfo[]): SubscriptionInfo[];
|
|
18
|
+
/**
|
|
19
|
+
* Get active subscriptions
|
|
20
|
+
*
|
|
21
|
+
* Returns subscriptions with status === 'active'.
|
|
22
|
+
* Note: Backend keeps subscriptions as 'active' until expiration, even when cancelled.
|
|
23
|
+
* Use cancelledAt field to check if a subscription is cancelled.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getActiveSubscriptions(subscriptions: SubscriptionInfo[]): SubscriptionInfo[];
|
|
26
|
+
/**
|
|
27
|
+
* Get cancelled subscriptions with valid endDate (not expired)
|
|
28
|
+
*
|
|
29
|
+
* Returns subscriptions with cancelledAt set and status === 'active' that have a future endDate.
|
|
30
|
+
* Backend keeps cancelled subscriptions as 'active' until expiration.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getCancelledSubscriptionsWithEndDate(subscriptions: SubscriptionInfo[]): SubscriptionInfo[];
|
|
33
|
+
/**
|
|
34
|
+
* Get the most recent subscription by startDate
|
|
35
|
+
*/
|
|
36
|
+
export declare function getMostRecentSubscription(subscriptions: SubscriptionInfo[]): SubscriptionInfo | null;
|
|
37
|
+
/**
|
|
38
|
+
* Get the primary subscription to display
|
|
39
|
+
*
|
|
40
|
+
* Prioritization:
|
|
41
|
+
* 1. Active subscriptions (most recent by startDate)
|
|
42
|
+
* 2. null if no valid subscriptions
|
|
43
|
+
*
|
|
44
|
+
* Note: Backend keeps subscriptions as 'active' until expiration, so we only
|
|
45
|
+
* need to check for active subscriptions. Cancelled subscriptions are still
|
|
46
|
+
* active until their endDate.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getPrimarySubscription(subscriptions: SubscriptionInfo[]): SubscriptionInfo | null;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a subscription is paid
|
|
51
|
+
* Uses subscription amount field: amount > 0 = paid, amount === 0 or undefined = free
|
|
52
|
+
*
|
|
53
|
+
* @param sub - Subscription to check
|
|
54
|
+
* @returns true if subscription is paid (amount > 0)
|
|
55
|
+
*/
|
|
56
|
+
export declare function isPaidSubscription(sub: SubscriptionInfo): boolean;
|
|
57
|
+
//# sourceMappingURL=subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../../src/utils/subscriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAEzF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAE5F;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,gBAAgB,EAAE,GAChC,gBAAgB,EAAE,CAWpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,gBAAgB,EAAE,GAChC,gBAAgB,GAAG,IAAI,CAMzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAUjG;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAEjE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription utility functions
|
|
3
|
+
*
|
|
4
|
+
* Provides shared logic for filtering and prioritizing subscriptions
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Filter subscriptions to only include active ones
|
|
8
|
+
*
|
|
9
|
+
* Rules:
|
|
10
|
+
* - Keep subscriptions with status === 'active'
|
|
11
|
+
* - Filter out subscriptions with status === 'cancelled', 'expired', 'suspended', 'refunded', etc.
|
|
12
|
+
*
|
|
13
|
+
* Note: Backend now keeps subscriptions with status 'active' until expiration,
|
|
14
|
+
* even when cancelled. Cancellation is tracked via cancelledAt field.
|
|
15
|
+
*/
|
|
16
|
+
export function filterSubscriptions(subscriptions) {
|
|
17
|
+
return subscriptions.filter(sub => sub.status === 'active');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get active subscriptions
|
|
21
|
+
*
|
|
22
|
+
* Returns subscriptions with status === 'active'.
|
|
23
|
+
* Note: Backend keeps subscriptions as 'active' until expiration, even when cancelled.
|
|
24
|
+
* Use cancelledAt field to check if a subscription is cancelled.
|
|
25
|
+
*/
|
|
26
|
+
export function getActiveSubscriptions(subscriptions) {
|
|
27
|
+
return subscriptions.filter(sub => sub.status === 'active');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get cancelled subscriptions with valid endDate (not expired)
|
|
31
|
+
*
|
|
32
|
+
* Returns subscriptions with cancelledAt set and status === 'active' that have a future endDate.
|
|
33
|
+
* Backend keeps cancelled subscriptions as 'active' until expiration.
|
|
34
|
+
*/
|
|
35
|
+
export function getCancelledSubscriptionsWithEndDate(subscriptions) {
|
|
36
|
+
const now = new Date();
|
|
37
|
+
return subscriptions.filter(sub => {
|
|
38
|
+
const subAny = sub; // Type assertion to access optional properties
|
|
39
|
+
return (sub.status === 'active' &&
|
|
40
|
+
subAny.cancelledAt &&
|
|
41
|
+
subAny.endDate &&
|
|
42
|
+
new Date(subAny.endDate) > now);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the most recent subscription by startDate
|
|
47
|
+
*/
|
|
48
|
+
export function getMostRecentSubscription(subscriptions) {
|
|
49
|
+
if (subscriptions.length === 0)
|
|
50
|
+
return null;
|
|
51
|
+
return subscriptions.reduce((latest, current) => {
|
|
52
|
+
return new Date(current.startDate) > new Date(latest.startDate) ? current : latest;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the primary subscription to display
|
|
57
|
+
*
|
|
58
|
+
* Prioritization:
|
|
59
|
+
* 1. Active subscriptions (most recent by startDate)
|
|
60
|
+
* 2. null if no valid subscriptions
|
|
61
|
+
*
|
|
62
|
+
* Note: Backend keeps subscriptions as 'active' until expiration, so we only
|
|
63
|
+
* need to check for active subscriptions. Cancelled subscriptions are still
|
|
64
|
+
* active until their endDate.
|
|
65
|
+
*/
|
|
66
|
+
export function getPrimarySubscription(subscriptions) {
|
|
67
|
+
// Filter to only include active subscriptions
|
|
68
|
+
const filtered = filterSubscriptions(subscriptions);
|
|
69
|
+
// Get most recent active subscription
|
|
70
|
+
if (filtered.length > 0) {
|
|
71
|
+
return getMostRecentSubscription(filtered);
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a subscription is paid
|
|
77
|
+
* Uses subscription amount field: amount > 0 = paid, amount === 0 or undefined = free
|
|
78
|
+
*
|
|
79
|
+
* @param sub - Subscription to check
|
|
80
|
+
* @returns true if subscription is paid (amount > 0)
|
|
81
|
+
*/
|
|
82
|
+
export function isPaidSubscription(sub) {
|
|
83
|
+
return (sub.amount ?? 0) > 0;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../../src/utils/subscriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAiC;IACnE,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAiC;IACtE,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oCAAoC,CAClD,aAAiC;IAEjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QAChC,MAAM,MAAM,GAAG,GAAU,CAAA,CAAC,+CAA+C;QACzE,OAAO,CACL,GAAG,CAAC,MAAM,KAAK,QAAQ;YACvB,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,OAAO;YACd,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAC/B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAAiC;IAEjC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAE3C,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC9C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAiC;IACtE,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;IAEnD,sCAAsC;IACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC"}
|