64 lines
2.6 KiB
TypeScript
64 lines
2.6 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;
|
|
}
|
|
|
|
const defaultInternshipProposalState: InternshipProposalState = {
|
|
...defaultDeanApprovalsState,
|
|
...defaultSubmissionState,
|
|
proposal: 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,
|
|
proposal: internshipSerializationTransformer.transform(action.internship),
|
|
}
|
|
case InternshipProposalActions.Receive:
|
|
return {
|
|
...state,
|
|
accepted: action.state === ApiSubmissionState.Accepted,
|
|
sent: [
|
|
ApiSubmissionState.Accepted,
|
|
ApiSubmissionState.Rejected,
|
|
ApiSubmissionState.Submitted
|
|
].includes(action.state),
|
|
proposal: internshipSerializationTransformer.transform(action.internship),
|
|
}
|
|
default:
|
|
return state;
|
|
}
|
|
}
|
|
|
|
export default internshipProposalReducer;
|