system-praktyk-front/src/state/reducer/report.ts
2021-01-18 01:24:18 +01:00

73 lines
2.8 KiB
TypeScript

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<Report> | 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<InternshipReportState, InternshipReportAction> = 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;