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.

111 lines (110 loc) 5.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.customerLoyaltyReducer = exports.selectPointsProgram = exports.selectCustomerPoints = exports.selectCustomerPointsProgram = exports.selectHasPointsShop = exports.selectCustomerLoyaltyProgram = exports.selectCustomerLoyalty = exports.setCustomerLoyalty = exports.resetCustomerLoyaltyError = exports.resetCustomerLoyalty = exports.fetchCustomerLoyalty = exports.CustomerLoyaltyActionType = void 0; const tslib_1 = require("tslib"); const toolkit_1 = require("@reduxjs/toolkit"); const types_1 = require("../types"); const types_2 = require("@open-tender/types"); const account_1 = require("./account"); const initialState = { entities: [], error: null, loading: 'idle', lookup: {} }; var CustomerLoyaltyActionType; (function (CustomerLoyaltyActionType) { CustomerLoyaltyActionType["FetchCustomerLoyalty"] = "customer/fetchCustomerLoyalty"; })(CustomerLoyaltyActionType = exports.CustomerLoyaltyActionType || (exports.CustomerLoyaltyActionType = {})); exports.fetchCustomerLoyalty = (0, toolkit_1.createAsyncThunk)(CustomerLoyaltyActionType.FetchCustomerLoyalty, (_, { dispatch, getState, rejectWithValue }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { try { const api = getState().config.api; const token = (0, account_1.selectToken)(getState()); if (!token) throw new Error(types_2.MISSING_CUSTOMER); return yield api.getCustomerLoyaltyV2(token); } catch (err) { const error = err; return (0, account_1.checkAuth)(error, dispatch, () => rejectWithValue(error)); } })); const customerLoyaltySlice = (0, toolkit_1.createSlice)({ name: types_1.ReducerType.Loyalty, initialState, reducers: { resetCustomerLoyalty: () => initialState, resetCustomerLoyaltyError: state => { state.error = null; state.loading = 'idle'; }, setCustomerLoyalty: (state, action) => { var _a; state.entities = (_a = action.payload) !== null && _a !== void 0 ? _a : []; state.error = null; } }, extraReducers: builder => { builder .addCase(exports.fetchCustomerLoyalty.fulfilled, (state, action) => { var _a; state.entities = (_a = action.payload) !== null && _a !== void 0 ? _a : []; state.loading = 'idle'; state.error = null; }) .addCase(exports.fetchCustomerLoyalty.pending, state => { state.loading = 'pending'; }) .addCase(exports.fetchCustomerLoyalty.rejected, (state, action) => { state.error = action.payload; state.loading = 'idle'; }); } }); _a = customerLoyaltySlice.actions, exports.resetCustomerLoyalty = _a.resetCustomerLoyalty, exports.resetCustomerLoyaltyError = _a.resetCustomerLoyaltyError, exports.setCustomerLoyalty = _a.setCustomerLoyalty; const selectCustomerLoyalty = (state) => state.customer.loyalty; exports.selectCustomerLoyalty = selectCustomerLoyalty; exports.selectCustomerLoyaltyProgram = (0, toolkit_1.createSelector)((state) => { const { entities, loading, error } = state.customer.loyalty; return { entities, loading, error }; }, ({ entities, loading, error }) => { const programs = entities.filter(i => i.earn_order_type === null || i.earn_order_type === 'OLO'); const program = programs.length ? programs[0] : null; return { program, loading, error }; }); exports.selectHasPointsShop = (0, toolkit_1.createSelector)((state) => { const { entities } = state.customer.loyalty; return { entities }; }, ({ entities }) => { return !!entities.find(i => i.is_points_shop_enabled); }); const selectCustomerPointsProgram = (orderType) => (0, toolkit_1.createSelector)((state) => { const { loyalty } = state.customer; const { entities: loyaltyPrograms } = loyalty; return { loyaltyPrograms }; }, ({ loyaltyPrograms }) => { if (!loyaltyPrograms) return null; const programs = loyaltyPrograms.filter(i => { var _a; return ((_a = i.perk) === null || _a === void 0 ? void 0 : _a.loyalty_perk) === 'BANKABLE_POINTS' && (i.earn_order_type === null || i.earn_order_type === orderType); }); return programs.length ? programs[0] : null; }); exports.selectCustomerPointsProgram = selectCustomerPointsProgram; const selectCustomerPoints = (orderType) => (state) => { const program = (0, exports.selectCustomerPointsProgram)(orderType)(state); if (!program || !program.perk) return null; const { spend_name, perk } = program; return { name: spend_name, points: perk.credit }; }; exports.selectCustomerPoints = selectCustomerPoints; const selectPointsProgram = (state) => { const { orderType } = state.order; return orderType ? (0, exports.selectCustomerPointsProgram)(orderType)(state) : null; }; exports.selectPointsProgram = selectPointsProgram; exports.customerLoyaltyReducer = customerLoyaltySlice.reducer;