Skip to content

Commit 0d35aaf

Browse files
fix: add state data to selectors
1 parent dddec96 commit 0d35aaf

File tree

2 files changed

+109
-5
lines changed

2 files changed

+109
-5
lines changed

src/data/services/lms/hooks/selectors.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
import { useActiveView } from 'hooks';
2+
import {
3+
closedReasons,
4+
stepStates,
5+
stepNames,
6+
} from '../constants';
17
import * as data from './data';
28

39
import * as types from '../types';
@@ -31,6 +37,8 @@ export const useAssessmentStepConfig = (): types.AssessmentStepConfig => (
3137
useORAConfigData().assessmentSteps
3238
);
3339

40+
export const useAssessmentStepOrder = () => useAssessmentStepConfig()?.order;
41+
3442
export const useRubricConfig = (): types.RubricConfig => useORAConfigData().rubric;
3543

3644
export const useEmptyRubric = () => {
@@ -71,21 +79,108 @@ export const usePageData = (): types.PageData => data.usePageData()?.data;
7179

7280
export const useProgressData = (): types.ProgressData => usePageData()?.progress;
7381

82+
export const useActiveStepName = (): string => useProgressData().activeStepName;
83+
7484
export const useSubmissionTeamInfo = (): types.SubmissionTeamData => usePageData()?.submission.teamInfo;
7585

7686
export const useSubmissionStatus = (): types.SubmissionStatusData => {
7787
const {
7888
hasCancelled,
7989
hasReceivedGrade,
8090
hasSubmitted,
91+
isClosed,
92+
closedReason,
8193
} = usePageData().submission;
8294
return {
8395
hasCancelled,
8496
hasReceivedGrade,
8597
hasSubmitted,
98+
isClosed,
99+
closedReason,
86100
};
87101
};
88102

103+
export const useHasCancelled = () => useSubmissionStatus().hasCancelled;
104+
export const useHasReceivedFinalGrade = () => useProgressData().hasReceivedFinalGrade;
105+
106+
export const useSubmissionData = () => usePageData().submission;
107+
89108
export const useSubmissionResponse = (): types.SubmissionResponseData => (
90109
usePageData().submission.response
91110
);
111+
112+
export const useStepIndex = ({ step }) => useAssessmentStepOrder().indexOf(step);
113+
114+
export const useSubmissionState = () => {
115+
const subStatus = useSubmissionStatus();
116+
const teamInfo = useSubmissionTeamInfo();
117+
118+
if (subStatus.hasCancelled) {
119+
return stepStates.cancelled;
120+
}
121+
122+
if (subStatus.hasSubmitted) {
123+
return stepStates.completed;
124+
}
125+
if (subStatus.isClosed) {
126+
if (subStatus.closedReason === closedReasons.pastDue) {
127+
return stepStates.closed;
128+
}
129+
return stepStates.notAvailable;
130+
}
131+
if (!subStatus.hasSubmitted && teamInfo.hasSubmitted) {
132+
return stepStates.teamAlreadySubmitted;
133+
}
134+
return stepStates.inProgress;
135+
};
136+
137+
export const useStepInfo = () => useProgressData().stepInfo;
138+
139+
export const useStepState = ({ step }) => {
140+
const hasCancelled = useHasCancelled();
141+
const hasReceivedFinalGrade = useHasReceivedFinalGrade();
142+
const stepInfo = useStepInfo();
143+
const activeStepIndex = useStepIndex({ step: useActiveStepName() });
144+
const stepIndex = useStepIndex({ step });
145+
const subState = useSubmissionState();
146+
147+
if (step === stepNames.submission) {
148+
return subState;
149+
}
150+
151+
// Cancelled submission affects all states
152+
if (hasCancelled) { return stepStates.cancelled; }
153+
154+
if (step === stepNames.myGrades) {
155+
return hasReceivedFinalGrade ? stepStates.completed : stepStates.notAvailable;
156+
}
157+
158+
// For Assessment steps
159+
if (stepIndex < activeStepIndex) { return stepStates.completed; }
160+
if (stepIndex > activeStepIndex) { return stepStates.notAvailable; }
161+
162+
// only check for closed or not-available on active step
163+
if (stepInfo[step]?.isClosed) {
164+
return stepInfo[step].closedReason === closedReasons.pastDue
165+
? stepStates.closed
166+
: stepStates.notAvailable;
167+
}
168+
return stepStates.inProgress;
169+
};
170+
171+
export const useXBlockState = () => {
172+
const activeStepState = useStepState({ step: useActiveStepName() });
173+
if ([
174+
stepStates.cancelled,
175+
stepStates.closed,
176+
stepStates.notAvailable,
177+
].includes(activeStepState)) {
178+
return activeStepState;
179+
}
180+
return stepStates.inProgress;
181+
};
182+
183+
export const useEffectiveGrade = () => {
184+
const { assessments } = usePageData();
185+
return assessments ? assessments[assessments.effectiveAssessmentType] : null;
186+
};

src/data/services/lms/types/pageData.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,37 @@ export interface RubricSelection {
1414
selection: string,
1515
}
1616

17-
export interface LearnerTrainingStepInfo {
17+
export interface StepClosedInfo {
18+
isClosed: boolean,
19+
closedReason?: 'notAvailable' | 'pastDue',
20+
}
21+
22+
export interface LearnerTrainingStepInfo extends StepClosedInfo {
1823
numberOfAssessmentsCompleted: number,
1924
expectedRubricSelctions: RubricSelection[],
2025
}
2126

22-
export interface PeerStepInfo {
27+
export interface PeerStepInfo extends StepClosedInfo {
2328
numberOfAssessmetsCompleted: number,
2429
isWaitingForSubmissions: boolean,
2530
numberOfReceivedAssessments: number,
2631
}
2732

28-
export interface ActiveStepInfo extends LearnerTrainingStepInfo, PeerStepInfo {}
33+
export interface StepInfo {
34+
peer: PeerStepInfo | null,
35+
learnerTraining: LearnerTrainingStepInfo | null,
36+
self: StepClosedInfo | null,
37+
}
2938

3039
export interface ProgressData {
3140
activeStepName: 'training' | 'peer' | 'self' | 'staff',
3241
hasReceivedFinalGrade: boolean,
3342
receivedGrades: ReceivedGradesData,
34-
activeStepInfo: ActiveStepInfo,
43+
stepInfo: StepInfo,
3544
}
3645

3746
// Submission Data
38-
export interface SubmissionStatusData {
47+
export interface SubmissionStatusData extends StepClosedInfo {
3948
hasSubmitted: boolean,
4049
hasCancelled: boolean,
4150
hasReceivedGrade: boolean,

0 commit comments

Comments
 (0)