Add proposal reducer
This commit is contained in:
parent
1f127323a7
commit
45bf07a28b
3
src/data/deanApproval.ts
Normal file
3
src/data/deanApproval.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export type DeanApproval = {
|
||||
|
||||
}
|
@ -1 +1,5 @@
|
||||
export * from './company'
|
||||
export * from './edition'
|
||||
export * from './student'
|
||||
export * from './internship'
|
||||
export * from './helpers'
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { StudentAction, StudentActions } from "@/state/actions/student";
|
||||
import { EditionAction, EditionActions } from "@/state/actions/edition";
|
||||
import { SettingActions, SettingsAction } from "@/state/actions/settings";
|
||||
import { InternshipProposalAction, InternshipProposalActions } from "@/state/actions/proposal";
|
||||
import { Dispatch } from "react";
|
||||
|
||||
import { useDispatch as useReduxDispatch } from "react-redux";
|
||||
@ -9,10 +10,11 @@ export * from "./base"
|
||||
export * from "./edition"
|
||||
export * from "./settings"
|
||||
export * from "./student"
|
||||
export * from "./proposal"
|
||||
|
||||
export type Action = StudentAction | EditionAction | SettingsAction;
|
||||
export type Action = StudentAction | EditionAction | SettingsAction | InternshipProposalAction;
|
||||
|
||||
export const Actions = { ...StudentActions, ...EditionActions, ...SettingActions }
|
||||
export const Actions = { ...StudentActions, ...EditionActions, ...SettingActions, ...InternshipProposalActions }
|
||||
export type Actions = typeof Actions;
|
||||
|
||||
export const useDispatch = () => useReduxDispatch<Dispatch<Action>>()
|
||||
|
37
src/state/actions/proposal.ts
Normal file
37
src/state/actions/proposal.ts
Normal file
@ -0,0 +1,37 @@
|
||||
import { Action } from "@/state/actions/base";
|
||||
import { Internship } from "@/data";
|
||||
|
||||
export enum InternshipProposalActions {
|
||||
Send = "SEND_PROPOSAL",
|
||||
Save = "SAVE_PROPOSAL",
|
||||
Approve = "RECEIVE_PROPOSAL_APPROVE",
|
||||
Decline = "RECEIVE_PROPOSAL_DECLINE",
|
||||
Receive = "RECEIVE_PROPOSAL_STATE",
|
||||
}
|
||||
|
||||
export interface SendProposalAction extends Action<InternshipProposalActions.Send> {
|
||||
internship: Internship;
|
||||
}
|
||||
|
||||
export interface ReceiveProposalApproveAction extends Action<InternshipProposalActions.Approve> {
|
||||
|
||||
}
|
||||
|
||||
export interface ReceiveProposalDeclineAction extends Action<InternshipProposalActions.Decline> {
|
||||
|
||||
}
|
||||
|
||||
export interface ReceiveProposalUpdateAction extends Action<InternshipProposalActions.Receive> {
|
||||
|
||||
}
|
||||
|
||||
export interface SaveProposalAction extends Action<InternshipProposalActions.Save> {
|
||||
internship: Internship;
|
||||
}
|
||||
|
||||
export type InternshipProposalAction
|
||||
= SendProposalAction
|
||||
| SaveProposalAction
|
||||
| ReceiveProposalApproveAction
|
||||
| ReceiveProposalDeclineAction
|
||||
| ReceiveProposalUpdateAction;
|
@ -1,13 +1,15 @@
|
||||
import { combineReducers } from "redux";
|
||||
|
||||
import studentReducer from "./student"
|
||||
import studentReducer from "@/state/reducer/student"
|
||||
import editionReducer from "@/state/reducer/edition";
|
||||
import settingsReducer from "@/state/reducer/settings";
|
||||
import internshipProposalReducer from "@/state/reducer/proposal";
|
||||
|
||||
const rootReducer = combineReducers({
|
||||
student: studentReducer,
|
||||
edition: editionReducer,
|
||||
settings: settingsReducer,
|
||||
proposal: internshipProposalReducer,
|
||||
})
|
||||
|
||||
export type AppState = ReturnType<typeof rootReducer>;
|
||||
|
53
src/state/reducer/proposal.ts
Normal file
53
src/state/reducer/proposal.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import { DeanApproval } from "@/data/deanApproval";
|
||||
import { InternshipProposalAction, InternshipProposalActions } from "@/state/actions";
|
||||
import { Internship } from "@/data";
|
||||
|
||||
export type ProposalStatus = "draft" | "awaiting" | "accepted" | "declined";
|
||||
|
||||
export type InternshipProposalState = {
|
||||
accepted: boolean;
|
||||
sent: boolean;
|
||||
declined: boolean;
|
||||
requiredDeanApprovals: DeanApproval[];
|
||||
proposal: Internship | null;
|
||||
comment: string | null;
|
||||
}
|
||||
|
||||
const defaultInternshipProposalState: InternshipProposalState = {
|
||||
accepted: false,
|
||||
declined: false,
|
||||
proposal: null,
|
||||
requiredDeanApprovals: [],
|
||||
sent: false,
|
||||
comment: null
|
||||
}
|
||||
|
||||
const getInternshipProposalStatus = ({ accepted, declined, sent }: InternshipProposalState): ProposalStatus => {
|
||||
switch (true) {
|
||||
case !sent:
|
||||
return "draft";
|
||||
case sent && accepted:
|
||||
return "accepted"
|
||||
case sent && declined:
|
||||
return "declined"
|
||||
case sent && (!accepted && !declined):
|
||||
return "awaiting"
|
||||
default:
|
||||
throw new Error("Invalid proposal state " + JSON.stringify({ accepted, declined, sent }));
|
||||
}
|
||||
}
|
||||
|
||||
const internshipProposalReducer = (state: InternshipProposalState = defaultInternshipProposalState, action: InternshipProposalAction): InternshipProposalState => {
|
||||
switch (action.type) {
|
||||
case InternshipProposalActions.Save:
|
||||
case InternshipProposalActions.Send:
|
||||
return {
|
||||
...state,
|
||||
proposal: action.internship
|
||||
}
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
export default internshipProposalReducer;
|
Loading…
Reference in New Issue
Block a user