import {createSlice, createAsyncThunk} from "@reduxjs/toolkit"; import FirebaseQuery from "../../../firebase/firebaseQuery"; import { PlacementState } from "../types"; import { StudentPlacementData } from "../../../typeDefinitions"; const initialState: PlacementState = { status: "", lastPlacement: undefined, values: {} } export const updateCompletedStudentPlacement = createAsyncThunk( "completedStudentPlacements/updateStudentPlacement", async ({ placementId, attributes }:{placementId: string, attributes: Partial}, {rejectWithValue}) => { const firebaseQuery = new FirebaseQuery(); try { await firebaseQuery.update(["placements", placementId], attributes); return {attributes, placementId} } catch(error) { return rejectWithValue(error); } } ); export const deleteCompletedStudentPlacement = createAsyncThunk( "completedStudentPlacements/deleteStudentPlacement", async ({placementId}:{placementId: string}, { rejectWithValue}) => { const firebaseQuery = new FirebaseQuery(); try { await firebaseQuery.delete(["placements", placementId]); return placementId } catch(error) { return rejectWithValue(error); } } ); export const completedStudentPlacementsSlice = createSlice({ name: "completedStudentPlacements", initialState, reducers: { setCompletedStudentPlacements: (state, action) => { state.values = action.payload }, setCompletedStatus: (state, action) => { state.status = action.payload }, addCompletedStudentPlacements: (state, action) => { state.values = {...state.values, ...action.payload} }, setCompletedIsDraft: (state, action) => { const {placementId, draft} = action.payload state.values[placementId].draft = draft }, addCompletedStudentPlacement: (state, action) => { const {placement, placementId} = action.payload const newPlacements = {...state.values}; newPlacements[placementId] = placement; state.values = Object.fromEntries(Object.entries(newPlacements).sort(([, a], [, b]) => b.startDate > a.endDate ? 1 : -1)); }, setLastCompletedPlacement: (state, action) => { state.lastPlacement = action.payload } }, extraReducers(builder){ builder .addCase(updateCompletedStudentPlacement.fulfilled, (state, action) => { const {attributes, placementId} = action.payload if (!placementId) return state.values[placementId] = {...state.values[placementId], ...attributes}; }) .addCase(deleteCompletedStudentPlacement.fulfilled, (state, action) => { const placementIdToDelete = action.payload; const newPlacements = { ...state, values: { ...state.values } }; delete newPlacements.values[placementIdToDelete]; return newPlacements; }) } }) export const {addCompletedStudentPlacements, addCompletedStudentPlacement, setCompletedStudentPlacements, setLastCompletedPlacement, setCompletedStatus, setCompletedIsDraft} = completedStudentPlacementsSlice.actions export default completedStudentPlacementsSlice.reducer;