@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
73 lines (72 loc) • 3.23 kB
JavaScript
import { __awaiter, __generator } from "tslib";
import { makeFavoriteItems, makeFeatured, makeRecentItems } from '@open-tender/utils';
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { ReducerType } from './types';
var initialState = {
categories: [],
featured: [],
favorites: [],
recents: [],
soldOut: [],
error: null,
loading: 'idle'
};
export var MenuActionType;
(function (MenuActionType) {
MenuActionType["FetchMenu"] = "menu/fetchMenu";
})(MenuActionType || (MenuActionType = {}));
export var fetchMenu = createAsyncThunk(MenuActionType.FetchMenu, function (_a, _b) { return __awaiter(void 0, [_a, _b], void 0, function (_c, _d) {
var _e, config, customer, orders, favs, _f, categories, soldOut, recents, favorites, featured, err_1;
var revenueCenterId = _c.revenueCenterId, serviceType = _c.serviceType, requestedAt = _c.requestedAt;
var getState = _d.getState, rejectWithValue = _d.rejectWithValue;
return __generator(this, function (_g) {
switch (_g.label) {
case 0:
_g.trys.push([0, 2, , 3]);
_e = getState(), config = _e.config, customer = _e.customer;
orders = customer.orders, favs = customer.favorites;
return [4 /*yield*/, config.api.getMenu(revenueCenterId, serviceType, requestedAt)];
case 1:
_f = _g.sent(), categories = _f.menu, soldOut = _f.sold_out_items;
recents = makeRecentItems(categories, soldOut, orders);
favorites = makeFavoriteItems(categories, soldOut, favs);
featured = makeFeatured(categories);
return [2 /*return*/, { categories: categories, soldOut: soldOut, featured: featured, favorites: favorites, recents: recents }];
case 2:
err_1 = _g.sent();
return [2 /*return*/, rejectWithValue(err_1)];
case 3: return [2 /*return*/];
}
});
}); });
var menuSlice = createSlice({
name: ReducerType.Menu,
initialState: initialState,
reducers: {
resetMenu: function (state) { return state; }
},
extraReducers: function (builder) {
builder
.addCase(fetchMenu.fulfilled, function (state, action) {
var _a = action.payload, categories = _a.categories, soldOut = _a.soldOut, featured = _a.featured, favorites = _a.favorites, recents = _a.recents;
state.categories = categories;
state.featured = featured;
state.favorites = favorites;
state.recents = recents;
state.soldOut = soldOut;
state.loading = 'idle';
state.error = null;
})
.addCase(fetchMenu.pending, function (state) {
state.loading = 'pending';
})
.addCase(fetchMenu.rejected, function (state, action) {
state.error = action.payload;
state.loading = 'idle';
});
}
});
export var resetMenu = menuSlice.actions.resetMenu;
export var selectMenu = function (state) { return state.menu; };
export var selectSoldOut = function (state) { return state.menu.soldOut; };
export var menuReducer = menuSlice.reducer;