import { InternshipProposalAction, InternshipProposalActions } from "@/state/actions"; import { Internship } from "@/data"; import { Serializable } from "@/serialization/types"; import { internshipSerializationTransformer } from "@/serialization"; import { createSubmissionReducer, defaultDeanApprovalsState, defaultSubmissionState, MayRequireDeanApproval, SubmissionState } from "@/state/reducer/submission"; import { Reducer } from "react"; import { SubmissionAction } from "@/state/actions/submission"; import { SubmissionState as ApiSubmissionState } from "@/api/dto/internship-registration"; export type InternshipProposalState = SubmissionState & MayRequireDeanApproval & { proposal: Serializable | null; } const defaultInternshipProposalState: InternshipProposalState = { ...defaultDeanApprovalsState, ...defaultSubmissionState, proposal: null, } export const getInternshipProposal = ({ proposal }: InternshipProposalState): Internship | null => proposal && internshipSerializationTransformer.reverseTransform(proposal); const internshipProposalSubmissionReducer: Reducer = createSubmissionReducer({ [InternshipProposalActions.Approve]: SubmissionAction.Approve, [InternshipProposalActions.Decline]: SubmissionAction.Decline, [InternshipProposalActions.Receive]: SubmissionAction.Receive, [InternshipProposalActions.Save]: SubmissionAction.Save, [InternshipProposalActions.Send]: SubmissionAction.Send, }) const internshipProposalReducer = (state: InternshipProposalState = defaultInternshipProposalState, action: InternshipProposalAction): InternshipProposalState => { state = internshipProposalSubmissionReducer(state, action); switch (action.type) { case InternshipProposalActions.Save: case InternshipProposalActions.Send: return { ...state, } case InternshipProposalActions.Receive: if (state.overwritten) { return state; } return { ...state, accepted: action.state === ApiSubmissionState.Accepted, declined: action.state === ApiSubmissionState.Rejected, sent: [ ApiSubmissionState.Accepted, ApiSubmissionState.Rejected, ApiSubmissionState.Submitted ].includes(action.state), proposal: internshipSerializationTransformer.transform(action.internship), } default: return state; } } export default internshipProposalReducer;