UNPKG

@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
"use strict"; 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;