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

72 lines
2.8 KiB
TypeScript

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<Internship> | null;
grade: number | null;
}
const defaultInternshipProposalState: InternshipProposalState = {
...defaultDeanApprovalsState,
...defaultSubmissionState,
proposal: null,
grade: null,
}
export const getInternshipProposal = ({ proposal }: InternshipProposalState): Internship | null =>
proposal && internshipSerializationTransformer.reverseTransform(proposal);
const internshipProposalSubmissionReducer: Reducer<InternshipProposalState, InternshipProposalAction> = 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),
comment: action.comment || "",
grade: action.grade || null,
}
default:
return state;
}
}
export default internshipProposalReducer;