Add announcements page, i.e gazettes and comptes rendus

This commit is contained in:
pikiou
2022-02-07 17:21:22 +01:00
parent bd8a74cd17
commit 998691b542
19 changed files with 347 additions and 18 deletions

View File

@@ -0,0 +1,51 @@
import { PayloadAction, createSlice, createEntityAdapter } from "@reduxjs/toolkit"
import { StateRequest, toastError, elementListFetch } from "./utils"
import { Announcement } from "../services/announcement"
import { AppThunk, AppState } from "."
import { announcementListGet } from "../services/announcementAccessors"
const announcementAdapter = createEntityAdapter<Announcement>()
export const initialState = announcementAdapter.getInitialState({
readyStatus: "idle",
} as StateRequest)
const announcementList = createSlice({
name: "announcementList",
initialState,
reducers: {
getRequesting: (state) => {
state.readyStatus = "request"
},
getSuccess: (state, { payload }: PayloadAction<Announcement[]>) => {
state.readyStatus = "success"
announcementAdapter.setAll(state, payload)
},
getFailure: (state, { payload }: PayloadAction<string>) => {
state.readyStatus = "failure"
state.error = payload
},
},
})
export default announcementList.reducer
export const { getRequesting, getSuccess, getFailure } = announcementList.actions
export const fetchAnnouncementList = elementListFetch(
announcementListGet,
getRequesting,
getSuccess,
getFailure,
(error: Error) => toastError(`Erreur lors du chargement des announcements: ${error.message}`)
)
const shouldFetchAnnouncementList = (state: AppState) =>
state.announcementList.readyStatus !== "success"
export const fetchAnnouncementListIfNeed = (): AppThunk => (dispatch, getState) => {
const { jwt } = getState().auth
if (shouldFetchAnnouncementList(getState())) return dispatch(fetchAnnouncementList(jwt))
return null
}

View File

@@ -3,6 +3,7 @@ import { connectRouter } from "connected-react-router"
import auth from "./auth"
import javGameList from "./javGameList"
import announcementList from "./announcementList"
import preVolunteerAdd from "./preVolunteerAdd"
import preVolunteerCount from "./preVolunteerCount"
import teamList from "./teamList"
@@ -25,6 +26,7 @@ import wishList from "./wishList"
export default (history: History) => ({
auth,
javGameList,
announcementList,
preVolunteerAdd,
preVolunteerCount,
teamList,

View File

@@ -91,8 +91,8 @@ export function elementAddFetch<Element>(
}
}
export function elementListFetch<Element>(
elementListService: () => Promise<{
export function elementListFetch<Element, ServiceInput extends Array<any>>(
elementListService: (...idArgs: ServiceInput) => Promise<{
data?: Element[] | undefined
error?: Error | undefined
}>,
@@ -101,20 +101,21 @@ export function elementListFetch<Element>(
getFailure: ActionCreatorWithPayload<string, string>,
errorMessage?: (error: Error) => void,
successMessage?: () => void
): () => AppThunk {
return (): AppThunk => async (dispatch) => {
dispatch(getRequesting())
): (...idArgs: ServiceInput) => AppThunk {
return (...idArgs: ServiceInput): AppThunk =>
async (dispatch) => {
dispatch(getRequesting())
const { error, data } = await elementListService()
const { error, data } = await elementListService(...idArgs)
if (error) {
dispatch(getFailure(error.message))
errorMessage?.(error)
} else {
dispatch(getSuccess(data as Element[]))
successMessage?.()
if (error) {
dispatch(getFailure(error.message))
errorMessage?.(error)
} else {
dispatch(getSuccess(data as Element[]))
successMessage?.()
}
}
}
}
export function elementSet<Element>(