@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
JavaScript
;
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;