@open-tender/store
Version:
A library of hooks, reducers, utility functions, and types for use with Open Tender applications that utilize our in-store POS API
320 lines (319 loc) • 15.5 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectCartIds = exports.selectCart = exports.selectCurrentSection = exports.selectCurrentOption = exports.selectCurrentItem = exports.selectCurrentCategory = exports.selectCurrentVendor = exports.selectMenuVars = exports.selectMenuSlug = exports.selectRevenueCenterId = exports.selectRequestedAt = exports.selectServiceTypeName = exports.selectServiceType = exports.selectOrderTypeName = exports.selectOrderType = exports.selectMessages = exports.selectAlert = exports.selectOrder = exports.setOrderDeviceType = exports.removeMessage = exports.addMessage = exports.decrementItemInCart = exports.incrementItemInCart = exports.removeItemFromCart = exports.addItemToCart = exports.setCurrentSection = exports.setCurrentOption = exports.setCurrentItem = exports.setCurrentCategory = exports.setCurrentVendor = exports.setCart = exports.setMenuVars = exports.setOrderServiceType = exports.setPrepType = exports.setTable = exports.setRevenueCenterId = exports.setRequestedAt = exports.setServiceType = exports.setOrderType = exports.setOrderId = exports.setAlert = exports.resetAlert = exports.resetMessages = exports.resetCart = exports.resetLocation = exports.resetRevenueCenter = exports.resetOrderType = exports.resetOrder = exports.reorder = exports.OrderActionType = void 0;
exports.orderReducer = exports.selectCartValidate = exports.selectCanOrder = exports.selectCartCounts = exports.selectCartTotals = exports.selectCartTotal = exports.selectCartQuantity = void 0;
var tslib_1 = require("tslib");
var utils_1 = require("@open-tender/utils");
var toolkit_1 = require("@reduxjs/toolkit");
var types_1 = require("./types");
var initialState = {
orderId: null,
orderType: null,
serviceType: null,
revenueCenterId: null,
table: null,
prepType: null,
requestedAt: 'asap',
currentVendor: null,
currentCategory: null,
currentItem: null,
currentOption: null,
currentSection: null,
cart: [],
cartCounts: {},
messages: [],
alert: null,
error: null,
loading: 'idle',
deviceType: 'KIOSK'
};
var OrderActionType;
(function (OrderActionType) {
OrderActionType["Reorder"] = "orders/reorder";
})(OrderActionType || (exports.OrderActionType = OrderActionType = {}));
exports.reorder = (0, toolkit_1.createAsyncThunk)(OrderActionType.Reorder, function (orderCart_1, _a) { return tslib_1.__awaiter(void 0, [orderCart_1, _a], void 0, function (orderCart, _b) {
var _c, config, order, revenueCenterId, serviceType, requestedAt, categories, menuItems, simpleCart, _d, cart, cartCounts, err_1;
var getState = _b.getState, rejectWithValue = _b.rejectWithValue;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3]);
_c = getState(), config = _c.config, order = _c.order;
revenueCenterId = order.revenueCenterId || 0;
serviceType = order.serviceType || 'WALKIN';
requestedAt = (0, utils_1.dateToIso)(new Date(), (0, utils_1.getUserTimezone)());
return [4 /*yield*/, config.api.getMenu(revenueCenterId, serviceType, requestedAt)];
case 1:
categories = (_e.sent()).menu;
menuItems = Object.values((0, utils_1.makeMenuItemLookup)(categories));
simpleCart = (0, utils_1.makeSimpleCart)(orderCart);
_d = (0, utils_1.rehydrateCart)(menuItems, simpleCart), cart = _d.cart, cartCounts = _d.cartCounts;
return [2 /*return*/, { cart: cart, cartCounts: cartCounts }];
case 2:
err_1 = _e.sent();
return [2 /*return*/, rejectWithValue(err_1)];
case 3: return [2 /*return*/];
}
});
}); });
var orderSlice = (0, toolkit_1.createSlice)({
name: types_1.ReducerType.Orders,
initialState: initialState,
reducers: {
resetOrder: function () { return initialState; },
resetOrderType: function (state) {
state.orderId = null;
state.orderType = null;
state.serviceType = null;
state.prepType = null;
state.revenueCenterId = null;
state.table = null;
state.requestedAt = 'asap';
},
resetRevenueCenter: function (state) {
state.revenueCenterId = null;
},
resetLocation: function (state) {
state.revenueCenterId = null;
},
resetCart: function (state) {
state.cart = [];
state.cartCounts = {};
},
resetMessages: function (state) {
state.messages = [];
},
resetAlert: function (state) {
state.alert = null;
},
setAlert: function (state, action) {
state.alert = action.payload;
},
setOrderId: function (state, action) {
state.orderId = action.payload;
},
setOrderType: function (state, action) {
state.orderType = action.payload;
},
setServiceType: function (state, action) {
state.serviceType = action.payload;
},
setRequestedAt: function (state, action) {
state.requestedAt = action.payload;
},
setRevenueCenterId: function (state, action) {
state.revenueCenterId = action.payload;
},
setTable: function (state, action) {
state.table = action.payload;
},
setPrepType: function (state, action) {
state.prepType = action.payload;
},
setOrderServiceType: function (state, action) {
var _a = action.payload, orderType = _a.orderType, serviceType = _a.serviceType;
state.orderType = orderType;
state.serviceType = serviceType;
},
setMenuVars: function (state, action) {
var _a = action.payload, revenueCenterId = _a.revenueCenterId, serviceType = _a.serviceType, requestedAt = _a.requestedAt;
state.revenueCenterId = revenueCenterId;
state.serviceType = serviceType;
state.requestedAt = requestedAt;
},
setCart: function (state, action) {
state.cart = action.payload;
state.cartCounts = (0, utils_1.calcCartCounts)(action.payload);
},
setCurrentVendor: function (state, action) {
state.currentVendor = action.payload;
},
setCurrentCategory: function (state, action) {
state.currentCategory = action.payload;
},
setCurrentItem: function (state, action) {
state.currentItem = action.payload;
},
setCurrentOption: function (state, action) {
state.currentOption = action.payload;
},
setCurrentSection: function (state, action) {
state.currentSection = action.payload;
},
setOrderDeviceType: function (state, action) {
state.deviceType = action.payload;
},
addItemToCart: function (state, action) {
var _a = (0, utils_1.addItem)(tslib_1.__spreadArray([], state.cart, true), action.payload), cart = _a.cart, cartCounts = _a.cartCounts;
state.cart = cart;
state.cartCounts = cartCounts;
},
removeItemFromCart: function (state, action) {
var index = action.payload.index;
var _a = (0, utils_1.removeItem)(tslib_1.__spreadArray([], state.cart, true), index), cart = _a.cart, cartCounts = _a.cartCounts;
state.cart = cart;
state.cartCounts = cartCounts;
},
incrementItemInCart: function (state, action) {
var index = action.payload.index;
var _a = (0, utils_1.incrementItem)(tslib_1.__spreadArray([], state.cart, true), index), cart = _a.cart, cartCounts = _a.cartCounts;
state.cart = cart;
state.cartCounts = cartCounts;
},
decrementItemInCart: function (state, action) {
var index = action.payload.index;
var _a = (0, utils_1.decrementItem)(tslib_1.__spreadArray([], state.cart, true), index), cart = _a.cart, cartCounts = _a.cartCounts;
state.cart = cart;
state.cartCounts = cartCounts;
},
addMessage: function (state, action) {
var existing = state.messages.map(function (i) { return i.message; });
if (!existing.includes(action.payload)) {
state.messages = tslib_1.__spreadArray(tslib_1.__spreadArray([], state.messages, true), [
{
message: action.payload,
id: (0, utils_1.makeRandomNumberString)()
}
], false);
}
},
removeMessage: function (state, action) {
state.messages = state.messages.filter(function (i) { return i.id !== action.payload; });
}
},
extraReducers: function (builder) {
builder
.addCase(exports.reorder.fulfilled, function (state, action) {
state.cart = action.payload.cart;
state.cartCounts = action.payload.cartCounts;
state.serviceType = 'WALKIN';
state.orderType = 'OLO';
state.prepType = 'EAT_HERE';
state.loading = 'idle';
state.error = null;
})
.addCase(exports.reorder.pending, function (state) {
state.loading = 'pending';
})
.addCase(exports.reorder.rejected, function (state, action) {
state.error = action.payload;
state.loading = 'idle';
});
}
});
exports.resetOrder = (_a = orderSlice.actions, _a.resetOrder), exports.resetOrderType = _a.resetOrderType, exports.resetRevenueCenter = _a.resetRevenueCenter, exports.resetLocation = _a.resetLocation, exports.resetCart = _a.resetCart, exports.resetMessages = _a.resetMessages, exports.resetAlert = _a.resetAlert, exports.setAlert = _a.setAlert, exports.setOrderId = _a.setOrderId, exports.setOrderType = _a.setOrderType, exports.setServiceType = _a.setServiceType, exports.setRequestedAt = _a.setRequestedAt, exports.setRevenueCenterId = _a.setRevenueCenterId, exports.setTable = _a.setTable, exports.setPrepType = _a.setPrepType, exports.setOrderServiceType = _a.setOrderServiceType, exports.setMenuVars = _a.setMenuVars, exports.setCart = _a.setCart, exports.setCurrentVendor = _a.setCurrentVendor, exports.setCurrentCategory = _a.setCurrentCategory, exports.setCurrentItem = _a.setCurrentItem, exports.setCurrentOption = _a.setCurrentOption, exports.setCurrentSection = _a.setCurrentSection, exports.addItemToCart = _a.addItemToCart, exports.removeItemFromCart = _a.removeItemFromCart, exports.incrementItemInCart = _a.incrementItemInCart, exports.decrementItemInCart = _a.decrementItemInCart, exports.addMessage = _a.addMessage, exports.removeMessage = _a.removeMessage, exports.setOrderDeviceType = _a.setOrderDeviceType;
var selectOrder = function (state) { return state.order; };
exports.selectOrder = selectOrder;
var selectAlert = function (state) { return state.order.alert; };
exports.selectAlert = selectAlert;
var selectMessages = function (state) { return state.order.messages; };
exports.selectMessages = selectMessages;
var selectOrderType = function (state) { return state.order.orderType; };
exports.selectOrderType = selectOrderType;
var selectOrderTypeName = function (state) {
return utils_1.orderTypeNamesMap[state.order.orderType];
};
exports.selectOrderTypeName = selectOrderTypeName;
var selectServiceType = function (state) { return state.order.serviceType; };
exports.selectServiceType = selectServiceType;
var selectServiceTypeName = function (state) {
return utils_1.serviceTypeNamesMap[state.order.serviceType];
};
exports.selectServiceTypeName = selectServiceTypeName;
var selectRequestedAt = function (state) {
return state.order.requestedAt === 'asap' ? 'ASAP' : state.order.requestedAt;
};
exports.selectRequestedAt = selectRequestedAt;
var selectRevenueCenterId = function (state) {
return state.order.revenueCenterId;
};
exports.selectRevenueCenterId = selectRevenueCenterId;
var selectMenuSlug = function (state) {
var slug = (state.config.store || {}).slug;
return slug ? "/menu/".concat(slug) : '/';
};
exports.selectMenuSlug = selectMenuSlug;
var selectMenuVars = function (state) {
return {
revenueCenterId: state.order.revenueCenterId,
serviceType: state.order.serviceType,
requestedAt: state.order.requestedAt
};
};
exports.selectMenuVars = selectMenuVars;
var selectCurrentVendor = function (state) {
return state.order.currentVendor;
};
exports.selectCurrentVendor = selectCurrentVendor;
var selectCurrentCategory = function (state) {
return state.order.currentCategory;
};
exports.selectCurrentCategory = selectCurrentCategory;
var selectCurrentItem = function (state) { return state.order.currentItem; };
exports.selectCurrentItem = selectCurrentItem;
var selectCurrentOption = function (state) {
return state.order.currentOption;
};
exports.selectCurrentOption = selectCurrentOption;
var selectCurrentSection = function (state) {
return state.order.currentSection;
};
exports.selectCurrentSection = selectCurrentSection;
var selectCart = function (state) { return state.order.cart; };
exports.selectCart = selectCart;
exports.selectCartIds = (0, toolkit_1.createSelector)(function (state) {
var cart = state.order.cart;
return cart;
}, function (cart) {
if (!cart)
return [];
return cart.map(function (i) { return i.id; });
});
exports.selectCartQuantity = (0, toolkit_1.createSelector)(function (state) {
var cart = state.order.cart;
return cart;
}, function (cart) {
if (!cart)
return 0;
return cart.reduce(function (t, i) { return (t += i.quantity); }, 0);
});
exports.selectCartTotal = (0, toolkit_1.createSelector)(function (state) {
var cart = state.order.cart;
return cart;
}, function (cart) {
if (!cart)
return 0.0;
return cart.reduce(function (t, i) { return (t += i.totalPrice || 0); }, 0.0);
});
exports.selectCartTotals = (0, toolkit_1.createSelector)(function (state) {
var cart = state.order.cart;
return cart;
}, function (cart) {
if (!cart)
return { count: 0, total: 0.0 };
var count = cart.reduce(function (t, i) { return (t += i.quantity); }, 0);
var total = cart.reduce(function (t, i) { return (t += i.totalPrice || 0); }, 0.0);
return { count: count, total: total };
});
var selectCartCounts = function (state) {
return state.order.cartCounts || {};
};
exports.selectCartCounts = selectCartCounts;
var selectCanOrder = function (state) {
return state.order.revenueCenterId &&
state.order.serviceType &&
state.order.requestedAt;
};
exports.selectCanOrder = selectCanOrder;
var selectCartValidate = function (state) {
var _a = state.order || {}, revenueCenterId = _a.revenueCenterId, serviceType = _a.serviceType, requestedAt = _a.requestedAt, cart = _a.cart;
return {
revenueCenterId: revenueCenterId,
serviceType: serviceType,
requestedAt: requestedAt,
cart: cart
};
};
exports.selectCartValidate = selectCartValidate;
exports.orderReducer = orderSlice.reducer;