import { InternshipReportAction, InternshipReportActions } from "@/state/actions"; import { Serializable } from "@/serialization/types"; import { createSubmissionReducer, defaultDeanApprovalsState, defaultSubmissionState, SubmissionState } from "@/state/reducer/submission"; import { Reducer } from "react"; import { SubmissionAction } from "@/state/actions/submission"; import { InternshipDocument, SubmissionState as ApiSubmissionState } from "@/api/dto/internship-registration"; import { Report } from "@/data/report"; import { reportSerializationTransformer } from "@/serialization/report"; export type InternshipReportState = SubmissionState & { report: Serializable | null; evaluation: InternshipDocument | null; } const defaultInternshipReportState: InternshipReportState = { ...defaultDeanApprovalsState, ...defaultSubmissionState, report: null, evaluation: null, } export const getInternshipReport = ({ report }: InternshipReportState): Report | null => report && reportSerializationTransformer.reverseTransform(report); const internshipReportSubmissionReducer: Reducer = createSubmissionReducer({ [InternshipReportActions.Approve]: SubmissionAction.Approve, [InternshipReportActions.Decline]: SubmissionAction.Decline, [InternshipReportActions.Receive]: SubmissionAction.Receive, [InternshipReportActions.Save]: SubmissionAction.Save, [InternshipReportActions.Send]: SubmissionAction.Send, }) const internshipReportReducer = (state: InternshipReportState = defaultInternshipReportState, action: InternshipReportAction): InternshipReportState => { state = internshipReportSubmissionReducer(state, action); switch (action.type) { case InternshipReportActions.Reset: return defaultInternshipReportState; case InternshipReportActions.Save: case InternshipReportActions.Send: return { ...state, } case InternshipReportActions.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), report: reportSerializationTransformer.transform(action.report), comment: action.comment, evaluation: action.evaluation, } default: return state; } } export default internshipReportReducer;