@@ -7,12 +7,11 @@ import { getProctoredExamsFlag, getTimedExamsFlag } from '@src/course-outline/da
77import { ConfigureSubsectionData } from '@src/course-outline/data/types' ;
88import { useOutlineSidebarContext } from '@src/course-outline/outline-sidebar/OutlineSidebarContext' ;
99import { useCourseAuthoringContext } from '@src/CourseAuthoringContext' ;
10- import { VisibilityTypes } from '@src/data/constants' ;
1110import AdvancedTab from '@src/generic/configure-modal/AdvancedTab' ;
1211import { DatepickerControl , DATEPICKER_TYPES } from '@src/generic/datepicker-control' ;
1312import { SidebarContent , SidebarSection } from '@src/generic/sidebar' ;
1413import { useStateWithCallback } from '@src/hooks' ;
15- import { useState } from 'react' ;
14+ import { useCallback , useEffect , useState } from 'react' ;
1615import { useSelector } from 'react-redux' ;
1716import { ReleaseSection } from './sharedSettings/ReleaseSection' ;
1817import messages from './messages' ;
@@ -166,18 +165,31 @@ const SpecialExamSection = ({ subsectionId, onChange }: SubProps) => {
166165 const { data : itemData } = useCourseItemData ( subsectionId ) ;
167166 const enableTimedExams = useSelector ( getTimedExamsFlag ) ;
168167 const enableProctoredExams = useSelector ( getProctoredExamsFlag ) ;
169- const [ localState , setLocalState ] = useStateWithCallback < Partial < ConfigureSubsectionData > > (
170- {
168+ const getLatestLocalState = useCallback ( ( ) => {
169+ return {
171170 isProctoredExam : itemData ?. isProctoredExam ,
172171 isTimeLimited : itemData ?. isTimeLimited ,
173172 isOnboardingExam : itemData ?. isOnboardingExam ,
174173 isPracticeExam : itemData ?. isPracticeExam ,
175174 defaultTimeLimitMinutes : itemData ?. defaultTimeLimitMinutes ,
176175 examReviewRules : itemData ?. examReviewRules ,
177- } ,
178- ( val ) => onChange ( val || { } ) ,
176+ isPrereq : itemData ?. isPrereq ,
177+ prereqMinScore : defaultPrereqScore ( itemData ?. prereqMinScore ) ,
178+ prereqMinCompletion : defaultPrereqScore ( itemData ?. prereqMinCompletion ) ,
179+ prereqUsageKey : itemData ?. prereq ,
180+ } ;
181+ } , [ itemData ] ) ;
182+
183+ const [ localState , setLocalState ] = useStateWithCallback < Partial < ConfigureSubsectionData > > (
184+ getLatestLocalState ( ) ,
185+ ( val ) => onChange ( val || { } )
179186 ) ;
180187
188+ useEffect ( ( ) => {
189+ if ( ! itemData ) return ;
190+ setLocalState ( { value : getLatestLocalState ( ) , skipCallback : true } ) ;
191+ } , [ itemData ] ) ;
192+
181193 const setFieldValue = ( key : keyof ConfigureSubsectionData , value : any ) => {
182194 setLocalState ( ( prev ) => ( {
183195 ...prev ,
@@ -190,14 +202,7 @@ const SpecialExamSection = ({ subsectionId, onChange }: SubProps) => {
190202 title = { intl . formatMessage ( messages . subsectionSpecialExamTitle ) }
191203 >
192204 < AdvancedTab
193- values = { {
194- isProctoredExam : localState ?. isProctoredExam ,
195- isTimeLimited : localState ?. isTimeLimited ,
196- isOnboardingExam : localState ?. isOnboardingExam ,
197- isPracticeExam : localState ?. isPracticeExam ,
198- defaultTimeLimitMinutes : localState ?. defaultTimeLimitMinutes ,
199- examReviewRules : localState ?. examReviewRules ,
200- } }
205+ values = { localState || { } }
201206 setFieldValue = { setFieldValue }
202207 prereqs = { itemData ?. prereqs }
203208 releasedToStudents = { itemData ?. releasedToStudents }
@@ -226,25 +231,10 @@ export const SubsectionSettings = ({ subsectionId }: Props) => {
226231 if ( isPending || ! itemData ) {
227232 return ;
228233 }
234+
229235 mutate ( {
230236 itemId : subsectionId ,
231237 sectionId : selectedContainerState ?. sectionId ,
232- isVisibleToStaffOnly : itemData . visibilityState === VisibilityTypes . STAFF_ONLY ,
233- releaseDate : itemData . start ,
234- graderType : itemData . format == null ? 'notgraded' : itemData . format ,
235- dueDate : itemData . due == null ? '' : itemData . due ,
236- isTimeLimited : itemData . isTimeLimited ,
237- isProctoredExam : itemData . isProctoredExam ,
238- isOnboardingExam : itemData . isOnboardingExam ,
239- isPracticeExam : itemData . isPracticeExam ,
240- examReviewRules : itemData . examReviewRules ,
241- defaultTimeLimitMinutes : itemData . defaultTimeLimitMinutes ,
242- hideAfterDue : itemData . hideAfterDue === undefined ? false : itemData . hideAfterDue ,
243- showCorrectness : itemData . showCorrectness ,
244- isPrereq : itemData . isPrereq ,
245- prereqUsageKey : itemData . prereq ,
246- prereqMinScore : defaultPrereqScore ( itemData . prereqMinScore ) ,
247- prereqMinCompletion : defaultPrereqScore ( itemData . prereqMinCompletion ) ,
248238 ...variables ,
249239 } ) ;
250240 } ;
0 commit comments