Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / lib / interfaces / Subscription.ts
blob167b419e36a62e88300b02aac0410a7529fab4bd
1 import type { ADDON_NAMES, Currency, PLANS, PLAN_TYPES } from '@proton/payments';
3 import type { ProrationMode } from '../api/payments';
4 import type { CYCLE } from '../constants';
5 import type { Nullable } from './utils';
7 export type Cycle =
8     | CYCLE.MONTHLY
9     | CYCLE.YEARLY
10     | CYCLE.TWO_YEARS
11     | CYCLE.THIRTY
12     | CYCLE.FIFTEEN
13     | CYCLE.THREE
14     | CYCLE.EIGHTEEN;
16 export interface CycleMapping<T> {
17     [CYCLE.MONTHLY]?: T;
18     [CYCLE.YEARLY]?: T;
19     [CYCLE.TWO_YEARS]?: T;
20     // Not always included for all plans
21     [CYCLE.THIRTY]?: T;
22     [CYCLE.FIFTEEN]?: T;
23     [CYCLE.THREE]?: T;
24     [CYCLE.EIGHTEEN]?: T;
27 export type Pricing = CycleMapping<number>;
29 export interface Offer {
30     Name: string;
31     StartTime: number;
32     EndTime: number;
33     Pricing: Partial<Pricing>;
36 export interface Plan {
37     ID: string;
38     ParentMetaPlanID: string;
39     Type: PLAN_TYPES;
40     Cycle: Cycle;
41     Name: PLANS | ADDON_NAMES;
42     Title: string;
43     Currency: Currency;
44     Amount: number;
45     MaxDomains: number;
46     MaxAddresses: number;
47     MaxSpace: number;
48     MaxCalendars: number;
49     MaxMembers: number;
50     MaxVPN: number;
51     MaxTier: number;
52     Services: number;
53     Features: number;
54     Quantity: number;
55     Pricing: Pricing;
56     DefaultPricing?: Pricing;
57     PeriodEnd: CycleMapping<number>;
58     State: number;
59     Offers: Offer[];
62 export interface StrictPlan extends Plan {
63     Type: PLAN_TYPES.PLAN;
64     Name: PLANS;
67 export interface Addon extends Plan {
68     Type: PLAN_TYPES.ADDON;
69     Name: ADDON_NAMES;
72 export interface FreePlanDefault extends Plan {
73     Name: PLANS.FREE;
74     Type: PLAN_TYPES.PLAN;
75     MaxBaseSpace: number;
76     MaxDriveSpace: number;
77     MaxRewardSpace: number;
78     MaxDriveRewardSpace: number;
79     MaxBaseRewardSpace: number;
82 export enum Renew {
83     Disabled = 0,
84     Enabled = 1,
87 export enum External {
88     Default = 0,
89     iOS = 1,
90     Android = 2,
93 export enum BillingPlatform {
94     Proton = 0,
95     Chargebee = 1,
98 export interface SubscriptionPlan
99     extends Omit<Plan, 'ParentMetaPlanID' | 'PeriodEnd' | 'Pricing' | 'DefaultPricing' | 'Offers'> {
100     // TODO: improve
101     Offer?: 'default' | string;
104 export interface Subscription {
105     ID: string;
106     InvoiceID: string;
107     Cycle: Cycle;
108     PeriodStart: number;
109     PeriodEnd: number;
110     CreateTime: number;
111     CouponCode: null | string;
112     Currency: Currency;
113     Amount: number;
114     RenewAmount: number;
115     RenewDiscount: number;
116     Renew: Renew;
117     Discount: number;
118     Plans: SubscriptionPlan[];
119     External: External;
120     UpcomingSubscription?: Subscription | null;
121     /**
122      * That's a V5 property. It's not available for V4.
123      */
124     IsTrial?: boolean;
125     /**
126      * V5 property. Potentially isn't available in V4.
127      */
128     BillingPlatform?: BillingPlatform;
131 export interface SubscriptionModel extends Subscription {
132     isManagedByMozilla: boolean;
135 export type BasePlansMap<T extends Plan> = {
136     [planName in PLANS | ADDON_NAMES]: T;
139 export type PlansMap = Partial<BasePlansMap<Plan>>;
141 export interface Tax {
142     Name: string;
143     /**
144      * Tax rate in percent. For example, value can be 8.5 for 8.5%.
145      */
146     Rate: number;
147     /**
148      * Tax amount in cents. It must be an integer.
149      */
150     Amount: number;
153 export enum TaxInclusive {
154     EXCLUSIVE = 0,
155     INCLUSIVE = 1,
158 export enum SubscriptionMode {
159     Regular = 0,
160     CustomBillings = 1,
161     Upcoming = 2,
162     AddonDowngrade = 3,
165 export type Coupon = Nullable<{
166     Code: string;
167     Description: string;
168     MaximumRedemptionsPerUser: number | null;
171 export interface SubscriptionCheckResponse {
172     Amount: number;
173     AmountDue: number;
174     Proration?: number;
175     CouponDiscount?: number;
176     Coupon: Coupon;
177     UnusedCredit?: number;
178     Credit?: number;
179     Currency: Currency;
180     Cycle: Cycle;
181     Gift?: number;
182     PeriodEnd: number;
183     Taxes?: Tax[];
184     TaxInclusive?: TaxInclusive;
185     SubscriptionMode?: SubscriptionMode;
186     optimistic?: boolean;
187     ProrationMode?: ProrationMode;
190 export enum Audience {
191     B2C = 'b2c',
192     B2B = 'b2b',
193     FAMILY = 'family',