File

src/services/stripe.service.ts

Index

Properties
Methods

Constructor

constructor(key: string, options: Options, loader: LazyStripeAPILoader, window: WindowRef)
Parameters :
Name Type Optional Description
key string
options Options
loader LazyStripeAPILoader
window WindowRef

Methods

Public changeKey
changeKey(key: string, options?: Options)
Parameters :
Name Type Optional Description
key string
options Options true
Public createSource
createSource(a: Element | SourceData, b?: SourceData | undefined)
Parameters :
Name Type Optional Description
a Element | SourceData
b SourceData | undefined true
Public createToken
createToken(a: Element | BankAccount | Pii, b: CardDataOptions | BankAccountData | PiiData | undefined)
Public elements
elements(options?: ElementsOptions)
Parameters :
Name Type Optional Description
options ElementsOptions true
Public retrieveSource
retrieveSource(source: SourceParams)
Parameters :
Name Type Optional Description
source SourceParams

Properties

Private stripe
stripe: StripeJS
Type : StripeJS
Public stripeChanged$
stripeChanged$: ReplaySubject<StripeJS>
Type : ReplaySubject<StripeJS>
Default value : new ReplaySubject()
import { Injectable, Inject } from '@angular/core';

import { Observable } from 'rxjs/Observable';

import { WindowRef } from './window-ref';
import { LazyStripeAPILoader, Status } from './api-loader.service';

import {
  STRIPE_PUBLISHABLE_KEY,
  StripeJS,
  STRIPE_OPTIONS,
  Options
} from '../interfaces/stripe';
import { Element } from '../interfaces/element';
import { Elements, ElementsOptions } from '../interfaces/elements';
import {
  SourceData,
  SourceResult,
  isSourceData,
  SourceParams
} from '../interfaces/sources';
import {
  CardDataOptions,
  TokenResult,
  BankAccount,
  BankAccountData,
  PiiData,
  Pii,
  isBankAccount,
  isBankAccountData,
  isPii,
  isPiiData
} from '../interfaces/token';
import { ReplaySubject } from 'rxjs/ReplaySubject';

@Injectable()
export class StripeService {

  public stripeChanged$: ReplaySubject<StripeJS> = new ReplaySubject();
  private stripe: StripeJS;

  constructor(
    @Inject(STRIPE_PUBLISHABLE_KEY) private key: string,
    @Inject(STRIPE_OPTIONS) private options: Options,
    private loader: LazyStripeAPILoader,
    private window: WindowRef
  ) {
    this.changeKey(this.key, this.options).take(1).subscribe(() => {});
  }

  public changeKey(key: string, options?: Options): Observable<StripeJS> {
    const obs = this.loader
      .asStream()
      .filter((status: Status) => status.loaded === true)
      .map(() => {
        const Stripe = (this.window.getNativeWindow() as any).Stripe;
        this.stripe = options
          ? (Stripe(key, options) as StripeJS)
          : (Stripe(key) as StripeJS);
        this.stripeChanged$.next(this.stripe);
        return this.stripe;
      })
      .publishLast()
      .refCount();
    obs.subscribe();
    return obs;
  }

  public elements(options?: ElementsOptions): Observable<Elements> {
    return this.stripeChanged$
      .map(() => this.stripe.elements(options));
  }

  public createToken(
    a: Element | BankAccount | Pii,
    b: CardDataOptions | BankAccountData | PiiData | undefined
  ): Observable<TokenResult> {
    if (isBankAccount(a) && isBankAccountData(b)) {
      return Observable.fromPromise(this.stripe.createToken(a, b));
    } else if (isPii(a) && isPiiData(b)) {
      return Observable.fromPromise(this.stripe.createToken(a, b));
    } else {
      return Observable.fromPromise(
        this.stripe.createToken(a as Element, b as CardDataOptions | undefined)
      );
    }
  }

  public createSource(
    a: Element | SourceData,
    b?: SourceData | undefined
  ): Observable<SourceResult> {
    if (isSourceData(a)) {
      return Observable.fromPromise(this.stripe.createSource(a as SourceData));
    }
    return Observable.fromPromise(this.stripe.createSource(a as Element, b));
  }

  public retrieveSource(source: SourceParams): Observable<SourceResult> {
    return Observable.fromPromise(this.stripe.retrieveSource(source));
  }
}

results matching ""

    No results matching ""