1
- import React , { useEffect , useState } from 'react' ;
2
- import { useDispatch , useSelector } from 'react-redux' ;
3
- import PropTypes from 'prop-types' ;
4
- import { injectIntl , intlShape } from '@edx/frontend-platform/i18n' ;
1
+ import { useIntl } from '@edx/frontend-platform/i18n' ;
5
2
import {
6
- Container , Layout , Button , StatefulButton ,
3
+ Button , Container , Layout , StatefulButton ,
7
4
} from '@openedx/paragon' ;
8
- import { CheckCircle , Warning , Add as IconAdd } from '@openedx/paragon/icons' ;
9
-
10
- import { useModel } from '../generic/model-store' ;
5
+ import { Add as IconAdd , CheckCircle , Warning } from '@openedx/paragon/icons' ;
6
+ import {
7
+ useCourseSettings ,
8
+ useGradingSettings ,
9
+ useGradingSettingUpdater ,
10
+ } from 'CourseAuthoring/grading-settings/data/apiHooks' ;
11
+ import PropTypes from 'prop-types' ;
12
+ import React , { useEffect , useState } from 'react' ;
13
+ import { Helmet } from 'react-helmet' ;
14
+ import { STATEFUL_BUTTON_STATES } from '../constants' ;
11
15
import AlertMessage from '../generic/alert-message' ;
12
- import { RequestStatus } from '../data/constants' ;
13
16
import InternetConnectionAlert from '../generic/internet-connection-alert' ;
14
- import SubHeader from '../generic/sub-header/SubHeader' ;
17
+
18
+ import { useModel } from '../generic/model-store' ;
15
19
import SectionSubHeader from '../generic/section-sub-header' ;
16
- import { STATEFUL_BUTTON_STATES } from '../constants' ;
17
- import {
18
- getGradingSettings ,
19
- getCourseAssignmentLists ,
20
- getSavingStatus ,
21
- getLoadingStatus ,
22
- getCourseSettings ,
23
- } from './data/selectors' ;
24
- import { fetchGradingSettings , sendGradingSetting , fetchCourseSettingsQuery } from './data/thunks' ;
25
- import GradingScale from './grading-scale/GradingScale' ;
26
- import GradingSidebar from './grading-sidebar' ;
27
- import messages from './messages' ;
20
+ import SubHeader from '../generic/sub-header/SubHeader' ;
21
+ import getPageHeadTitle from '../generic/utils' ;
28
22
import AssignmentSection from './assignment-section' ;
29
23
import CreditSection from './credit-section' ;
30
24
import DeadlineSection from './deadline-section' ;
25
+ import GradingScale from './grading-scale/GradingScale' ;
26
+ import GradingSidebar from './grading-sidebar' ;
31
27
import { useConvertGradeCutoffs , useUpdateGradingData } from './hooks' ;
32
- import getPageHeadTitle from '../generic/utils' ;
28
+ import messages from './messages' ;
29
+
30
+ const GradingSettings = ( { courseId } ) => {
31
+ const intl = useIntl ( ) ;
32
+ const {
33
+ data : gradingSettings ,
34
+ isLoading : isGradingSettingsLoading ,
35
+ } = useGradingSettings ( courseId ) ;
36
+ const {
37
+ data : courseSettingsData ,
38
+ isLoading : isCourseSettingsLoading ,
39
+ } = useCourseSettings ( courseId ) ;
40
+ const {
41
+ mutate : updateGradingSettings ,
42
+ isLoading : savePending ,
43
+ isSuccess : savingStatus ,
44
+ isError : savingFailed ,
45
+ } = useGradingSettingUpdater ( courseId ) ;
46
+
47
+ const courseAssignmentLists = gradingSettings ?. courseAssignmentLists ;
48
+ const courseGradingDetails = gradingSettings ?. courseDetails ;
33
49
34
- const GradingSettings = ( { intl, courseId } ) => {
35
- const gradingSettingsData = useSelector ( getGradingSettings ) ;
36
- const courseSettingsData = useSelector ( getCourseSettings ) ;
37
- const courseAssignmentLists = useSelector ( getCourseAssignmentLists ) ;
38
- const savingStatus = useSelector ( getSavingStatus ) ;
39
- const loadingStatus = useSelector ( getLoadingStatus ) ;
40
50
const [ showSuccessAlert , setShowSuccessAlert ] = useState ( false ) ;
41
- const dispatch = useDispatch ( ) ;
42
- const isLoading = loadingStatus === RequestStatus . IN_PROGRESS ;
51
+ const isLoading = isCourseSettingsLoading || isGradingSettingsLoading ;
43
52
const [ isQueryPending , setIsQueryPending ] = useState ( false ) ;
44
53
const [ showOverrideInternetConnectionAlert , setOverrideInternetConnectionAlert ] = useState ( false ) ;
45
54
const [ eligibleGrade , setEligibleGrade ] = useState ( null ) ;
46
55
47
- const courseDetails = useModel ( 'courseDetails' , courseId ) ;
48
- document . title = getPageHeadTitle ( courseDetails ?. name , intl . formatMessage ( messages . headingTitle ) ) ;
56
+ const courseName = useModel ( 'courseDetails' , courseId ) ?. name ;
49
57
50
58
const {
51
59
graders,
@@ -60,7 +68,7 @@ const GradingSettings = ({ intl, courseId }) => {
60
68
handleResetPageData,
61
69
handleAddAssignment,
62
70
handleRemoveAssignment,
63
- } = useUpdateGradingData ( gradingSettingsData , setOverrideInternetConnectionAlert , setShowSuccessAlert ) ;
71
+ } = useUpdateGradingData ( courseGradingDetails , setOverrideInternetConnectionAlert , setShowSuccessAlert ) ;
64
72
65
73
const {
66
74
gradeLetters,
@@ -69,28 +77,22 @@ const GradingSettings = ({ intl, courseId }) => {
69
77
} = useConvertGradeCutoffs ( gradeCutoffs ) ;
70
78
71
79
useEffect ( ( ) => {
72
- if ( savingStatus === RequestStatus . SUCCESSFUL ) {
80
+ if ( savingStatus ) {
73
81
setShowSuccessAlert ( ! showSuccessAlert ) ;
74
82
setShowSavePrompt ( ! showSavePrompt ) ;
75
83
setTimeout ( ( ) => setShowSuccessAlert ( false ) , 15000 ) ;
76
84
setIsQueryPending ( ! isQueryPending ) ;
77
85
window . scrollTo ( { top : 0 , behavior : 'smooth' } ) ;
78
86
}
79
- } , [ savingStatus ] ) ;
80
-
81
- useEffect ( ( ) => {
82
- dispatch ( fetchGradingSettings ( courseId ) ) ;
83
- dispatch ( fetchCourseSettingsQuery ( courseId ) ) ;
84
- } , [ courseId ] ) ;
87
+ } , [ savePending ] ) ;
85
88
86
89
if ( isLoading ) {
87
- // eslint-disable-next-line react/jsx-no-useless-fragment
88
- return < > </ > ;
90
+ return null ;
89
91
}
90
92
91
93
const handleQueryProcessing = ( ) => {
92
94
setShowSuccessAlert ( false ) ;
93
- dispatch ( sendGradingSetting ( courseId , gradingData ) ) ;
95
+ updateGradingSettings ( gradingData ) ;
94
96
} ;
95
97
96
98
const handleSendGradingSettingsData = ( ) => {
@@ -110,11 +112,14 @@ const GradingSettings = ({ intl, courseId }) => {
110
112
default : intl . formatMessage ( messages . buttonSaveText ) ,
111
113
pending : intl . formatMessage ( messages . buttonSavingText ) ,
112
114
} ,
113
- disabledStates : [ RequestStatus . PENDING ] ,
115
+ disabledStates : [ STATEFUL_BUTTON_STATES . pending ] ,
114
116
} ;
115
117
116
118
return (
117
119
< >
120
+ < Helmet >
121
+ < title > { getPageHeadTitle ( courseName , intl . formatMessage ( messages . headingTitle ) ) } </ title >
122
+ </ Helmet >
118
123
< Container size = "xl" className = "grading px-4" >
119
124
< div className = "mt-5" >
120
125
< AlertMessage
@@ -156,6 +161,7 @@ const GradingSettings = ({ intl, courseId }) => {
156
161
resetDataRef = { resetDataRef }
157
162
setOverrideInternetConnectionAlert = { setOverrideInternetConnectionAlert }
158
163
setEligibleGrade = { setEligibleGrade }
164
+ defaultGradeDesignations = { gradingSettings ?. defaultGradeDesignations }
159
165
/>
160
166
</ section >
161
167
{ courseSettingsData . creditEligibilityEnabled && courseSettingsData . isCreditCourse && (
@@ -226,7 +232,7 @@ const GradingSettings = ({ intl, courseId }) => {
226
232
< div className = "alert-toast" >
227
233
{ showOverrideInternetConnectionAlert && (
228
234
< InternetConnectionAlert
229
- isFailed = { savingStatus === RequestStatus . FAILED }
235
+ isFailed = { savingFailed }
230
236
isQueryPending = { isQueryPending }
231
237
onQueryProcessing = { handleQueryProcessing }
232
238
onInternetConnectionFailed = { handleInternetConnectionFailed }
@@ -263,8 +269,7 @@ const GradingSettings = ({ intl, courseId }) => {
263
269
} ;
264
270
265
271
GradingSettings . propTypes = {
266
- intl : intlShape . isRequired ,
267
272
courseId : PropTypes . string . isRequired ,
268
273
} ;
269
274
270
- export default injectIntl ( GradingSettings ) ;
275
+ export default GradingSettings ;
0 commit comments