From b46cc61094ba8227cef3f807bd30e5021659098e Mon Sep 17 00:00:00 2001 From: E-Liang Tan Date: Wed, 3 Mar 2021 22:23:39 +0800 Subject: [PATCH] MPE: Add FAQ and fix crashing module details fetch (#3261) * Add RO's FAQ link * Delete crashing module details fetch * Fuse mpeModules mods into submission so that mpe submisisons have module credits --- website/src/apis/mpe.ts | 29 +++---------------- website/src/views/mpe/MpeContainer.tsx | 8 +++++ .../src/views/mpe/form/MpeFormContainer.tsx | 22 ++++++++++++-- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/website/src/apis/mpe.ts b/website/src/apis/mpe.ts index 34218db576..f0549a8a0c 100644 --- a/website/src/apis/mpe.ts +++ b/website/src/apis/mpe.ts @@ -4,8 +4,7 @@ import getLocalStorage from 'storage/localStorage'; import { Location, History } from 'history'; import { produce } from 'immer'; import NUSModsApi from './nusmods'; -import { MpeSubmission, MpePreference, MpeModule } from '../types/mpe'; -import type { Module, ModuleCode } from '../types/modules'; +import { MpeSubmission, MpeModule } from '../types/mpe'; import { NUS_AUTH_TOKEN } from '../storage/keys'; export class MpeSessionExpiredError extends Error {} @@ -60,9 +59,6 @@ export const fetchMpeModuleList = (): Promise => // TODO: Check with NUS if we should use MPE_AY here instead axios.get(NUSModsApi.mpeModuleListUrl()).then((resp) => resp.data); -export const fetchModuleDetails = (moduleCode: ModuleCode): Promise => - axios.get(NUSModsApi.moduleDetailsUrl(moduleCode)).then((resp) => resp.data); - export const getSSOLink = (): Promise => mpe .get(SSO_PATH, { @@ -70,26 +66,9 @@ export const getSSOLink = (): Promise => }) .then((resp) => resp.data); -export const getMpeSubmission = (): Promise => { - let submission: MpeSubmission; - return mpe - .get(MPE_PATH) - .then((resp) => { - submission = resp.data; - return Promise.all( - submission.preferences.map((p) => fetchModuleDetails(p.moduleCode)), - ); - }) - .then((modules) => ({ - ...submission, - preferences: modules.map((m, index) => ({ - moduleTitle: m.title, - moduleCode: m.moduleCode, - moduleType: submission.preferences[index].moduleType, - moduleCredits: parseInt(m.moduleCredit, 10), - })), - })); -}; +// TODO: Replace data fetched from MPE server with latest data from MPE module list +export const getMpeSubmission = (): Promise => + mpe.get(MPE_PATH).then((resp) => resp.data); export const updateMpeSubmission = (submission: MpeSubmission): Promise => { if (submission.intendedMCs < 0) { diff --git a/website/src/views/mpe/MpeContainer.tsx b/website/src/views/mpe/MpeContainer.tsx index 3f616f4bb0..e09b7934c0 100644 --- a/website/src/views/mpe/MpeContainer.tsx +++ b/website/src/views/mpe/MpeContainer.tsx @@ -4,6 +4,7 @@ import classnames from 'classnames'; import { enableMpe } from 'featureFlags'; import Modal from 'views/components/Modal'; import type { MpeSubmission } from 'types/mpe'; +import ExternalLink from 'views/components/ExternalLink'; import { getLoginState, getSSOLink, @@ -85,6 +86,13 @@ const MpeContainer: React.FC = () => { the ModReg Exercise, in cases where the demand exceeds the available quota and students have the same Priority Score for a particular module.

+

+ For further questions, please refer to this{' '} + + FAQ + {' '} + provided by NUS Registrar's Office. +

{isLoggedIn ? ( diff --git a/website/src/views/mpe/form/MpeFormContainer.tsx b/website/src/views/mpe/form/MpeFormContainer.tsx index 6680c4ed53..1339412c56 100644 --- a/website/src/views/mpe/form/MpeFormContainer.tsx +++ b/website/src/views/mpe/form/MpeFormContainer.tsx @@ -23,9 +23,25 @@ const MpeFormContainer: React.FC = ({ getSubmission, updateSubmission }) setIsInitialLoad(true); Promise.all([fetchMpeModuleList(), getSubmission()]) - .then((data) => { - setMpeModuleList(data[0]); - setSubmission(data[1]); + .then(([fetchedMpeModuleList, fetchedSubmission]) => { + setMpeModuleList(fetchedMpeModuleList); + setSubmission({ + ...fetchedSubmission, + // Replace data fetched from MPE server with latest data from MPE module list + // TODO: Optimize. This does an linear time lookup for each preference + preferences: fetchedSubmission.preferences.map((preference) => { + const mpeModule = fetchedMpeModuleList.find( + (m) => m.moduleCode === preference.moduleCode, + ); + if (!mpeModule) return preference; + return { + ...preference, + moduleTitle: mpeModule.title, + moduleCode: mpeModule.moduleCode, + moduleCredits: parseInt(mpeModule.moduleCredit, 10), + }; + }), + }); }) .catch((err) => { // this is a temporary fix