Add proposal reducer
This commit is contained in:
		
							parent
							
								
									b5717000c4
								
							
						
					
					
						commit
						a0b555d0e5
					
				
							
								
								
									
										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 './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 { StudentAction, StudentActions } from "@/state/actions/student"; | ||||||
| import { EditionAction, EditionActions } from "@/state/actions/edition"; | import { EditionAction, EditionActions } from "@/state/actions/edition"; | ||||||
| import { SettingActions, SettingsAction } from "@/state/actions/settings"; | import { SettingActions, SettingsAction } from "@/state/actions/settings"; | ||||||
|  | import { InternshipProposalAction, InternshipProposalActions } from "@/state/actions/proposal"; | ||||||
| import { Dispatch } from "react"; | import { Dispatch } from "react"; | ||||||
| 
 | 
 | ||||||
| import { useDispatch as useReduxDispatch } from "react-redux"; | import { useDispatch as useReduxDispatch } from "react-redux"; | ||||||
| @ -9,10 +10,11 @@ export * from "./base" | |||||||
| export * from "./edition" | export * from "./edition" | ||||||
| export * from "./settings" | export * from "./settings" | ||||||
| export * from "./student" | 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 type Actions = typeof Actions; | ||||||
| 
 | 
 | ||||||
| export const useDispatch = () => useReduxDispatch<Dispatch<Action>>() | 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 { combineReducers } from "redux"; | ||||||
| 
 | 
 | ||||||
| import studentReducer from "./student" | import studentReducer from "@/state/reducer/student" | ||||||
| import editionReducer from "@/state/reducer/edition"; | import editionReducer from "@/state/reducer/edition"; | ||||||
| import settingsReducer from "@/state/reducer/settings"; | import settingsReducer from "@/state/reducer/settings"; | ||||||
|  | import internshipProposalReducer from "@/state/reducer/proposal"; | ||||||
| 
 | 
 | ||||||
| const rootReducer = combineReducers({ | const rootReducer = combineReducers({ | ||||||
|     student: studentReducer, |     student: studentReducer, | ||||||
|     edition: editionReducer, |     edition: editionReducer, | ||||||
|     settings: settingsReducer, |     settings: settingsReducer, | ||||||
|  |     proposal: internshipProposalReducer, | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| export type AppState = ReturnType<typeof rootReducer>; | 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