@spartacus/checkout
Version:
Checkout feature library for Spartacus
74 lines • 10.2 kB
JavaScript
import { HttpErrorResponse, } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { throwError } from 'rxjs';
import { catchError, switchMap, take } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
/**
* Interceptor that handles "Cart not found" errors while a user is in a checkout step.
*
* When a user doing a checkout has a "Cart not found" error, he is redirected to checkout and the cart is reloaded.
* If a "Cart not found" error happens and the user is not on checkout, this interceptor does not perform any actions.
*/
export class CheckoutCartInterceptor {
constructor(routingService, multiCartService) {
this.routingService = routingService;
this.multiCartService = multiCartService;
}
intercept(request, next) {
return this.routingService.getRouterState().pipe(take(1), switchMap((state) => {
return next.handle(request).pipe(catchError((response) => {
var _a;
if (response instanceof HttpErrorResponse &&
this.isUserInCheckoutRoute((_a = state.state) === null || _a === void 0 ? void 0 : _a.semanticRoute)) {
if (this.isCartNotFoundError(response)) {
this.routingService.go({ cxRoute: 'cart' });
const cartCode = this.getCartIdFromError(response);
if (cartCode) {
this.multiCartService.reloadCart(cartCode);
}
}
}
return throwError(response);
}));
}));
}
/**
* Returns true if the parameter semantic route is part of "checkout"
* Checkout semantic routes:
* checkout
* checkoutPaymentType
* CheckoutShippingAddress
* checkoutDeliveryMode
* checkoutPaymentDetails
* checkoutReviewOrder
* checkoutLogin
* @param semanticRoute
*/
isUserInCheckoutRoute(semanticRoute) {
var _a;
return (_a = semanticRoute === null || semanticRoute === void 0 ? void 0 : semanticRoute.toLowerCase().startsWith('checkout')) !== null && _a !== void 0 ? _a : false;
}
/**
* Checks of the error is for a cart not found, i.e. the cart doesn't exist anymore
*
* @param response
*/
isCartNotFoundError(response) {
var _a, _b, _c, _d, _e, _f;
return (response.status === 400 &&
((_c = (_b = (_a = response.error) === null || _a === void 0 ? void 0 : _a.errors) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.type) === 'CartError' &&
((_f = (_e = (_d = response.error) === null || _d === void 0 ? void 0 : _d.errors) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.reason) === 'notFound');
}
getCartIdFromError(response) {
var _a, _b, _c;
return (_c = (_b = (_a = response.error) === null || _a === void 0 ? void 0 : _a.errors) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.subject;
}
}
CheckoutCartInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutCartInterceptor, deps: [{ token: i1.RoutingService }, { token: i1.MultiCartService }], target: i0.ɵɵFactoryTarget.Injectable });
CheckoutCartInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutCartInterceptor, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CheckoutCartInterceptor, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: function () { return [{ type: i1.RoutingService }, { type: i1.MultiCartService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtY2FydC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9jaGVja291dC9yb290L2h0dHAtaW50ZXJjZXB0b3JzL2NoZWNrb3V0LWNhcnQuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixHQUtsQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRTdEOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUNZLGNBQThCLEVBQzlCLGdCQUFrQztRQURsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUMzQyxDQUFDO0lBRUosU0FBUyxDQUNQLE9BQXlCLEVBQ3pCLElBQWlCO1FBRWpCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxTQUFTLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7O2dCQUMzQixJQUNFLFFBQVEsWUFBWSxpQkFBaUI7b0JBQ3JDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFBLEtBQUssQ0FBQyxLQUFLLDBDQUFFLGFBQWEsQ0FBQyxFQUN0RDtvQkFDQSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzt3QkFFNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNuRCxJQUFJLFFBQVEsRUFBRTs0QkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM1QztxQkFDRjtpQkFDRjtnQkFDRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNPLHFCQUFxQixDQUFDLGFBQXNCOztRQUNwRCxPQUFPLE1BQUEsYUFBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLG1DQUFJLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLG1CQUFtQixDQUFDLFFBQTJCOztRQUN2RCxPQUFPLENBQ0wsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3ZCLENBQUEsTUFBQSxNQUFBLE1BQUEsUUFBUSxDQUFDLEtBQUssMENBQUUsTUFBTSwwQ0FBRyxDQUFDLENBQUMsMENBQUUsSUFBSSxNQUFLLFdBQVc7WUFDakQsQ0FBQSxNQUFBLE1BQUEsTUFBQSxRQUFRLENBQUMsS0FBSywwQ0FBRSxNQUFNLDBDQUFHLENBQUMsQ0FBQywwQ0FBRSxNQUFNLE1BQUssVUFBVSxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVTLGtCQUFrQixDQUFDLFFBQTJCOztRQUN0RCxPQUFPLE1BQUEsTUFBQSxNQUFBLFFBQVEsQ0FBQyxLQUFLLDBDQUFFLE1BQU0sMENBQUcsQ0FBQyxDQUFDLDBDQUFFLE9BQU8sQ0FBQztJQUM5QyxDQUFDOztvSEFsRVUsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FEVixNQUFNOzJGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBFdmVudCxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBJbnRlcmNlcHRvcixcbiAgSHR0cFJlcXVlc3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE11bHRpQ2FydFNlcnZpY2UsIFJvdXRlclN0YXRlLCBSb3V0aW5nU2VydmljZSB9IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogSW50ZXJjZXB0b3IgdGhhdCBoYW5kbGVzIFwiQ2FydCBub3QgZm91bmRcIiBlcnJvcnMgd2hpbGUgYSB1c2VyIGlzIGluIGEgY2hlY2tvdXQgc3RlcC5cbiAqXG4gKiBXaGVuIGEgdXNlciBkb2luZyBhIGNoZWNrb3V0IGhhcyBhIFwiQ2FydCBub3QgZm91bmRcIiBlcnJvciwgaGUgaXMgcmVkaXJlY3RlZCB0byBjaGVja291dCBhbmQgdGhlIGNhcnQgaXMgcmVsb2FkZWQuXG4gKiBJZiBhIFwiQ2FydCBub3QgZm91bmRcIiBlcnJvciBoYXBwZW5zIGFuZCB0aGUgdXNlciBpcyBub3Qgb24gY2hlY2tvdXQsIHRoaXMgaW50ZXJjZXB0b3IgZG9lcyBub3QgcGVyZm9ybSBhbnkgYWN0aW9ucy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDaGVja291dENhcnRJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG11bHRpQ2FydFNlcnZpY2U6IE11bHRpQ2FydFNlcnZpY2VcbiAgKSB7fVxuXG4gIGludGVyY2VwdChcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgIG5leHQ6IEh0dHBIYW5kbGVyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0aW5nU2VydmljZS5nZXRSb3V0ZXJTdGF0ZSgpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKChzdGF0ZTogUm91dGVyU3RhdGUpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmXG4gICAgICAgICAgICAgIHRoaXMuaXNVc2VySW5DaGVja291dFJvdXRlKHN0YXRlLnN0YXRlPy5zZW1hbnRpY1JvdXRlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2FydE5vdEZvdW5kRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nU2VydmljZS5nbyh7IGN4Um91dGU6ICdjYXJ0JyB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhcnRDb2RlID0gdGhpcy5nZXRDYXJ0SWRGcm9tRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChjYXJ0Q29kZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aUNhcnRTZXJ2aWNlLnJlbG9hZENhcnQoY2FydENvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgc2VtYW50aWMgcm91dGUgaXMgcGFydCBvZiBcImNoZWNrb3V0XCJcbiAgICogQ2hlY2tvdXQgc2VtYW50aWMgcm91dGVzOlxuICAgKiBjaGVja291dFxuICAgKiBjaGVja291dFBheW1lbnRUeXBlXG4gICAqIENoZWNrb3V0U2hpcHBpbmdBZGRyZXNzXG4gICAqIGNoZWNrb3V0RGVsaXZlcnlNb2RlXG4gICAqIGNoZWNrb3V0UGF5bWVudERldGFpbHNcbiAgICogY2hlY2tvdXRSZXZpZXdPcmRlclxuICAgKiBjaGVja291dExvZ2luXG4gICAqIEBwYXJhbSBzZW1hbnRpY1JvdXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNVc2VySW5DaGVja291dFJvdXRlKHNlbWFudGljUm91dGU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2VtYW50aWNSb3V0ZT8udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjaGVja291dCcpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBvZiB0aGUgZXJyb3IgaXMgZm9yIGEgY2FydCBub3QgZm91bmQsIGkuZS4gdGhlIGNhcnQgZG9lc24ndCBleGlzdCBhbnltb3JlXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZVxuICAgKi9cbiAgcHJvdGVjdGVkIGlzQ2FydE5vdEZvdW5kRXJyb3IocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmXG4gICAgICByZXNwb25zZS5lcnJvcj8uZXJyb3JzPy5bMF0/LnR5cGUgPT09ICdDYXJ0RXJyb3InICYmXG4gICAgICByZXNwb25zZS5lcnJvcj8uZXJyb3JzPy5bMF0/LnJlYXNvbiA9PT0gJ25vdEZvdW5kJ1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FydElkRnJvbUVycm9yKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmVycm9yPy5lcnJvcnM/LlswXT8uc3ViamVjdDtcbiAgfVxufVxuIl19