import ApiClient from './ApiClient'; import urls from './urls'; import * as S from './types/Stripe'; export const mapCreateStripeCheckoutResponse = ( s: S.CreateStripeCheckoutResponse, ): S.CreateStripeCheckout => ({ clientSecret: s.client_secret, }); export const mapStripeProductPriceResponse = ( p: S.StripeProductPriceResponse, ): S.StripeProductPrice => ({ amount: p.amount, interval: p.interval, billingCycle: p.billing_cycle, }); export const mapStripeProductResponse = ( p: S.StripeProductResponse, ): S.StripeProduct => ({ name: p.name, description: p.description, prices: p.prices.map(mapStripeProductPriceResponse), }); export const mapGetStripeProductsResponse = ( res: S.GetStripeProductsResponse, ): S.GetStripeProducts => res.map(mapStripeProductResponse); export default class StripeClient { async getStripeCheckout( this: ApiClient, params: S.GetStripeCheckoutQuery = {}, ): Promise { const res = await this.requestProtected< S.GetStripeCheckoutRequest, S.GetStripeCheckoutResponse >({ method: 'GET', url: urls.stripeCheckout({ session_id: params.sessionId }), }); return res; } async getStripeProducts( this: ApiClient, params: S.GetStripeProductsQuery = {}, ): Promise { const res = await this.requestProtected< S.GetStripeProductsRequest, S.GetStripeProductsResponse >({ method: 'GET', url: urls.getStripeProducts({ product_identifier: params.productIdentifier, }), }); return mapGetStripeProductsResponse(res); } async createCustomerPortalSession( this: ApiClient, ): Promise { const res = await this.requestProtected< S.CreateCustomerPortalSessionRequest, S.CreateCustomerPortalSessionResponse >({ method: 'POST', url: urls.createCustomerPortalSession(), }); return res; } async createStripeCheckout( this: ApiClient, data: S.CreateStripeCheckoutParams, ): Promise { const res = await this.requestProtected< S.CreateStripeCheckoutRequest, S.CreateStripeCheckoutResponse >({ method: 'POST', url: urls.stripeCheckout(), body: { quantity: data.quantity, billing_frequency: data.billingFrequency, required_shipping_charges: data.requiredShippingCharges, product_identifier: data.productIdentifier, return_url: data.returnUrl, }, }); return mapCreateStripeCheckoutResponse(res); } }