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.

86 lines (85 loc) 3.89 kB
"use strict"; 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;