UNPKG

@automattic/shopping-cart

Version:
113 lines 4.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.noopManager = exports.createActionPromisesManager = exports.createSubscriptionManager = exports.getShoppingCartManagerState = void 0; const tslib_1 = require("tslib"); const debug_1 = tslib_1.__importDefault(require("debug")); const cart_functions_1 = require("./cart-functions"); const empty_carts_1 = require("./empty-carts"); const debug = (0, debug_1.default)('shopping-cart:managers'); function getShoppingCartManagerState(state) { const { cacheStatus, queuedActions, couponStatus, loadingErrorType, loadingError, lastValidResponseCart, } = state; const isLoading = cacheStatus === 'fresh' || cacheStatus === 'fresh-pending'; const isPendingUpdate = queuedActions.length > 0 || cacheStatus !== 'valid'; const loadingErrorForManager = cacheStatus === 'error' ? loadingError : null; debug('manager isLoading', isLoading, 'isPendingUpdate', isPendingUpdate, 'loadingError', loadingErrorForManager); return { isLoading, loadingError: loadingErrorForManager, loadingErrorType, isPendingUpdate, couponStatus, responseCart: lastValidResponseCart, }; } exports.getShoppingCartManagerState = getShoppingCartManagerState; function createSubscriptionManager(cartKey) { let subscribedClients = []; const subscribe = (callback) => { debug(`adding subscriber for cartKey ${cartKey}`); subscribedClients.push(callback); return () => { debug(`removing subscriber for cartKey ${cartKey}`); subscribedClients = subscribedClients.filter((prevCallback) => prevCallback !== callback); }; }; const notifySubscribers = () => { debug(`notifying ${subscribedClients.length} subscribers for cartKey ${cartKey}`); subscribedClients.forEach((clientCallback) => { try { clientCallback(); } catch (err) { // eslint-disable-next-line no-console console.error('An error ocurred while notifying a subscriber of a ShoppingCartManager change', err.message); throw err; } }); debug(`completed notification of subscribers for cartKey ${cartKey}`); }; return { subscribe, notifySubscribers }; } exports.createSubscriptionManager = createSubscriptionManager; /** * Create an object that manages the Promises returned by cart actions. * * When an action is requested, we create a Promise for that action dispatcher * to return and store it in this object. Later when we know if the action * resulted in a success or a failure, the resolve or reject methods are called * on this object; those methods then resolve or reject each Promise that was * waiting for a response. */ function createActionPromisesManager() { let actionPromises = []; return { resolve(tempResponseCart) { if (actionPromises.length > 0) { debug(`resolving ${actionPromises.length} action promises`); const responseCart = (0, cart_functions_1.convertTempResponseCartToResponseCart)(tempResponseCart); actionPromises.forEach((actionPromise) => actionPromise.resolve(responseCart)); actionPromises = []; } }, reject(error) { if (actionPromises.length > 0) { debug(`rejecting ${actionPromises.length} action promises`); actionPromises.forEach((actionPromise) => actionPromise.reject(error)); actionPromises = []; } }, add(actionPromise) { actionPromises.push(actionPromise); }, }; } exports.createActionPromisesManager = createActionPromisesManager; const emptyCart = (0, empty_carts_1.getEmptyResponseCart)(); const noopCartAction = () => Promise.reject('Cart actions cannot be taken without a cart key.'); const noopState = { isLoading: true, loadingError: undefined, loadingErrorType: undefined, isPendingUpdate: true, couponStatus: 'fresh', responseCart: emptyCart, }; const noopGetState = () => noopState; const noopActions = { addProductsToCart: noopCartAction, removeProductFromCart: noopCartAction, applyCoupon: noopCartAction, removeCoupon: noopCartAction, updateLocation: noopCartAction, replaceProductInCart: noopCartAction, replaceProductsInCart: noopCartAction, reloadFromServer: () => Promise.resolve(emptyCart), clearMessages: () => Promise.resolve(emptyCart), }; exports.noopManager = { actions: noopActions, getState: noopGetState, subscribe: () => () => null, fetchInitialCart: () => Promise.resolve(emptyCart), }; //# sourceMappingURL=managers.js.map