@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.
86 lines (85 loc) • 3.89 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.announcementsReducer = exports.selectHasAnnouncementsPage = exports.selectAnnouncementsPage = exports.selectAnnouncements = exports.resetAnnouncementsError = exports.resetAnnouncements = exports.fetchAnnouncementPage = exports.AnnouncementsActionType = void 0;
const tslib_1 = require("tslib");
const toolkit_1 = require("@reduxjs/toolkit");
const types_1 = require("./types");
const initialState = {
entities: [],
pages: [],
loading: 'idle',
error: null
};
var AnnouncementsActionType;
(function (AnnouncementsActionType) {
AnnouncementsActionType["FetchAnnouncementPage"] = "announcements/fetchAnnouncementPage";
})(AnnouncementsActionType = exports.AnnouncementsActionType || (exports.AnnouncementsActionType = {}));
exports.fetchAnnouncementPage = (0, toolkit_1.createAsyncThunk)(AnnouncementsActionType.FetchAnnouncementPage, (page, { getState, rejectWithValue }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
try {
const api = getState().config.api;
const response = yield api.getAnnouncementPage(page);
const settings = Object.assign({}, response);
delete settings.announcements;
const entities = response.announcements;
const payload = { settings, entities, page };
return payload;
}
catch (err) {
return rejectWithValue({ error: err, page });
}
}));
const announcementsSlice = (0, toolkit_1.createSlice)({
name: types_1.ReducerType.Announcements,
initialState,
reducers: {
resetAnnouncements: () => initialState,
resetAnnouncementsError: state => {
state.error = null;
}
},
extraReducers: builder => {
builder
.addCase(exports.fetchAnnouncementPage.fulfilled, (state, action) => {
const { page } = action.payload;
const pages = state.pages
? state.pages.filter(i => i.page !== page)
: [];
state.pages = [...pages, action.payload];
state.loading = 'idle';
state.error = null;
})
.addCase(exports.fetchAnnouncementPage.pending, state => {
state.loading = 'pending';
})
.addCase(exports.fetchAnnouncementPage.rejected, (state, action) => {
const { error, page } = action.payload || {};
state.error = error;
(state.pages = state.pages.filter(i => i.page !== page)),
(state.loading = 'idle');
});
}
});
_a = announcementsSlice.actions, exports.resetAnnouncements = _a.resetAnnouncements, exports.resetAnnouncementsError = _a.resetAnnouncementsError;
const selectAnnouncements = (state) => state.announcements;
exports.selectAnnouncements = selectAnnouncements;
const selectAnnouncementsPage = (page) => (0, toolkit_1.createSelector)((state) => {
const { pages, loading, error } = state.announcements;
return { pages, loading, error };
}, ({ pages, loading, error }) => {
const data = pages ? pages.find(i => i.page === page) : undefined;
const { settings = null, entities = [] } = data || {};
return { settings, entities, loading, error };
});
exports.selectAnnouncementsPage = selectAnnouncementsPage;
const selectHasAnnouncementsPage = (page) => (0, toolkit_1.createSelector)((state) => {
const { pages, loading } = state.announcements;
return { pages, loading };
}, ({ pages, loading }) => {
const data = pages ? pages.find(i => i.page === page) : undefined;
const { entities = [] } = data || {};
const hasAnnouncements = entities && entities.length;
return loading === 'pending' || hasAnnouncements ? true : false;
});
exports.selectHasAnnouncementsPage = selectHasAnnouncementsPage;
exports.announcementsReducer = announcementsSlice.reducer;