system-praktyk-front/src/state/reducer/plan.ts
2021-01-11 23:03:25 +01:00

70 lines
2.4 KiB
TypeScript

import { InternshipPlanAction, InternshipPlanActions } from "@/state/actions";
import { Serializable } from "@/serialization/types";
import {
createSubmissionReducer,
defaultDeanApprovalsState,
defaultSubmissionState,
MayRequireDeanApproval,
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 { Api } from "mdi-material-ui";
export type InternshipPlanState = SubmissionState & MayRequireDeanApproval & {
document: Serializable<InternshipDocument> | null;
}
const defaultInternshipPlanState: InternshipPlanState = {
...defaultDeanApprovalsState,
...defaultSubmissionState,
document: null,
}
const internshipPlanSubmissionReducer: Reducer<InternshipPlanState, InternshipPlanAction> = createSubmissionReducer({
[InternshipPlanActions.Approve]: SubmissionAction.Approve,
[InternshipPlanActions.Decline]: SubmissionAction.Decline,
[InternshipPlanActions.Receive]: SubmissionAction.Receive,
[InternshipPlanActions.Save]: SubmissionAction.Save,
[InternshipPlanActions.Send]: SubmissionAction.Send,
})
const internshipPlanReducer = (state: InternshipPlanState = defaultInternshipPlanState, action: InternshipPlanAction): InternshipPlanState => {
state = internshipPlanSubmissionReducer(state, action);
switch (action.type) {
case InternshipPlanActions.Save:
case InternshipPlanActions.Send:
return {
...state,
document: action.document,
}
case InternshipPlanActions.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),
comment: action.comment || null,
document: action.document,
}
case InternshipPlanActions.Reset:
return defaultInternshipPlanState;
default:
return state;
}
}
export default internshipPlanReducer;