@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
817 lines (816 loc) • 37 kB
JavaScript
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',
rate: null,
rating: 'idle',
ratingError: null
};
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["RateOrder"] = "checkout/rateOrder";
})(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 (data_1, _a) { return __awaiter(void 0, [data_1, _a], void 0, function (data, _b) {
var _c, config, order, checkout, orderId, api, amount, tender, card_token, hasLoyalty, data_2, 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 = __assign({ tender_type: 'CREDIT', amount: amount }, data);
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_2 = { card_token: card_token };
callback = function () { return dispatch(validatePosOrder()); };
dispatch(identifyCustomer({ data: data_2, 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*/];
}
});
}); });
export var rateOrder = createAsyncThunk(CheckoutActionType.RateOrder, function (_a, _b) { return __awaiter(void 0, [_a, _b], void 0, function (_c, _d) {
var api, response, err_12;
var orderId = _c.orderId, data = _c.data;
var getState = _d.getState, rejectWithValue = _d.rejectWithValue;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
api = getState().config.api;
if (!api)
return [2 /*return*/];
_e.label = 1;
case 1:
_e.trys.push([1, 3, , 4]);
return [4 /*yield*/, api.rateOrder(orderId, data)];
case 2:
response = _e.sent();
return [2 /*return*/, response];
case 3:
err_12 = _e.sent();
return [2 /*return*/, rejectWithValue(err_12)];
case 4: 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;
})
.addCase(rateOrder.fulfilled, function (state, action) {
state.rate = action.payload;
state.rating = 'idle';
state.ratingError = null;
})
.addCase(rateOrder.pending, function (state) {
state.rating = 'pending';
})
.addCase(rateOrder.rejected, function (state, action) {
state.rating = 'idle';
state.ratingError = 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;