Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Injectable } from '@angular/core';
  2. import { combineLatest, of, Observable } from 'rxjs';
  3. import { filter, map, switchMap, tap, debounceTime } from 'rxjs/operators';
  4.  
  5. import {
  6.   Address,
  7.   CheckoutDeliveryService,
  8.   UserAddressService,
  9.   UserPaymentService,
  10.   PaymentDetails,
  11.   DeliveryMode,
  12.   CheckoutPaymentService,
  13.   LoaderState,
  14. } from '@spartacus/core';
  15. import { CheckoutConfigService } from './checkout-config.service';
  16. import { CheckoutDetailsService } from './checkout-details.service';
  17.  
  18. @Injectable({
  19.   providedIn: 'root',
  20. })
  21. export class ExpressCheckoutService {
  22.   private shippingAddressSet$: Observable<boolean>;
  23.   private deliveryModeSet$: Observable<boolean>;
  24.   private paymentMethodSet$: Observable<boolean>;
  25.  
  26.   constructor(
  27.     protected userAddressService: UserAddressService,
  28.     protected userPaymentService: UserPaymentService,
  29.     protected checkoutDeliveryService: CheckoutDeliveryService,
  30.     protected checkoutPaymentService: CheckoutPaymentService,
  31.     protected checkoutDetailsService: CheckoutDetailsService,
  32.     protected checkoutConfigService: CheckoutConfigService
  33.   ) {
  34.     this.setShippingAddress();
  35.     this.setDeliveryMode();
  36.     this.setPaymentMethod();
  37.   }
  38.  
  39.   protected setShippingAddress() {
  40.     this.shippingAddressSet$ = combineLatest([
  41.       this.userAddressService.getAddresses(),
  42.       this.userAddressService.getAddressesLoadedSuccess(),
  43.       this.checkoutDeliveryService.getSetDeliveryAddressProcess(),
  44.     ]).pipe(
  45.       debounceTime(0),
  46.       tap(
  47.         ([, addressesLoadedSuccess]: [
  48.           Address[],
  49.           boolean,
  50.           LoaderState<void>
  51.         ]) => {
  52.           if (!addressesLoadedSuccess) {
  53.             this.userAddressService.loadAddresses();
  54.           }
  55.         }
  56.       ),
  57.       filter(
  58.         ([, addressesLoadedSuccess]: [Address[], boolean, LoaderState<void>]) =>
  59.           addressesLoadedSuccess
  60.       ),
  61.       switchMap(
  62.         ([addresses, , setDeliveryAddressProcess]: [
  63.           Address[],
  64.           boolean,
  65.           LoaderState<void>
  66.         ]) => {
  67.           const defaultAddress =
  68.             addresses.find(address => address.defaultAddress) || addresses[0];
  69.           if (defaultAddress && Object.keys(defaultAddress).length) {
  70.             if (
  71.               !(
  72.                 setDeliveryAddressProcess.success ||
  73.                 setDeliveryAddressProcess.error ||
  74.                 setDeliveryAddressProcess.loading
  75.               )
  76.             ) {
  77.               this.checkoutDeliveryService.setDeliveryAddress(defaultAddress);
  78.             }
  79.             return of(setDeliveryAddressProcess).pipe(
  80.               filter((setDeliveryAddressProcessState: LoaderState<void>) => {
  81.                 return (
  82.                   (setDeliveryAddressProcessState.success ||
  83.                     setDeliveryAddressProcessState.error) &&
  84.                   !setDeliveryAddressProcessState.loading
  85.                 );
  86.               }),
  87.               switchMap((setDeliveryAddressProcessState: LoaderState<void>) => {
  88.                 if (setDeliveryAddressProcessState.success) {
  89.                   return this.checkoutDetailsService.getDeliveryAddress();
  90.                 }
  91.                 return of(false);
  92.               }),
  93.               map(data => Boolean(data && Object.keys(data).length))
  94.             );
  95.           }
  96.           return of(false);
  97.         }
  98.       )
  99.     );
  100.   }
  101.  
  102.   protected setPaymentMethod() {
  103.     this.paymentMethodSet$ = combineLatest([
  104.       this.userPaymentService.getPaymentMethods(),
  105.       this.userPaymentService.getPaymentMethodsLoadedSuccess(),
  106.       this.checkoutPaymentService.getSetPaymentDetailsResultProcess(),
  107.     ]).pipe(
  108.       debounceTime(0),
  109.       tap(
  110.         ([, paymentMethodsLoadedSuccess]: [
  111.           PaymentDetails[],
  112.           boolean,
  113.           LoaderState<void>
  114.         ]) => {
  115.           if (!paymentMethodsLoadedSuccess) {
  116.             this.userPaymentService.loadPaymentMethods();
  117.           }
  118.         }
  119.       ),
  120.       filter(
  121.         ([, success]: [PaymentDetails[], boolean, LoaderState<void>]) => success
  122.       ),
  123.       switchMap(
  124.         ([payments, , setPaymentDetailsProcess]: [
  125.           PaymentDetails[],
  126.           boolean,
  127.           LoaderState<void>
  128.         ]) => {
  129.           const defaultPayment =
  130.             payments.find(address => address.defaultPayment) || payments[0];
  131.           if (defaultPayment && Object.keys(defaultPayment).length) {
  132.             if (
  133.               !(
  134.                 setPaymentDetailsProcess.success ||
  135.                 setPaymentDetailsProcess.error ||
  136.                 setPaymentDetailsProcess.loading
  137.               )
  138.             ) {
  139.               this.checkoutPaymentService.setPaymentDetails(defaultPayment);
  140.             }
  141.             return of(setPaymentDetailsProcess).pipe(
  142.               filter((setPaymentDetailsProcessState: LoaderState<void>) => {
  143.                 return (
  144.                   (setPaymentDetailsProcessState.success ||
  145.                     setPaymentDetailsProcessState.error) &&
  146.                   !setPaymentDetailsProcessState.loading
  147.                 );
  148.               }),
  149.               switchMap((setPaymentDetailsProcessState: LoaderState<void>) => {
  150.                 if (setPaymentDetailsProcessState.success) {
  151.                   return this.checkoutDetailsService.getPaymentDetails();
  152.                 }
  153.                 return of(false);
  154.               }),
  155.               map(data => Boolean(data && Object.keys(data).length))
  156.             );
  157.           }
  158.           return of(false);
  159.         }
  160.       )
  161.     );
  162.   }
  163.  
  164.   protected setDeliveryMode() {
  165.     this.deliveryModeSet$ = combineLatest([
  166.       this.shippingAddressSet$,
  167.       this.checkoutDeliveryService.getSupportedDeliveryModes(),
  168.       this.checkoutDeliveryService.getSetDeliveryModeProcess(),
  169.       this.checkoutDeliveryService.getLoadSupportedDeliveryModeProcess(),
  170.     ]).pipe(
  171.       debounceTime(0),
  172.       switchMap(
  173.         ([
  174.           addressSet,
  175.           supportedDeliveryModes,
  176.           setDeliveryModeStatusFlag,
  177.           loadSupportedDeliveryModeStatus,
  178.         ]: [boolean, DeliveryMode[], LoaderState<void>, LoaderState<void>]) => {
  179.           if (addressSet) {
  180.             return of([
  181.               supportedDeliveryModes,
  182.               setDeliveryModeStatusFlag,
  183.               loadSupportedDeliveryModeStatus,
  184.             ]).pipe(
  185.               filter(
  186.                 ([, , supportedDeliveryModeStatus]: [
  187.                   DeliveryMode[],
  188.                   LoaderState<void>,
  189.                   LoaderState<void>
  190.                 ]) => supportedDeliveryModeStatus.success
  191.               ),
  192.               switchMap(
  193.                 ([deliveryModes, setDeliveryModeStatus, ,]: [
  194.                   DeliveryMode[],
  195.                   LoaderState<void>,
  196.                   LoaderState<void>
  197.                 ]) => {
  198.                   if (Boolean(deliveryModes.length)) {
  199.                     const preferredDeliveryMode = this.checkoutConfigService.getPreferredDeliveryMode(
  200.                       deliveryModes
  201.                     );
  202.                     return of([
  203.                       preferredDeliveryMode,
  204.                       setDeliveryModeStatus,
  205.                     ]).pipe(
  206.                       tap(
  207.                         ([deliveryMode, deliveryModeLoadingStatus]: [
  208.                           string,
  209.                           LoaderState<void>
  210.                         ]) => {
  211.                           if (
  212.                             deliveryMode &&
  213.                             !(
  214.                               deliveryModeLoadingStatus.success ||
  215.                               deliveryModeLoadingStatus.error ||
  216.                               deliveryModeLoadingStatus.loading
  217.                             )
  218.                           ) {
  219.                             this.checkoutDeliveryService.setDeliveryMode(
  220.                               deliveryMode
  221.                             );
  222.                           }
  223.                         }
  224.                       ),
  225.                       filter(
  226.                         ([, deliveryModeLoadingStatus]: [
  227.                           string,
  228.                           LoaderState<void>
  229.                         ]) => {
  230.                           return (
  231.                             (deliveryModeLoadingStatus.success ||
  232.                               deliveryModeLoadingStatus.error) &&
  233.                             !deliveryModeLoadingStatus.loading
  234.                           );
  235.                         }
  236.                       ),
  237.                       switchMap(
  238.                         ([, deliveryModeLoadingStatus]: [
  239.                           string,
  240.                           LoaderState<void>
  241.                         ]) => {
  242.                           if (deliveryModeLoadingStatus.success) {
  243.                             return this.checkoutDetailsService.getSelectedDeliveryModeCode();
  244.                           }
  245.                           return of(false);
  246.                         }
  247.                       ),
  248.                       map(data => Boolean(data))
  249.                     );
  250.                   }
  251.                   return of(false);
  252.                 }
  253.               )
  254.             );
  255.           } else {
  256.             return of(false);
  257.           }
  258.         }
  259.       )
  260.     );
  261.   }
  262.  
  263.   protected resetCheckoutProcesses() {
  264.     this.checkoutDeliveryService.resetSetDeliveryAddressProcess();
  265.     this.checkoutPaymentService.resetSetPaymentDetailsProcess();
  266.     this.checkoutDeliveryService.resetSetDeliveryModeProcess();
  267.   }
  268.  
  269.   public trySetDefaultCheckoutDetails(): Observable<boolean> {
  270.     this.resetCheckoutProcesses();
  271.     return combineLatest([this.deliveryModeSet$, this.paymentMethodSet$]).pipe(
  272.       map(([deliveryModeSet, paymentMethodSet]) =>
  273.         Boolean(deliveryModeSet && paymentMethodSet)
  274.       )
  275.     );
  276.   }
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement