@open-tender/cloud
Version:
A library of hooks, reducers, utility functions, and types for use with Open Tender applications that utilize our cloud-based Order API.
98 lines (97 loc) • 4.16 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.menuReducer = exports.selectMenuOffset = exports.selectSoldOut = exports.selectMenu = exports.setOffsetTop = exports.setCartErrors = exports.resetOffsetTop = exports.resetMenuVars = exports.resetCartErrors = exports.resetMenu = exports.fetchMenu = exports.MenuActionType = void 0;
const tslib_1 = require("tslib");
const toolkit_1 = require("@reduxjs/toolkit");
const utils_1 = require("@open-tender/utils");
const types_1 = require("./types");
const order_1 = require("./order");
const initialState = {
menuVars: null,
previousMenuVars: null,
revenueCenters: null,
categories: [],
soldOut: [],
cartErrors: null,
offsetTop: null,
error: null,
loading: 'idle'
};
var MenuActionType;
(function (MenuActionType) {
MenuActionType["FetchMenu"] = "menu/fetchMenu";
})(MenuActionType = exports.MenuActionType || (exports.MenuActionType = {}));
exports.fetchMenu = (0, toolkit_1.createAsyncThunk)(MenuActionType.FetchMenu, (menuVars, { dispatch, getState, rejectWithValue }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const { api } = getState().config;
if (!api)
return;
const { revenueCenterId, serviceType, requestedAt } = menuVars;
try {
if (requestedAt === null) {
const err = getState().menu.error;
throw err;
}
const menu = yield api.getMenu(revenueCenterId, serviceType, requestedAt);
const { cart } = getState().order;
const { menu: categories, sold_out_items: soldOut, revenue_centers: revenueCenters } = menu;
const { newCart, errors } = (0, utils_1.validateCart)(cart !== null && cart !== void 0 ? cart : [], categories, soldOut, requestedAt);
if (errors) {
dispatch((0, exports.setCartErrors)({ newCart, errors }));
dispatch((0, order_1.setAlert)({ type: 'cartErrors' }));
}
else {
dispatch((0, order_1.setCart)(newCart));
dispatch((0, exports.resetCartErrors)());
}
return { categories, soldOut, revenueCenters, menuVars };
}
catch (err) {
dispatch((0, order_1.refreshRevenueCenter)(Object.assign(Object.assign({}, menuVars), { reset: true })));
return rejectWithValue(err);
}
}));
const menuSlice = (0, toolkit_1.createSlice)({
name: types_1.ReducerType.Menu,
initialState,
reducers: {
resetMenu: () => initialState,
resetMenuVars: state => {
state.menuVars = null;
state.previousMenuVars = null;
},
resetCartErrors: state => {
state.cartErrors = null;
},
setCartErrors: (state, action) => {
state.cartErrors = action.payload;
},
resetOffsetTop: state => {
state.offsetTop = null;
},
setOffsetTop: (state, action) => {
state.offsetTop = action.payload;
}
},
extraReducers: builder => {
builder
.addCase(exports.fetchMenu.fulfilled, (state, action) => {
return Object.assign(Object.assign(Object.assign({}, state), { previousMenuVars: state.menuVars || null, loading: 'idle', error: null }), action.payload);
})
.addCase(exports.fetchMenu.pending, state => {
state.loading = 'pending';
})
.addCase(exports.fetchMenu.rejected, (state, action) => {
state.loading = 'idle';
state.error = action.payload;
});
}
});
_a = menuSlice.actions, exports.resetMenu = _a.resetMenu, exports.resetCartErrors = _a.resetCartErrors, exports.resetMenuVars = _a.resetMenuVars, exports.resetOffsetTop = _a.resetOffsetTop, exports.setCartErrors = _a.setCartErrors, exports.setOffsetTop = _a.setOffsetTop;
const selectMenu = (state) => state.menu;
exports.selectMenu = selectMenu;
const selectSoldOut = (state) => state.menu.soldOut;
exports.selectSoldOut = selectSoldOut;
const selectMenuOffset = (state) => state.menu.offsetTop;
exports.selectMenuOffset = selectMenuOffset;
exports.menuReducer = menuSlice.reducer;