From 263be22901cd81d3591d909a1d5e2c19c6ce6a3c Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Wed, 7 Oct 2020 22:25:55 +0200 Subject: [PATCH] Add obtaining info about current internship status --- src/api/dto/internship-registration.ts | 53 ++++++++++++++++++++++++-- src/api/dto/mentor.ts | 28 ++++++++++++++ src/api/internship.ts | 10 ++++- src/pages/main.tsx | 18 ++++++++- src/state/actions/proposal.ts | 3 ++ src/state/reducer/proposal.ts | 12 ++++++ 6 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 src/api/dto/mentor.ts diff --git a/src/api/dto/internship-registration.ts b/src/api/dto/internship-registration.ts index b7a94a7..09659c6 100644 --- a/src/api/dto/internship-registration.ts +++ b/src/api/dto/internship-registration.ts @@ -1,6 +1,18 @@ -import { Identifiable, Internship, Mentor } from "@/data"; -import { OneWayTransformer } from "@/serialization"; +import { Company, Identifiable, Internship, Mentor, Office } from "@/data"; +import { momentSerializationTransformer, OneWayTransformer } from "@/serialization"; import { Nullable } from "@/helpers"; +import { MentorDTO, mentorDtoTransformer } from "@/api/dto/mentor"; +import { InternshipTypeDTO, internshipTypeDtoTransformer } from "@/api/dto/type"; +import { Moment } from "moment"; +import { sampleStudent } from "@/provider/dummy"; + +export enum SubmissionState { + Draft, + Submitted, + Accepted, + Rejected, + Archival, +} export interface InternshipRegistrationUpdateCompany { id: string, @@ -12,7 +24,21 @@ export interface InternshipRegistrationUpdate { start: string, end: string, type: number, - mentor: Mentor, + mentor: MentorDTO, +} + +export interface InternshipRegistrationDTO extends Identifiable { + start: string; + end: string; + type: InternshipTypeDTO, + state: SubmissionState, + mentor: MentorDTO, + company: Company, + branchAddress: Office, +} + +export interface InternshipInfoDTO { + internshipRegistration: InternshipRegistrationDTO; } export const internshipRegistrationUpdateTransformer: OneWayTransformer, Nullable> = { @@ -21,7 +47,7 @@ export const internshipRegistrationUpdateTransformer: OneWayTransformer = { + transform(dto: InternshipRegistrationDTO, context?: unknown): Internship { + return { + id: dto.id, + office: dto.branchAddress, + company: dto.company, + mentor: mentorDtoTransformer.transform(dto.mentor), + startDate: momentSerializationTransformer.reverseTransform(dto.start) as Moment, + endDate: momentSerializationTransformer.reverseTransform(dto.end) as Moment, + type: internshipTypeDtoTransformer.transform(dto.type), + hours: 0, + isAccepted: dto.state === SubmissionState.Accepted, + lengthInWeeks: 0, + program: [], + intern: sampleStudent, // fixme + }; + } +} diff --git a/src/api/dto/mentor.ts b/src/api/dto/mentor.ts new file mode 100644 index 0000000..2d5f03a --- /dev/null +++ b/src/api/dto/mentor.ts @@ -0,0 +1,28 @@ +import { Transformer } from "@/serialization"; +import { Mentor } from "@/data"; + +export interface MentorDTO { + firstName: string; + lastName: string; + email: string; + phoneNumber: string; +} + +export const mentorDtoTransformer: Transformer = { + reverseTransform(subject: Mentor, context?: unknown): MentorDTO { + return { + firstName: subject.name, + lastName: subject.surname, + email: subject.email, + phoneNumber: subject.phone || "", + } + }, + transform(subject: MentorDTO, context?: unknown): Mentor { + return { + name: subject.firstName, + surname: subject.lastName, + email: subject.email, + phone: subject.phoneNumber, + } + } +} diff --git a/src/api/internship.ts b/src/api/internship.ts index 3096b15..cc4dda0 100644 --- a/src/api/internship.ts +++ b/src/api/internship.ts @@ -1,4 +1,4 @@ -import { InternshipRegistrationUpdate } from "@/api/dto/internship-registration"; +import { InternshipInfoDTO, InternshipRegistrationUpdate } from "@/api/dto/internship-registration"; import { axios } from "@/api/index"; import { Nullable } from "@/helpers"; @@ -9,3 +9,11 @@ export async function update(internship: Nullable) return true; } + +export async function get(): Promise { + const response = await axios.get(INTERNSHIP_ENDPOINT); + + console.log(response); + + return response.data; +} diff --git a/src/pages/main.tsx b/src/pages/main.tsx index e6d9cf2..e204644 100644 --- a/src/pages/main.tsx +++ b/src/pages/main.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect } from "react"; import { Page } from "@/pages/base"; import { Container, Stepper, Typography } from "@material-ui/core"; import { Redirect } from "react-router-dom"; @@ -14,6 +14,9 @@ import { InsuranceState } from "@/state/reducer/insurance"; import { InsuranceStep } from "@/pages/steps/insurance"; import { StudentStep } from "@/pages/steps/student"; import { useDeadlines } from "@/hooks"; +import api from "@/api"; +import { InternshipProposalActions, useDispatch } from "@/state/actions"; +import { internshipRegistrationDtoTransformer } from "@/api/dto/internship-registration"; export const MainPage = () => { const { t } = useTranslation(); @@ -22,6 +25,19 @@ export const MainPage = () => { const deadlines = useDeadlines(); const insurance = useSelector(root => root.insurance); + const dispatch = useDispatch(); + + useEffect(() => { + (async () => { + const internship = await api.internship.get(); + + dispatch({ + type: InternshipProposalActions.Receive, + state: internship.internshipRegistration.state, + internship: internshipRegistrationDtoTransformer.transform(internship.internshipRegistration), + }) + })() + }, []) if (!student) { return ; diff --git a/src/state/actions/proposal.ts b/src/state/actions/proposal.ts index ad8102a..2db7692 100644 --- a/src/state/actions/proposal.ts +++ b/src/state/actions/proposal.ts @@ -6,6 +6,7 @@ import { SaveSubmissionAction, SendSubmissionAction } from "@/state/actions/submission"; +import { SubmissionState } from "@/api/dto/internship-registration"; export enum InternshipProposalActions { Send = "SEND_PROPOSAL", @@ -26,6 +27,8 @@ export interface ReceiveProposalDeclineAction extends ReceiveSubmissionDeclineAc } export interface ReceiveProposalUpdateAction extends ReceiveSubmissionUpdateAction { + internship: Internship; + state: SubmissionState, } export interface SaveProposalAction extends SaveSubmissionAction { diff --git a/src/state/reducer/proposal.ts b/src/state/reducer/proposal.ts index 783983c..d20eeb4 100644 --- a/src/state/reducer/proposal.ts +++ b/src/state/reducer/proposal.ts @@ -11,6 +11,7 @@ import { } 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 | null; @@ -43,6 +44,17 @@ const internshipProposalReducer = (state: InternshipProposalState = defaultInter ...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; }