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

199 lines (198 loc) 8.23 kB
var _a; import { __awaiter, __generator } from "tslib"; import { currentLocalDateStr } from '@open-tender/utils'; import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; import { addAlert } from './alerts'; import { selectTimezone } from './config'; import { ReducerType } from './types'; var initialState = { terminalId: null, cashier: null, manager: null, isOffline: false, lastOrderId: null, page: null, name: '', notes: '', fontSize: 'medium', colorScheme: 'dark', order: null, refund: null, loading: 'idle', error: null }; export var PosActionType; (function (PosActionType) { PosActionType["FetchOfflineStatus"] = "pos/fetchOfflineStatus"; PosActionType["UpdateOfflineStatus"] = "pos/updateOfflineStatus"; PosActionType["PrintPosOrder"] = "pos/printPosOrder"; })(PosActionType || (PosActionType = {})); export var fetchOfflineStatus = createAsyncThunk(PosActionType.FetchOfflineStatus, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) { var api, response, 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]); api = getState().config.api; return [4 /*yield*/, api.getInternalSettings()]; case 1: response = _c.sent(); return [2 /*return*/, response.is_offline]; case 2: err_1 = _c.sent(); return [2 /*return*/, rejectWithValue(err_1)]; case 3: return [2 /*return*/]; } }); }); }); export var updateOfflineStatus = createAsyncThunk(PosActionType.UpdateOfflineStatus, function (is_offline_1, _a) { return __awaiter(void 0, [is_offline_1, _a], void 0, function (is_offline, _b) { var api, response, err_2; var 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; return [4 /*yield*/, api.postInternalSettings({ is_offline: is_offline })]; case 1: response = _c.sent(); return [2 /*return*/, response.is_offline]; case 2: err_2 = _c.sent(); return [2 /*return*/, rejectWithValue(err_2)]; case 3: return [2 /*return*/]; } }); }); }); export var printPosOrder = createAsyncThunk(PosActionType.PrintPosOrder, function (orderId_1, _a) { return __awaiter(void 0, [orderId_1, _a], void 0, function (orderId, _b) { var api, err_3, detail; var getState = _b.getState, dispatch = _b.dispatch; return __generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); api = getState().config.api; return [4 /*yield*/, api.postReceipt(orderId)]; case 1: _c.sent(); return [3 /*break*/, 3]; case 2: err_3 = _c.sent(); detail = err_3.detail; dispatch(addAlert(detail)); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); }); var posSlice = createSlice({ name: ReducerType.Pos, initialState: initialState, reducers: { resetPos: function () { return initialState; }, setPosTerminalId: function (state, action) { state.terminalId = action.payload; }, setLastOrderId: function (state, action) { state.lastOrderId = action.payload; state.page = null; state.name = ''; state.notes = ''; }, setMenuPage: function (state, action) { state.page = action.payload; }, setPosName: function (state, action) { state.name = action.payload; }, setPosNotes: function (state, action) { state.notes = action.payload; }, setCashier: function (state, action) { state.cashier = action.payload; }, setManager: function (state, action) { state.manager = action.payload; }, setPosFontSize: function (state, action) { state.fontSize = action.payload; }, setPosColorScheme: function (state, action) { state.colorScheme = action.payload; }, setPosOrder: function (state, action) { state.order = action.payload; }, setPosRefund: function (state, action) { state.refund = action.payload; } }, extraReducers: function (builder) { builder .addCase(fetchOfflineStatus.fulfilled, function (state, action) { state.isOffline = action.payload; state.loading = 'idle'; state.error = null; }) .addCase(fetchOfflineStatus.pending, function (state) { state.loading = 'pending'; }) .addCase(fetchOfflineStatus.rejected, function (state, action) { state.error = action.payload; state.loading = 'idle'; }) .addCase(updateOfflineStatus.fulfilled, function (state, action) { state.isOffline = action.payload; state.loading = 'idle'; state.error = null; }) .addCase(updateOfflineStatus.pending, function (state) { state.loading = 'pending'; }) .addCase(updateOfflineStatus.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(printPosOrder.fulfilled, function (state) { state.loading = 'idle'; }) .addCase(printPosOrder.pending, function (state) { state.loading = 'pending'; }) .addCase(printPosOrder.rejected, function (state) { state.loading = 'idle'; }); } }); export var resetPos = (_a = posSlice.actions, _a.resetPos), setPosTerminalId = _a.setPosTerminalId, setLastOrderId = _a.setLastOrderId, setMenuPage = _a.setMenuPage, setPosName = _a.setPosName, setPosNotes = _a.setPosNotes, setCashier = _a.setCashier, setManager = _a.setManager, setPosFontSize = _a.setPosFontSize, setPosColorScheme = _a.setPosColorScheme, setPosOrder = _a.setPosOrder, setPosRefund = _a.setPosRefund; export var selectPos = function (state) { return state.pos; }; export var selectPosTerminal = function (state) { var terminalId = state.pos.terminalId; if (!terminalId || !state.config.devices) return null; var pos_terminals = state.config.devices.pos_terminals; return pos_terminals.find(function (i) { return i.pos_terminal_id === terminalId; }); }; export var selectLastOrderId = function (state) { return state.pos.lastOrderId; }; export var selectMenuPage = function (state) { return state.pos.page; }; export var selectPosName = function (state) { return state.pos.name; }; export var selectPosNotes = function (state) { return state.pos.notes; }; export var selectCashier = function (state) { var cashier = state.pos.cashier; if (!cashier) return { cashier: null, isExpired: false }; var tz = selectTimezone(); var businessDate = currentLocalDateStr(tz); var isExpired = businessDate !== cashier.businessDate; if (isExpired) return { cashier: null, isExpired: true }; return { cashier: cashier, isExpired: false }; }; export var selectManager = function (state) { return state.pos.manager; }; export var selectIsOffline = function (state) { return state.pos.isOffline; }; export var selectPosOrder = function (state) { return state.pos.order; }; export var selectPosRefund = function (state) { return state.pos.refund; }; export var selectPosFontSize = function (state) { return state.pos.fontSize; }; export var selectPosColorScheme = function (state) { return state.pos.colorScheme; }; export var posReducer = posSlice.reducer;