Skip to content

Commit 61d70a1

Browse files
feat: add typescript support to api and selectors
1 parent 342b173 commit 61d70a1

File tree

13 files changed

+2737
-767
lines changed

13 files changed

+2737
-767
lines changed

.eslintignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
coverage/*
22
dist/
33
node_modules/
4-
jest.config.js
4+
jest.config.js
5+
webpack.*.js
6+
.eslintrc.js

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
with:
2323
node-version: ${{ env.NODE_VER }}
2424
- name: Install dependencies
25-
run: npm ci
25+
run: npm ci --legacy-peer-deps
2626
- name: Lint
2727
run: npm run lint
2828
- name: Test

.github/workflows/commitlint.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,14 @@ on:
77

88
jobs:
99
commitlint:
10-
uses: openedx/.github/.github/workflows/commitlint.yml@master
10+
runs-on: ubuntu-20.04
11+
steps:
12+
- name: Check out repository
13+
uses: actions/checkout@v3
14+
with:
15+
fetch-depth: 0
16+
- name: remove tsconfig.json # see issue https://github.com/conventional-changelog/commitlint/issues/3256
17+
run: |
18+
rm tsconfig.json
19+
- name: Check commits
20+
uses: wagoid/commitlint-github-action@v5

package-lock.json

Lines changed: 2431 additions & 696 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"@edx/paragon": "^20.20.0",
4141
"@edx/react-unit-test-utils": "1.5.3",
4242
"@edx/tinymce-language-selector": "1.1.0",
43+
"@edx/typescript-config": "^1.0.1",
4344
"@fortawesome/fontawesome-svg-core": "1.2.36",
4445
"@fortawesome/free-brands-svg-icons": "5.15.4",
4546
"@fortawesome/free-regular-svg-icons": "5.15.4",
@@ -65,10 +66,11 @@
6566
},
6667
"devDependencies": {
6768
"@edx/browserslist-config": "^1.1.1",
68-
"@edx/frontend-build": "12.9.4",
69+
"@edx/frontend-build": "12.9.0-alpha.6",
6970
"@edx/reactifex": "^2.1.1",
7071
"glob": "7.2.3",
7172
"husky": "7.0.4",
72-
"jest": "29.6.2"
73+
"jest": "29.6.2",
74+
"ts-jest": "^26.5.6"
7375
}
7476
}

src/data/services/lms/hooks/api.js renamed to src/data/services/lms/hooks/api.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import { useRouteMatch } from 'react-router-dom';
44
import { camelCaseObject } from '@edx/frontend-platform';
55

66
import routes from 'routes';
7+
import * as types from '../types';
78
import { queryKeys } from '../constants';
89
import fakeData from '../fakeData';
910

10-
export const useORAConfig = () => {
11+
export const useORAConfig = (): types.QueryData<types.ORAConfig> => {
1112
const { data, ...status } = useQuery({
1213
queryKey: [queryKeys.oraConfig],
1314
// queryFn: () => getAuthenticatedClient().get(...),
@@ -19,13 +20,12 @@ export const useORAConfig = () => {
1920
};
2021
};
2122

22-
export const usePageData = () => {
23+
export const usePageData = (): types.QueryData<types.PageData> => {
2324
const route = useRouteMatch();
2425
const isAssessment = route.path === routes.assessment;
2526
const returnData = isAssessment
2627
? fakeData.pageData.shapes.peerAssessment
2728
: fakeData.pageData.shapes.emptySubmission;
28-
console.log({ returnData, isAssessment, route });
2929
const { data, ...status } = useQuery({
3030
queryKey: [queryKeys.submissionData, isAssessment],
3131
// queryFn: () => getAuthenticatedClient().get(...),
@@ -36,15 +36,3 @@ export const usePageData = () => {
3636
data: data ? camelCaseObject(data) : {},
3737
};
3838
};
39-
40-
export const useAssessmentData = () => {
41-
const { data, ...status } = useQuery({
42-
queryKey: [queryKeys.submissionData],
43-
// queryFn: () => getAuthenticatedClient().get(...),
44-
queryFn: () => Promise.resolve(fakeData.submission.teamAssessment),
45-
});
46-
return {
47-
...status,
48-
data: data ? camelCaseObject(data) : {},
49-
};
50-
};

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

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import * as api from './api';
2+
3+
import * as types from '../types';
4+
5+
export const useORAConfigDataStatus = (): types.QueryStatus => {
6+
const queryStatus = api.useORAConfig();
7+
return {
8+
isLoading: queryStatus.isLoading,
9+
isFetching: queryStatus.isFetching,
10+
isInitialLoading: queryStatus.isInitialLoading,
11+
status: queryStatus.status,
12+
error: queryStatus.error,
13+
};
14+
};
15+
16+
export const useIsORAConfigLoaded = (): boolean => (
17+
api.useORAConfig().status === 'success'
18+
);
19+
20+
export const useORAConfigData = (): types.ORAConfig => (
21+
api.useORAConfig().data
22+
);
23+
24+
export const useSubmissionConfig = (): types.SubmissionConfig => (
25+
useORAConfigData().submissionConfig
26+
);
27+
28+
export const useAssessmentStepConfig = (): types.AssessmentStepConfig => (
29+
useORAConfigData().assessmentSteps
30+
);
31+
32+
export const useRubricConfig = (): types.RubricConfig => useORAConfigData().rubric;
33+
34+
export const useLeaderboardConfig = (): types.LeaderboardConfig => useORAConfigData().leaderboardConfig;
35+
36+
export const usePageDataStatus = () => {
37+
const queryStatus = api.usePageData();
38+
return {
39+
isLoading: queryStatus.isLoading,
40+
isFetching: queryStatus.isFetching,
41+
isInitialLoading: queryStatus.isInitialLoading,
42+
status: queryStatus.status,
43+
error: queryStatus.error,
44+
};
45+
};
46+
export const useIsPageDataLoaded = (): boolean => (
47+
api.usePageData().status === 'success'
48+
);
49+
50+
export const usePageData = (): types.PageData => api.usePageData().data;
51+
52+
export const useSubmissionTeamInfo = (): types.SubmissionTeamData => usePageData().submission.teamInfo;
53+
54+
export const useSubmissionStatus = (): types.SubmissionStatusData => {
55+
const {
56+
hasCancelled,
57+
hasReceivedGrade,
58+
hasSubmitted,
59+
} = usePageData().submission;
60+
return {
61+
hasCancelled,
62+
hasReceivedGrade,
63+
hasSubmitted,
64+
};
65+
};
66+
67+
export const useSubmissionResponse = (): types.SubmissionResponseData => (
68+
usePageData().submission.response
69+
);
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Block Info fields
2+
export interface CriterionConfig {
3+
name: string,
4+
description: string,
5+
feedbackEnabled: boolean,
6+
feedbackRequired: boolean,
7+
options: {
8+
name: string,
9+
points: number,
10+
description: string,
11+
}[],
12+
}
13+
14+
export interface TextResponseConfig {
15+
enabled: boolean,
16+
optional: boolean,
17+
editorType: 'text' | 'tinymce',
18+
allowLatexPreviews: boolean,
19+
}
20+
21+
export interface FileResponseConfig {
22+
enabled: boolean,
23+
optional: boolean,
24+
fileUploadLimit: number,
25+
allowedExtensions: string[],
26+
blockedExtensions: string[],
27+
fileTypeDescription: string,
28+
}
29+
30+
export interface SubmissionConfig {
31+
startDatetime: number,
32+
endDatetime: number,
33+
textResponseConfig: TextResponseConfig,
34+
fileResponseConfig: FileResponseConfig,
35+
teamsConfig: {
36+
enabled: boolean,
37+
teamsetName: string,
38+
},
39+
}
40+
41+
export interface PeerStepSettings {
42+
startTime: number,
43+
endTime: number,
44+
required: boolean,
45+
data: {
46+
minNumberToGrade: number,
47+
minNumberToBeGradedBy: number,
48+
enableFlexibleGrading: boolean,
49+
},
50+
}
51+
52+
export interface StaffStepSettings {
53+
required: boolean,
54+
}
55+
56+
export interface SelfStepSettings {
57+
startTime: number,
58+
endTime: number,
59+
required: boolean,
60+
}
61+
62+
export interface TrainingStepSettings {
63+
required: boolean,
64+
data: {
65+
examples: {
66+
response: string,
67+
criteria: { name: string, selection: string }[],
68+
}[],
69+
},
70+
}
71+
72+
export interface AssessmentStepConfig {
73+
order: string[],
74+
settings: {
75+
peer: PeerStepSettings,
76+
staff: StaffStepSettings,
77+
self: SelfStepSettings,
78+
training: TrainingStepSettings
79+
},
80+
}
81+
82+
export interface RubricConfig {
83+
showDuringResponse: boolean,
84+
feedbackConfig: {
85+
description: string,
86+
defaultText: string,
87+
},
88+
criteria: CriterionConfig[],
89+
}
90+
91+
export interface LeaderboardConfig {
92+
enabled: boolean,
93+
numberOfEntries: number,
94+
}
95+
96+
export interface ORAConfig {
97+
title: string,
98+
prompts: string[],
99+
baseAssetUrl: string,
100+
submissionConfig: SubmissionConfig,
101+
assessmentSteps: AssessmentStepConfig,
102+
rubric: RubricConfig,
103+
leaderboardConfig: LeaderboardConfig,
104+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './react-query';
2+
export * from './blockInfo';
3+
export * from './pageData';

0 commit comments

Comments
 (0)