@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
268 lines (267 loc) • 11.8 kB
JavaScript
var _a;
import { __assign, __awaiter, __generator } from "tslib";
import { createSlice, createAsyncThunk, createSelector } from '@reduxjs/toolkit';
import { PosAPI } from '../services';
import { errorsApi } from '../services/errors';
import { setApi } from './config';
import { setRevenueCenterId } from './order';
import { fetchRevenueCenter } from './revenueCenter';
import { ReducerType } from './types';
var initialState = {
app: null,
brand: null,
config: null,
content: null,
devices: null,
error: null,
loading: 'idle',
store: null,
styles: null,
ratio: 1,
retries: 0,
settings: null,
theme: null,
version: null,
paymentConfigs: null
};
export var KioskActionType;
(function (KioskActionType) {
KioskActionType["FetchKiosk"] = "kiosk/getKiosk";
KioskActionType["TestKioskPrinter"] = "kiosk/testKioskPrinter";
KioskActionType["FetchPaymentConfigs"] = "kiosk/fetchPaymentConfigs";
})(KioskActionType || (KioskActionType = {}));
var getError = function (kiosk, store, devices) {
var isEmptyKiosk = kiosk === null;
var isEmptyStore = store === null;
var isEmptyDevices = devices === null;
return isEmptyStore || isEmptyDevices
? errorsApi.missingKioskSettings
: isEmptyKiosk
? errorsApi.unableToReachConfigs
: errorsApi.internalServerError;
};
export var fetchKioskConfig = createAsyncThunk(KioskActionType.FetchKiosk, function (_a, _b) { return __awaiter(void 0, [_a, _b], void 0, function (_c, _d) {
var posTerminalId, app, api, promises, _e, kiosk, _f, devicesList, _g, stores, store, devices, err, brand, content, settings, theme, ratio, displaySettings, err_1;
var apiUrl = _c.apiUrl;
var dispatch = _d.dispatch, getState = _d.getState, rejectWithValue = _d.rejectWithValue;
return __generator(this, function (_h) {
switch (_h.label) {
case 0:
_h.trys.push([0, 2, , 3]);
posTerminalId = getState().pos.terminalId;
app = posTerminalId ? { apiUrl: apiUrl, posTerminalId: posTerminalId } : { apiUrl: apiUrl };
api = new PosAPI(app);
promises = [
api.getKioskConfig(),
api.getSettings('DEVICES'),
api.getSettings('STORE')
];
return [4 /*yield*/, Promise.all(promises)];
case 1:
_e = _h.sent(), kiosk = _e[0], _f = _e[1], devicesList = _f === void 0 ? [] : _f, _g = _e[2], stores = _g === void 0 ? [] : _g;
store = stores[0] || null;
devices = devicesList[0] || null;
if (!kiosk || !store || !devices) {
err = getError(kiosk, store, devices);
return [2 /*return*/, rejectWithValue(err)];
}
dispatch(fetchRevenueCenter({ revenueCenterId: store.revenue_center_id }));
dispatch(setApi(api));
dispatch(setRevenueCenterId(store.revenue_center_id));
brand = kiosk.brand, content = kiosk.content, settings = kiosk.settings, theme = kiosk.theme;
ratio = settings.ratio, displaySettings = settings.displaySettings;
return [2 /*return*/, {
app: app,
brand: brand,
config: null,
content: content,
devices: devices,
error: null,
loading: 'idle',
ratio: ratio,
retries: 0,
settings: displaySettings,
store: store,
styles: null,
theme: theme
}];
case 2:
err_1 = _h.sent();
return [2 /*return*/, rejectWithValue(err_1)];
case 3: return [2 /*return*/];
}
});
}); });
export var testKioskPrinter = createAsyncThunk(KioskActionType.TestKioskPrinter, function (_a, _b) { return __awaiter(void 0, [_a, _b], void 0, function (_c, _d) {
var posTerminalId, app, api, response, err_2;
var apiUrl = _c.apiUrl;
var getState = _d.getState, rejectWithValue = _d.rejectWithValue;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3]);
posTerminalId = getState().pos.terminalId;
app = posTerminalId ? { apiUrl: apiUrl, posTerminalId: posTerminalId } : { apiUrl: apiUrl };
api = new PosAPI(app);
return [4 /*yield*/, api.testPrint()];
case 1:
response = _e.sent();
return [2 /*return*/, response];
case 2:
err_2 = _e.sent();
return [2 /*return*/, rejectWithValue(errorsApi.tempUnavailable)];
case 3: return [2 /*return*/];
}
});
}); });
export var fetchPaymentConfigs = createAsyncThunk(KioskActionType.FetchPaymentConfigs, function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) {
var api, response, err_3;
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.fetchPaymentConfigs()];
case 1:
response = _c.sent();
return [2 /*return*/, response];
case 2:
err_3 = _c.sent();
return [2 /*return*/, rejectWithValue(errorsApi.tempUnavailable)];
case 3: return [2 /*return*/];
}
});
}); });
var kioskSlice = createSlice({
name: ReducerType.Kiosk,
initialState: initialState,
reducers: {
resetKiosk: function () { return initialState; },
resetKioskRetries: function (state) {
state.retries = 0;
},
incrementKioskRetries: function (state) {
state.retries = state.retries + 1;
},
setKioskVersion: function (state, action) {
state.version = action.payload;
},
setKioskRatio: function (state, action) {
state.ratio = action.payload;
},
setKioskConfig: function (state, action) {
state.config = action.payload;
},
setKioskStyles: function (state, action) {
state.styles = action.payload;
}
},
extraReducers: function (builder) {
builder
.addCase(fetchKioskConfig.fulfilled, function (state, action) {
var _a = action.payload, app = _a.app, brand = _a.brand, config = _a.config, content = _a.content, devices = _a.devices, ratio = _a.ratio, settings = _a.settings, store = _a.store, styles = _a.styles, theme = _a.theme;
state.app = app;
state.brand = brand;
state.config = config;
state.content = content;
state.devices = devices;
state.error = null;
state.loading = 'idle';
state.ratio = ratio;
state.retries = 0;
state.settings = settings;
state.store = store;
state.styles = styles;
state.theme = theme;
})
.addCase(fetchKioskConfig.pending, function (state) {
state.loading = 'pending';
})
.addCase(fetchKioskConfig.rejected, function (state, action) {
state.error = action.payload;
state.loading = 'idle';
});
builder
.addCase(testKioskPrinter.fulfilled, function (state) {
state.loading = 'idle';
})
.addCase(testKioskPrinter.pending, function (state) {
state.loading = 'pending';
})
.addCase(testKioskPrinter.rejected, function (state, action) {
state.error = action.payload;
state.loading = 'idle';
});
builder
.addCase(fetchPaymentConfigs.fulfilled, function (state, action) {
state.loading = 'idle';
state.paymentConfigs = action.payload;
})
.addCase(fetchPaymentConfigs.pending, function (state) {
state.loading = 'pending';
})
.addCase(fetchPaymentConfigs.rejected, function (state, action) {
state.error = action.payload;
state.loading = 'idle';
});
}
});
export var resetKiosk = (_a = kioskSlice.actions, _a.resetKiosk), resetKioskRetries = _a.resetKioskRetries, incrementKioskRetries = _a.incrementKioskRetries, setKioskVersion = _a.setKioskVersion, setKioskRatio = _a.setKioskRatio, setKioskConfig = _a.setKioskConfig, setKioskStyles = _a.setKioskStyles;
export var selectKiosk = function (state) { return state.kiosk; };
export var selectKioskVersion = function (state) { return state.kiosk.version; };
export var selectKioskStore = function (state) { return state.kiosk.store; };
export var selectKioskBrand = function (state) { return state.kiosk.brand; };
export var selectKioskDevices = function (state) { return state.kiosk.devices; };
export var selectTerminalId = function (state) { return state.pos.terminalId; };
export var selectStoreSettings = createSelector(selectKioskStore, function (store) {
return __assign({}, store);
});
export var selectKioskTerminal = createSelector([selectKioskDevices, selectTerminalId], function (devices, terminalId) {
var terminal = devices === null || devices === void 0 ? void 0 : devices.pos_terminals.find(function (i) { return i.pos_terminal_id === terminalId; });
return terminal || null;
});
export var selectKioskHasPrinter = createSelector([selectKioskDevices, selectTerminalId], function (devices, terminalId) {
var terminal = devices === null || devices === void 0 ? void 0 : devices.pos_terminals.find(function (i) { return i.pos_terminal_id === terminalId; });
if (!terminal)
return false;
var print_receipt = terminal.print_receipt, printers = terminal.printers;
if (print_receipt === 'never' || !printers.length)
return false;
return true;
});
export var selectKioskHasScanner = createSelector([selectKioskDevices, selectTerminalId], function (devices, terminalId) {
var terminal = devices === null || devices === void 0 ? void 0 : devices.pos_terminals.find(function (i) { return i.pos_terminal_id === terminalId; });
if (!terminal)
return false;
var pos_scanner_type = terminal.pos_scanner_type, pos_scanner = terminal.pos_scanner;
if (pos_scanner_type === 'NONE')
return false;
if (pos_scanner_type === 'MORPHSTICK' && !pos_scanner)
return false;
return true;
});
export var selectKioskApi = createSelector(function (state) {
var app = state.kiosk.app;
return app;
}, function (app) {
if (!app)
return 'http://kiosk';
return app.apiUrl.replace('/pos-api', '');
});
export var selectKioskConfig = createSelector(function (state) {
return state.kiosk.config;
}, function (config) {
return __assign({}, config);
});
export var selectKioskConfigScreen = function (screen) {
return createSelector(function (state) {
var config = state.kiosk.config;
return config;
}, function (config) {
return (config === null || config === void 0 ? void 0 : config[screen]) || null;
});
};
export var selectKioskStyles = function (state) { return state.kiosk.styles; };
export var selectKioskRatio = function (state) { return state.kiosk.ratio; };
export var kioskReducer = kioskSlice.reducer;