@@ -6,18 +6,21 @@ import messages from './messages';
66import DateExtensionsList from './components/DateExtensionsList' ;
77import ResetExtensionsModal from './components/ResetExtensionsModal' ;
88import { LearnerDateExtension } from './types' ;
9- import { useResetDateExtensionMutation } from '../data/apiHook' ;
9+ import { useAddDateExtensionMutation , useResetDateExtensionMutation } from '../data/apiHook' ;
10+ import AddExtensionModal from './components/AddExtensionModal' ;
1011
1112// const successMessage = 'Successfully reset due date for student Phu Nguyen for A subsection with two units (block-v1:SchemaAximWGU+WGU101+1+type@sequential+block@3984030755104708a86592cf23fb1ae4) to 2025-08-21 00:00';
1213
1314const DateExtensionsPage = ( ) => {
1415 const intl = useIntl ( ) ;
15- const { courseId } = useParams < { courseId : string } > ( ) ;
16+ const { courseId = '' } = useParams < { courseId : string } > ( ) ;
1617 const { mutate : resetMutation } = useResetDateExtensionMutation ( ) ;
18+ const { mutate : addExtensionMutation } = useAddDateExtensionMutation ( ) ;
1719 const [ isResetModalOpen , setIsResetModalOpen ] = useState ( false ) ;
1820 const [ selectedUser , setSelectedUser ] = useState < LearnerDateExtension | null > ( null ) ;
1921 const [ successMessage , setSuccessMessage ] = useState < string > ( '' ) ;
2022 const [ errorMessage , setErrorMessage ] = useState < string > ( '' ) ;
23+ const [ isAddExtensionModalOpen , setIsAddExtensionModalOpen ] = useState ( false ) ;
2124
2225 const handleResetExtensions = ( user : LearnerDateExtension ) => {
2326 setIsResetModalOpen ( true ) ;
@@ -51,14 +54,36 @@ const DateExtensionsPage = () => {
5154 }
5255 } ;
5356
57+ const handleOpenAddExtension = ( ) => {
58+ setIsAddExtensionModalOpen ( true ) ;
59+ } ;
60+
61+ const handleAddExtension = ( { student, url, due_datetime, reason } ) => {
62+ addExtensionMutation ( { courseId, extensionData : {
63+ student,
64+ url,
65+ due_datetime,
66+ reason
67+ } } , {
68+ onError : handleErrorOnReset ,
69+ onSuccess : handleSuccessOnReset
70+ } ) ;
71+ } ;
72+
5473 return (
5574 < Container className = "mt-4.5 mb-4 mx-4" fluid = "xl" >
5675 < h3 > { intl . formatMessage ( messages . dateExtensionsTitle ) } </ h3 >
5776 < div className = "d-flex align-items-center justify-content-between mb-3.5" >
5877 < p > filters</ p >
59- < Button > + { intl . formatMessage ( messages . addIndividualExtension ) } </ Button >
78+ < Button onClick = { handleOpenAddExtension } > + { intl . formatMessage ( messages . addIndividualExtension ) } </ Button >
6079 </ div >
6180 < DateExtensionsList onResetExtensions = { handleResetExtensions } />
81+ < AddExtensionModal
82+ isOpen = { isAddExtensionModalOpen }
83+ title = { intl . formatMessage ( messages . addIndividualDueDateExtension ) }
84+ onClose = { ( ) => setIsAddExtensionModalOpen ( false ) }
85+ onSubmit = { handleAddExtension }
86+ />
6287 < ResetExtensionsModal
6388 isOpen = { isResetModalOpen }
6489 message = { intl . formatMessage ( messages . resetConfirmationMessage ) }
0 commit comments