Skip to content

Commit 0be6de5

Browse files
feat: add initial react-query loaders and selectors
1 parent a581070 commit 0be6de5

File tree

12 files changed

+231
-122
lines changed

12 files changed

+231
-122
lines changed

src/data/services/lms/api.js

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/data/services/lms/constants.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { StrictDict } from '@edx/react-unit-test-utils';
2+
3+
export const queryKeys = StrictDict({
4+
oraConfig: 'oraConfig',
5+
submissionData: 'submissionData',
6+
});
7+
8+
export default { queryKeys };

src/data/services/lms/dataLoaders.js

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// ORA Config loaders
2+
export const loadAssessmentConfig = ({
3+
assessmentSteps: {
4+
order,
5+
settings: {
6+
peer,
7+
self,
8+
training,
9+
staff,
10+
},
11+
},
12+
}) => ({
13+
order,
14+
peer: peer && {
15+
startTime: peer.startTime,
16+
endTime: peer.endTime,
17+
required: peer.required,
18+
data: {
19+
minNumberToGrade: peer.data.minNumberToGrade,
20+
minNumberToBeGradedBy: peer.data.minNumberToBeGradedBy,
21+
enableFlexibleGrading: peer.data.enableFlexibleGrading,
22+
},
23+
},
24+
self: self && {
25+
startTime: self.startTime,
26+
endTime: self.endTime,
27+
required: self.required,
28+
},
29+
training: training && {
30+
required: training.required,
31+
data: { examples: training.data.examples },
32+
},
33+
staff: staff && { required: staff.required },
34+
});
35+
36+
export const loadSubmissionConfig = ({
37+
submissionConfig: {
38+
textResponseConfig: text,
39+
fileResponseConfig: file,
40+
teamsConfig,
41+
...config
42+
},
43+
}) => ({
44+
startDatetime: config.startDatetime,
45+
endDatetime: config.endDatetime,
46+
textResponseConfig: text && {
47+
enabled: text.enabled,
48+
optional: text.optional,
49+
editorType: text.editorType,
50+
allowLatexPreview: text.allowLatexPreview,
51+
},
52+
fileResponseConfig: file && {
53+
enabled: file.enabled,
54+
optional: file.optional,
55+
fileUploadType: file.fileUploadType,
56+
allowedExtensions: file.allowedExtensions,
57+
blockedExtensions: file.blockedExtensions,
58+
fileTypeDescription: file.fileTypeDescription,
59+
},
60+
teamsConfig: teamsConfig && {
61+
enabled: teamsConfig.enabled,
62+
teamsetName: teamsConfig.teamsetName,
63+
},
64+
});
65+
66+
export const loadRubricConfig = ({ rubric }) => ({
67+
showDuringResponse: rubric.showDuringResponse,
68+
feedbackConfig: {
69+
description: rubric.feedbackConfig.description,
70+
defaultText: rubric.feedbackConfig.defaultText,
71+
},
72+
criteria: rubric.criteria.map(criterion => ({
73+
name: criterion.name,
74+
description: criterion.description,
75+
feedbackEnabled: criterion.feedbackEnabled,
76+
feedbackRequired: criterion.feedbackRequired,
77+
options: criterion.options.map(option => ({
78+
name: option.name,
79+
points: option.points,
80+
description: option.description,
81+
})),
82+
})),
83+
});
84+
85+
export const loadORAConfigData = (data) => {
86+
console.log({ oraConfig: data });
87+
return {
88+
title: data.title,
89+
prompts: data.prompts,
90+
baseAssetUrl: data.baseAssetUrl,
91+
submissionConfig: loadSubmissionConfig(data),
92+
assessmentSteps: loadAssessmentConfig(data),
93+
rubric: loadRubricConfig(data),
94+
leaderboardConfig: {
95+
enabled: data.leaderboardConfig.enabled,
96+
numberOfEntries: data.leaderboardConfig.numberOfEntries,
97+
},
98+
};
99+
};
100+
101+
// Submission loaders
102+
export const loadFile = (file) => ({
103+
url: file.fileUrl,
104+
description: file.fileDescription,
105+
name: file.fileName,
106+
size: file.fileSize,
107+
uploadedBy: file.uploadedBy,
108+
});
109+
110+
export const loadSubmissionData = ({ teamInfo, submissionStatus, submission }) => ({
111+
teamInfo: {
112+
teamName: teamInfo.teamName,
113+
teamUsernames: teamInfo.teamUsernames,
114+
previousTeamName: teamInfo.previousTeamName,
115+
hasSubmitted: teamInfo.hasSubmitted,
116+
uploadedFiles: teamInfo.teamUploadedFiles.map(loadFile),
117+
},
118+
submissionStatus: {
119+
hasSubmitted: submissionStatus.hasSubmitted,
120+
hasCancelled: submissionStatus.hasCancelled,
121+
hasReceivedGrade: submissionStatus.hasReceivedGrade,
122+
},
123+
submission: {
124+
textResponses: submission.textResponses,
125+
uploadedFiles: submission.uploadedFiles.map(loadFile),
126+
},
127+
});
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import assessment from './assessment';
1+
import oraConfig from './oraConfig';
22
import submission from './submission';
33

44
export default {
5-
assessment,
5+
oraConfig,
66
submission,
77
};

src/data/services/lms/fakeData/assessment.js renamed to src/data/services/lms/fakeData/oraConfig.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable camelcase */
2+
23
const submissionConfig = {
34
start_datetime: '2023-04-14T20:00:00Z',
45
end_datetime: '2023-04-14T20:00:00Z',
@@ -92,7 +93,7 @@ const assessmentSteps = {
9293
},
9394
};
9495

95-
export const createAssessment = ({
96+
export const createORAConfig = ({
9697
title = 'Assessment title',
9798
prompts = ['<h1>ORA Prompt</h1>', '<p>ORA Prompt</p>'],
9899
base_asset_url = '/assets',
@@ -111,8 +112,8 @@ export const createAssessment = ({
111112
});
112113

113114
export default {
114-
assessmentText: createAssessment(),
115-
assessmentTinyMCE: createAssessment({
115+
assessmentText: createORAConfig(),
116+
assessmentTinyMCE: createORAConfig({
116117
submission_config: {
117118
...submissionConfig,
118119
text_response_config: {

src/data/services/lms/fakeData/submission.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const createSubmission = ({
4343
team_info = createTeamInfo(),
4444
submission_status = createSubmissionStatus(),
4545
submission = createSubmissionResponse(),
46-
}) => ({
46+
} = {}) => ({
4747
team_info,
4848
submission_status,
4949
submission,

src/data/services/lms/hooks/api.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { useQuery } from 'react-query';
2+
3+
import { camelCaseObject } from '@edx/frontend-platform';
4+
5+
import { queryKeys } from '../constants';
6+
import { loadORAConfigData, loadSubmissionData } from '../dataLoaders';
7+
import fakeData from '../fakeData';
8+
9+
/**
10+
* A react-query data object
11+
* @typedef {Object} ReactQueryData
12+
* @property {boolean} isLoading
13+
* @property {boolean} isFetching
14+
* @property {boolean} isInitialLoading
15+
* @property {Object} error
16+
* @property {Object} data
17+
*/
18+
19+
/**
20+
* @return {ReactQueryData} ORA config data
21+
*/
22+
export const useORAConfig = () => {
23+
const { data, ...status } = useQuery({
24+
queryKey: [queryKeys.oraConfig],
25+
// queryFn: () => getAuthenticatedClient().get(...),
26+
queryFn: () => Promise.resolve(fakeData.oraConfig.assessmentText),
27+
});
28+
return {
29+
...status,
30+
...(data && { data: loadORAConfigData(camelCaseObject(data)) }),
31+
};
32+
};
33+
34+
/**
35+
* @return {ReactQueryData} Learner Submission data
36+
*/
37+
export const useSubmissionData = () => {
38+
const { data, ...status } = useQuery({
39+
queryKey: [queryKeys.submissionData],
40+
// queryFn: () => getAuthenticatedClient().get(...),
41+
queryFn: () => Promise.resolve(fakeData.submission.teamAssessment),
42+
});
43+
return {
44+
...status,
45+
...(data && { data: loadSubmissionData(camelCaseObject(data)) }),
46+
};
47+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import * as api from './api';
2+
3+
export const useORAConfigDataStatus = () => {
4+
const queryStatus = api.useORAConfig();
5+
return {
6+
isLoading: queryStatus.isLoading,
7+
isFetching: queryStatus.isFetching,
8+
isInitialLoading: queryStatus.isInitialLoading,
9+
error: queryStatus.error,
10+
};
11+
};
12+
export const useORAConfigData = () => api.useORAConfig().data;
13+
14+
export const useSubmissionConfig = () => useORAConfigData().submissionConfig;
15+
16+
export const useAssessmentStepConfig = () => useORAConfigData().assessmentSteps;
17+
18+
export const useRubricConfig = () => useORAConfigData().rubric;
19+
20+
export const useLeaderboardConfig = () => useORAConfigData().leaderboardConfig;
21+
22+
export const useSubmissionDataStatus = () => {
23+
const queryStatus = api.useSubmissionData();
24+
return {
25+
isLoading: queryStatus.isLoading,
26+
isFetching: queryStatus.isFetching,
27+
isInitialLoading: queryStatus.isInitialLoading,
28+
error: queryStatus.error,
29+
};
30+
};
31+
export const useSubmissionData = () => api.useSubmissionData().data;
32+
33+
export const useSubmissionTeamInfo = () => useSubmissionData().teamInfo;
34+
35+
export const useSubmissionStatus = () => useSubmissionData().submissionStatus;
36+
37+
export const useSubmissionResponse = () => useSubmissionData().submission;

src/data/services/lms/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { StrictDict } from 'utils';
2-
import api from './api';
1+
import { StrictDict } from '@edx/react-unit-test-utils';
32
import urls from './urls';
3+
import api from './hooks/api';
4+
import selectors from './hooks/selectors';
45

56
export default StrictDict({
67
api,
8+
selectors,
79
urls,
810
});

src/data/services/lms/urls.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { StrictDict } from 'utils';
1+
import { StrictDict } from '@edx/react-unit-test-utils';
22
import { getConfig } from '@edx/frontend-platform';
33

44
const baseUrl = () => getConfig().LMS_BASE_URL;

0 commit comments

Comments
 (0)