UNPKG

@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

777 lines (776 loc) 35.4 kB
var _a; import { __assign, __awaiter, __generator } from "tslib"; import { handleRespError, makeSimpleCart } from '@open-tender/utils'; import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; import { v4 as uuidv4 } from 'uuid'; import { addAlert } from './alerts'; import { showNotification } from './notifications'; import { setCart, setOrderId } from './order'; import { setLastOrderId } from './pos'; import { ReducerType } from './types'; var initialState = { activating: 'idle', authorizing: 'idle', check: null, completedOrder: null, customer: null, discounts: [], error: null, giftCards: [], identifying: 'idle', isTaxExempt: false, loading: 'idle', madeFor: null, pendingDiscounts: false, phone: null, points: [], removing: 'idle', submitting: 'idle', surcharges: [], taxes: [], tip: null, validating: 'idle' }; var getAmountDue = function (check) { return check && check.totals ? check.totals.amount_due : null; }; export var prepareOrder = function (order, checkout) { var order_uuid = order.orderId, requested_at = order.requestedAt, service_type = order.serviceType, order_type = order.orderType, revenue_center_id = order.revenueCenterId, prep_type = order.prepType, table = order.table, deviceType = order.deviceType; if (!order_uuid) return null; var simpleCart = makeSimpleCart(order.cart); var cart = simpleCart.filter(function (item) { return item; }); if (!revenue_center_id || !order_type || !service_type) { return null; } var customer = checkout.customer, surcharges = checkout.surcharges, discounts = checkout.discounts, taxes = checkout.taxes, tip = checkout.tip, points = checkout.points, made_for = checkout.madeFor, phone = checkout.phone; return { order_uuid: order_uuid, revenue_center_id: revenue_center_id, service_type: service_type, requested_at: requested_at, customer: customer, cart: cart, surcharges: surcharges, discounts: discounts, taxes: taxes, tip: tip || '0.00', points: points, made_for: made_for, phone: phone, prep_type: prep_type, device_type: deviceType, notes_internal: table !== null && table.length > 0 ? "DINE IN -- TABLE ".concat(table) : null }; }; export var CheckoutActionType; (function (CheckoutActionType) { CheckoutActionType["AddPromoCode"] = "checkout/addPromoCode"; CheckoutActionType["AddTender"] = "checkout/addTender"; CheckoutActionType["RemoveTender"] = "checkout/removeTender"; CheckoutActionType["UpdateTender"] = "checkout/updateTender"; CheckoutActionType["UpdateCart"] = "checkout/updateCart"; CheckoutActionType["IdentifyCustomer"] = "checkout/identifyCustomer"; CheckoutActionType["CompleteChipDNA"] = "checkout/completeChipDNA"; CheckoutActionType["AddCreditTender"] = "checkout/addCreditTender"; CheckoutActionType["ValidatePosOrder"] = "checkout/validatePosOrder"; CheckoutActionType["SubmitPosOrder"] = "checkout/submitPosOrder"; CheckoutActionType["VoidPosOrder"] = "checkout/voidPosOrder"; CheckoutActionType["ActivateGiftCards"] = "checkout/activateGiftCards"; })(CheckoutActionType || (CheckoutActionType = {})); export var addPromoCode = createAsyncThunk(CheckoutActionType.AddPromoCode, function (promoCode_1, _a) { return __awaiter(void 0, [promoCode_1, _a], void 0, function (promoCode, _b) { var config, api, err_1; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); config = getState().config; api = config.api; return [4 /*yield*/, api.getDiscount(promoCode)]; case 1: return [2 /*return*/, _c.sent()]; case 2: err_1 = _c.sent(); return [2 /*return*/, rejectWithValue(err_1)]; case 3: return [2 /*return*/]; } }); }); }); export var addTender = createAsyncThunk(CheckoutActionType.AddTender, function (tender_1, _a) { return __awaiter(void 0, [tender_1, _a], void 0, function (tender, _b) { var _c, config, order, checkout, orderId, api, hasLoyalty, amountDue, response, amount, card_token, callback, data, err_2; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 5, , 6]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; orderId = order.orderId; if (!orderId) return [2 /*return*/]; api = config.api; hasLoyalty = config.store ? config.store.has_loyalty : false; amountDue = getAmountDue(checkout.check); return [4 /*yield*/, api.postTender(orderId, tender) // TODO: need to fix this ]; case 1: response = _d.sent(); amount = response.amount; card_token = null; callback = amount === amountDue ? function () { return dispatch(submitPosOrder()); } : function () { return dispatch(validatePosOrder()); }; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 2]; data = { card_token: card_token }; dispatch(identifyCustomer({ data: data, callback: callback })); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, callback()]; case 3: _d.sent(); _d.label = 4; case 4: return [2 /*return*/, response]; case 5: err_2 = _d.sent(); return [2 /*return*/, rejectWithValue(err_2)]; case 6: return [2 /*return*/]; } }); }); }); export var removeTender = createAsyncThunk(CheckoutActionType.RemoveTender, function (index_1, _a) { return __awaiter(void 0, [index_1, _a], void 0, function (index, _b) { var api, orderId, response, err_3; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); api = getState().config.api; orderId = getState().order.orderId; if (!orderId) return [2 /*return*/]; return [4 /*yield*/, api.postTenderVoid(orderId, index)]; case 1: response = _c.sent(); dispatch(validatePosOrder()); return [2 /*return*/, response]; case 2: err_3 = _c.sent(); return [2 /*return*/, rejectWithValue(err_3)]; case 3: return [2 /*return*/]; } }); }); }); export var updateTender = createAsyncThunk(CheckoutActionType.UpdateTender, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var api, orderId, check, tenders, totals, tender, index, amountTender, amountDue, amount, updatedTender, response, err_4; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 4, , 5]); api = getState().config.api; orderId = getState().order.orderId; check = getState().checkout.check; if (!orderId || !check) return [2 /*return*/]; tenders = check.tenders, totals = check.totals; tender = tenders.find(function (i) { return i.tender_status === 'AUTHORIZED'; }); if (!tender) return [2 /*return*/]; index = tender.tender_index || 0; amountTender = parseFloat(tender.amount); amountDue = parseFloat(totals.amount_due || '0.00'); amount = amountTender + amountDue; if (!(amount > 0)) return [3 /*break*/, 2]; updatedTender = { tender_type: tender.tender_type, amount: amount.toFixed(2) }; return [4 /*yield*/, api.patchTender(orderId, index, updatedTender)]; case 1: response = _c.sent(); dispatch(validatePosOrder()); return [2 /*return*/, response]; case 2: dispatch(removeTender(index)).then(function () { var msg = 'Order fully discounted. Tender removed.'; dispatch(showNotification(msg)); }); return [2 /*return*/]; case 3: return [3 /*break*/, 5]; case 4: err_4 = _c.sent(); return [2 /*return*/, rejectWithValue(err_4)]; case 5: return [2 /*return*/]; } }); }); }); // TODO: add types export var updateCart = createAsyncThunk(CheckoutActionType.UpdateCart, function (cartErrors_1, _a) { return __awaiter(void 0, [cartErrors_1, _a], void 0, function (cartErrors, _b) { var cart, _i, cartErrors_2, item, itemError, errIndices_1, newCart; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_c) { try { cart = getState().order.cart; if (!cart) return [2 /*return*/]; for (_i = 0, cartErrors_2 = cartErrors; _i < cartErrors_2.length; _i++) { item = cartErrors_2[_i]; itemError = item.id || item.groups || item.options; if (itemError) { dispatch(addAlert(itemError)); } } errIndices_1 = cartErrors.map(function (i) { return i.index; }); newCart = cart.filter(function (_, idx) { return !errIndices_1.includes(idx); }); dispatch(setCart(newCart)); // not necessary here since validatePosOrder() runs when // error is set to null when updateCart is fulfilled // dispatch(validatePosOrder()) return [2 /*return*/]; } catch (err) { return [2 /*return*/, rejectWithValue(err)]; } return [2 /*return*/]; }); }); }); export var identifyCustomer = createAsyncThunk(CheckoutActionType.IdentifyCustomer, function (_a, _b) { return __awaiter(void 0, [_a, _b], void 0, function (_c, _d) { var api, response, customer, discounts, points, discount, autoDiscounts, err_5, errMsg; var data = _c.data, callback = _c.callback, showError = _c.showError; var dispatch = _d.dispatch, getState = _d.getState, rejectWithValue = _d.rejectWithValue; return __generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 7, , 8]); api = getState().config.api; return [4 /*yield*/, api.postIdentifyCustomer(data)]; case 1: response = _e.sent(); customer = response.customer, discounts = response.discounts, points = response.points, discount = response.discount; dispatch(addCustomer(__assign(__assign({}, customer), { discounts: discounts, points: points, discount: discount }))); autoDiscounts = discounts.filter(function (i) { return i.is_auto; }); autoDiscounts.forEach(function (i) { var discountData = { id: i.discount_id, amount: i.amount }; dispatch(addDiscount(discountData)); var msg = "".concat(i.name, " discount applied!"); dispatch(showNotification(msg)); }); if (!(points && parseInt(points) > 0)) return [3 /*break*/, 3]; dispatch(setPendingDiscounts(true)); return [4 /*yield*/, dispatch(validatePosOrder())]; case 2: _e.sent(); return [3 /*break*/, 6]; case 3: if (!discounts.length) return [3 /*break*/, 5]; dispatch(setPendingDiscounts(autoDiscounts.length === 0)); return [4 /*yield*/, dispatch(validatePosOrder())]; case 4: _e.sent(); return [3 /*break*/, 6]; case 5: if (callback) { callback(); } _e.label = 6; case 6: return [2 /*return*/, response]; case 7: err_5 = _e.sent(); if (showError) { errMsg = err_5.status === 404 ? 'Customer not found. Please try again.' : err_5.detail || err_5.message; dispatch(addAlert(errMsg)); } if (callback) { callback(); return [2 /*return*/]; } else { return [2 /*return*/, rejectWithValue(err_5)]; } return [3 /*break*/, 8]; case 8: return [2 /*return*/]; } }); }); }); export var completeChipDNA = createAsyncThunk(CheckoutActionType.CompleteChipDNA, function (card_token_1, _a) { return __awaiter(void 0, [card_token_1, _a], void 0, function (card_token, _b) { var _c, config, checkout, hasLoyalty, data, callback, err_6; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 4, , 5]); _c = getState(), config = _c.config, checkout = _c.checkout; hasLoyalty = config.store ? config.store.has_loyalty : false; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 1]; data = { card_token: card_token }; callback = function () { return dispatch(validatePosOrder()); }; dispatch(identifyCustomer({ data: data, callback: callback })); return [2 /*return*/]; case 1: return [4 /*yield*/, dispatch(validatePosOrder())]; case 2: return [2 /*return*/, _d.sent()]; case 3: return [3 /*break*/, 5]; case 4: err_6 = _d.sent(); return [2 /*return*/, rejectWithValue(err_6)]; case 5: return [2 /*return*/]; } }); }); }); export var addCreditTender = createAsyncThunk(CheckoutActionType.AddCreditTender, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, orderId, api, amount, tender, card_token, hasLoyalty, data, callback, err_7; var _d; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 5, , 6]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; orderId = order.orderId; if (!orderId) return [2 /*return*/]; api = config.api; amount = getAmountDue(checkout.check); tender = { tender_type: 'CREDIT', amount: amount }; return [4 /*yield*/, api.postCreditTender(orderId, tender)]; case 1: _e.sent(); card_token = null; hasLoyalty = (_d = config.store) === null || _d === void 0 ? void 0 : _d.has_loyalty; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 2]; data = { card_token: card_token }; callback = function () { return dispatch(validatePosOrder()); }; dispatch(identifyCustomer({ data: data, callback: callback })); return [2 /*return*/]; case 2: return [4 /*yield*/, dispatch(validatePosOrder())]; case 3: return [2 /*return*/, _e.sent()]; case 4: return [3 /*break*/, 6]; case 5: err_7 = _e.sent(); return [2 /*return*/, rejectWithValue(err_7)]; case 6: return [2 /*return*/]; } }); }); }); export var validatePosOrder = createAsyncThunk(CheckoutActionType.ValidatePosOrder, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, check, submitted, validated_1, toRemove, err_8, errors, fields; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = prepareOrder(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.postOrderValidate(preparedOrder) // remove any submitted discounts that aren't applied ]; case 1: check = _d.sent(); submitted = preparedOrder.discounts; validated_1 = check.discounts.map(function (i) { return i.id; }); toRemove = submitted === null || submitted === void 0 ? void 0 : submitted.filter(function (discount) { return !validated_1.includes(discount.id); }); toRemove === null || toRemove === void 0 ? void 0 : toRemove.forEach(function (discount) { return dispatch(removeDiscount({ id: discount.id, index: discount.index })); }); return [2 /*return*/, check]; case 2: err_8 = _d.sent(); errors = handleRespError(err_8).errors; fields = errors ? Object.keys(errors) : []; if (fields.includes('order_uuid')) { dispatch(setOrderId(uuidv4())); } return [2 /*return*/, rejectWithValue(err_8)]; case 3: return [2 /*return*/]; } }); }); }); export var submitPosOrder = createAsyncThunk(CheckoutActionType.SubmitPosOrder, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, response, err_9, errors, fields; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = prepareOrder(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.postOrder(preparedOrder)]; case 1: response = _d.sent(); dispatch(setLastOrderId(response.order_uuid || null)); return [2 /*return*/, response]; case 2: err_9 = _d.sent(); errors = handleRespError(err_9).errors; fields = errors ? Object.keys(errors) : []; if (fields.includes('order_uuid')) { dispatch(setOrderId(uuidv4())); } return [2 /*return*/, rejectWithValue(err_9)]; case 3: return [2 /*return*/]; } }); }); }); export var voidPosOrder = createAsyncThunk(CheckoutActionType.VoidPosOrder, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, err_10; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = prepareOrder(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.deleteOrder(preparedOrder)]; case 1: return [2 /*return*/, _d.sent()]; case 2: err_10 = _d.sent(); return [2 /*return*/, rejectWithValue(err_10)]; case 3: return [2 /*return*/]; } }); }); }); export var activateGiftCards = createAsyncThunk(CheckoutActionType.ActivateGiftCards, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var api_1, giftCards, requests, err_11; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return __generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); api_1 = getState().config.api; giftCards = getState().checkout.giftCards; if (!api_1 || !giftCards.length) { return [2 /*return*/, giftCards]; } requests = giftCards.map(function (data) { return api_1.postGiftCardCredit(data); }); return [4 /*yield*/, Promise.all(requests)]; case 1: return [2 /*return*/, _c.sent()]; case 2: err_11 = _c.sent(); return [2 /*return*/, rejectWithValue(err_11)]; case 3: return [2 /*return*/]; } }); }); }); var checkoutSlice = createSlice({ name: ReducerType.Checkout, initialState: initialState, reducers: { resetPosCheckout: function () { return initialState; }, resetPosCheck: function (state) { state.check = null; state.loading = 'idle'; state.error = null; }, resetPosCheckError: function (state) { state.loading = 'idle'; state.error = null; }, handleCheckoutError: function (state, action) { var _a = action.payload, key = _a[0], errors = _a[1]; var index = typeof errors === 'string' ? 0 : errors[0].index; var discounts = state.discounts, surcharges = state.surcharges, taxes = state.taxes; switch (key) { case 'discounts': state.discounts = discounts.filter(function (_, idx) { return idx !== index; }); break; case 'surcharges': state.surcharges = surcharges.filter(function (_, idx) { return idx !== index; }); break; case 'taxes': state.taxes = taxes.filter(function (_, idx) { return idx !== index; }); break; default: break; } state.error = null; }, setMadeFor: function (state, action) { state.madeFor = action.payload; }, setPhone: function (state, action) { state.phone = action.payload; }, addGiftCard: function (state, action) { state.giftCards.push(action.payload); }, removeGiftCard: function (state, action) { state.giftCards = state.giftCards.filter(function (i) { return i.code !== action.payload; }); }, addSurcharge: function (state, action) { state.surcharges.push(action.payload); }, removeSurcharge: function (state, action) { var id = action.payload.id; state.surcharges = state.surcharges.filter(function (i) { return i.id !== id; }); }, addDiscount: function (state, action) { state.discounts.push(action.payload); }, removeDiscount: function (state, action) { var id = action.payload.id; var discountIndex = action.payload.index; var discount = state.check ? state.check.discounts.find(function (item) { return item.id === id && item.index === discountIndex; }) : null; if (discount && discount.discount_type === 'LOYALTY') { state.points = []; } else { state.discounts = state.discounts.filter(function (item) { return item.id !== id || (item.id === id && item.index !== undefined && item.index !== discountIndex); }); } }, addTax: function (state, action) { state.taxes.push(action.payload); }, removeTax: function (state, action) { state.taxes = state.taxes.filter(function (i) { return i.id !== action.payload; }); }, addTip: function (state, action) { state.tip = action.payload; }, removeTip: function (state) { state.tip = null; }, setTaxExempt: function (state, action) { state.isTaxExempt = action.payload; }, addCustomer: function (state, action) { state.customer = action.payload; }, removeCustomer: function (state) { state.points = []; state.customer = null; }, setPendingDiscounts: function (state, action) { state.pendingDiscounts = action.payload; }, setPoints: function (state, action) { state.points = action.payload; } }, extraReducers: function (builder) { builder .addCase(addPromoCode.fulfilled, function (state, action) { var discount_id = action.payload.discount_id; state.discounts.push({ id: discount_id }); state.loading = 'idle'; state.error = null; }) .addCase(addPromoCode.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(addPromoCode.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(addTender.fulfilled, function (state) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = null; }) .addCase(addTender.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(addTender.rejected, function (state, action) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = action.payload; }) .addCase(removeTender.fulfilled, function (state) { state.loading = 'idle'; state.removing = 'idle'; state.error = null; }) .addCase(removeTender.pending, function (state) { state.loading = 'pending'; state.removing = 'pending'; }) .addCase(removeTender.rejected, function (state, action) { state.loading = 'idle'; state.removing = 'idle'; state.error = action.payload; }) .addCase(updateTender.fulfilled, function (state) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = null; }) .addCase(updateTender.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(updateTender.rejected, function (state, action) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = action.payload; }) .addCase(updateCart.fulfilled, function (state) { state.error = null; }) // .addCase(updateCart.pending, () => {}) .addCase(updateCart.rejected, function (state, action) { state.error = action.payload; }) .addCase(identifyCustomer.fulfilled, function (state) { state.loading = 'idle'; state.identifying = 'idle'; state.error = null; }) .addCase(identifyCustomer.pending, function (state) { state.loading = 'pending'; state.identifying = 'pending'; }) .addCase(identifyCustomer.rejected, function (state, action) { state.loading = 'idle'; state.identifying = 'idle'; state.error = action.payload; }) .addCase(completeChipDNA.fulfilled, function (state) { state.loading = 'idle'; state.error = null; }) .addCase(completeChipDNA.pending, function (state) { state.loading = 'pending'; }) .addCase(completeChipDNA.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(addCreditTender.fulfilled, function (state) { state.loading = 'idle'; state.error = null; }) .addCase(addCreditTender.pending, function (state) { state.loading = 'pending'; }) .addCase(addCreditTender.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(validatePosOrder.fulfilled, function (state, action) { state.check = action.payload || null; state.loading = 'idle'; state.validating = 'idle'; state.error = null; }) .addCase(validatePosOrder.pending, function (state) { state.loading = 'pending'; state.validating = 'pending'; }) .addCase(validatePosOrder.rejected, function (state, action) { state.loading = 'idle'; state.validating = 'idle'; state.error = action.payload; }) .addCase(submitPosOrder.fulfilled, function (state, action) { if (action.payload) { return __assign(__assign({}, initialState), { completedOrder: action.payload }); } else { state.check = null; state.error = null; state.loading = 'idle'; state.submitting = 'idle'; return; } }) .addCase(submitPosOrder.pending, function (state) { state.loading = 'pending'; state.submitting = 'pending'; }) .addCase(submitPosOrder.rejected, function (state, action) { // state.check = null state.loading = 'idle'; state.submitting = 'idle'; state.error = action.payload; }) .addCase(voidPosOrder.fulfilled, function () { return initialState; }) .addCase(voidPosOrder.pending, function (state) { state.loading = 'pending'; }) .addCase(voidPosOrder.rejected, function () { return initialState; }) .addCase(activateGiftCards.fulfilled, function (state, action) { state.giftCards = action.payload; state.loading = 'idle'; state.activating = 'idle'; state.error = null; }) .addCase(activateGiftCards.pending, function (state) { state.loading = 'pending'; state.activating = 'pending'; }) .addCase(activateGiftCards.rejected, function (state, action) { state.loading = 'idle'; state.activating = 'idle'; state.error = action.payload; }); } }); export var resetPosCheckout = (_a = checkoutSlice.actions, _a.resetPosCheckout), resetPosCheck = _a.resetPosCheck, resetPosCheckError = _a.resetPosCheckError, handleCheckoutError = _a.handleCheckoutError, addGiftCard = _a.addGiftCard, removeGiftCard = _a.removeGiftCard, addSurcharge = _a.addSurcharge, removeSurcharge = _a.removeSurcharge, addDiscount = _a.addDiscount, removeDiscount = _a.removeDiscount, addTax = _a.addTax, removeTax = _a.removeTax, addTip = _a.addTip, removeTip = _a.removeTip, setTaxExempt = _a.setTaxExempt, addCustomer = _a.addCustomer, removeCustomer = _a.removeCustomer, setPendingDiscounts = _a.setPendingDiscounts, setPoints = _a.setPoints, setMadeFor = _a.setMadeFor, setPhone = _a.setPhone; export var selectPosCheckout = function (state) { return state.checkout; }; export var selectPosCheck = function (state) { return state.checkout.check; }; export var selectPosCustomer = function (state) { return state.checkout.customer; }; export var selectPosCustomerName = function (state) { if (!state.checkout.customer) return null; var _a = state.checkout.customer.customer, first_name = _a.first_name, last_name = _a.last_name; return "".concat(first_name, " ").concat(last_name); }; export var selectPosCustomerNameShort = function (state) { if (!state.checkout.customer) return null; var _a = state.checkout.customer.customer, first_name = _a.first_name, last_name = _a.last_name; var lastName = (last_name === null || last_name === void 0 ? void 0 : last_name.charAt(0)) || ''; return "".concat(first_name, " ").concat(lastName); }; export var selectPosPendingDiscounts = function (state) { return state.checkout.pendingDiscounts; }; export var selectPosAmountDue = function (state) { var check = state.checkout.check; var amountDue = check ? check.totals.amount_due : null; return amountDue || null; }; export var selectPosCheckSubtotal = function (state) { var check = state.checkout.check; var subtotal = check ? check.totals.subtotal : '0.00'; return subtotal || null; }; export var selectPosCheckTotal = function (state) { var check = state.checkout.check; var total = check ? check.totals.total : '0.00'; return total || null; }; export var selectPosCheckTenders = function (state) { var check = state.checkout.check; return check ? check.tenders : []; }; // export const selectPosCheckGiftCardCodes = (state: AppState) => { // const check = state.checkout.check // return check // ? check.tenders // .filter( // i => i.tender_type === 'GIFT_CARD' && i.tender_status === 'AUTHORIZED' // ) // .map(i => (i.gift_card ? i.gift_card.code : null)) // .filter(i => i) // : [] // } export var checkoutReducer = checkoutSlice.reducer;