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

73 lines (72 loc) 3.23 kB
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;