66import { Grid } from '@mui/material' ;
77import DetailDisplay from '../../../components/DetailDisplay' ;
88import { NERButton } from '../../../components/NERButton' ;
9- import { UserScheduleSettings } from 'shared' ;
9+ import { DesignReview , UserScheduleSettings } from 'shared' ;
1010import { useState } from 'react' ;
1111import SingleAvailabilityModal from './Availability/SingleAvailabilityModal' ;
12+ import { useCurrentUser } from '../../../hooks/users.hooks' ;
13+ import AvailabilityEditModal from './Availability/AvailabilityEditModal' ;
14+ import { useMarkUserConfirmed } from '../../../hooks/design-reviews.hooks' ;
15+ import { useToast } from '../../../hooks/toasts.hooks' ;
1216
13- const UserScheduleSettingsView = ( { scheduleSettings } : { scheduleSettings : UserScheduleSettings } ) => {
17+ const UserScheduleSettingsView = ( {
18+ scheduleSettings,
19+ designReview
20+ } : {
21+ scheduleSettings : UserScheduleSettings ;
22+ designReview ?: DesignReview ;
23+ } ) => {
1424 const [ availabilityOpen , setAvailabilityOpen ] = useState ( false ) ;
25+ const toast = useToast ( ) ;
26+ const user = useCurrentUser ( ) ;
27+ const defaultOpen = designReview && ! designReview . confirmedMembers . map ( ( user ) => user . userId ) . includes ( user . userId ) ;
28+ const [ confirmAvailabilityOpen , setConfirmAvailabilityOpen ] = useState ( defaultOpen || false ) ;
29+ const [ confirmedAvailabilities , setConfirmedAvailabilities ] = useState ( scheduleSettings . availability ) ;
30+ const { mutateAsync } = useMarkUserConfirmed ( designReview ?. designReviewId || '' ) ;
31+ const confirmModalTitle = designReview
32+ ? `Update your availability for the ${ designReview ?. wbsName } Design Review on the week of ${ new Date (
33+ designReview . dateScheduled . getTime ( ) - designReview . dateScheduled . getTimezoneOffset ( ) * - 60000
34+ ) . toLocaleDateString ( ) } `
35+ : '' ;
36+
37+ const handleConfirm = async ( payload : { availability : number [ ] } ) => {
38+ setConfirmAvailabilityOpen ( false ) ;
39+ try {
40+ await mutateAsync ( payload ) ;
41+ toast . success ( 'Availability Confirmed!' ) ;
42+ } catch ( e ) {
43+ if ( e instanceof Error ) {
44+ toast . error ( e . message ) ;
45+ }
46+ }
47+ } ;
1548
1649 return (
1750 < Grid container spacing = { 6 } sx = { { pt : '10px' } } >
@@ -21,6 +54,14 @@ const UserScheduleSettingsView = ({ scheduleSettings }: { scheduleSettings: User
2154 header = { 'Availability' }
2255 availabilites = { scheduleSettings . availability }
2356 />
57+ < AvailabilityEditModal
58+ open = { confirmAvailabilityOpen }
59+ onHide = { ( ) => setConfirmAvailabilityOpen ( false ) }
60+ header = { confirmModalTitle }
61+ availabilites = { confirmedAvailabilities }
62+ setAvailabilities = { setConfirmedAvailabilities }
63+ onSubmit = { ( ) => handleConfirm ( { availability : confirmedAvailabilities } ) }
64+ />
2465 < Grid item xs = { 12 } sm = { 6 } lg = { 4 } >
2566 < DetailDisplay label = "Personal Google Email" content = { scheduleSettings . personalGmail } />
2667 </ Grid >
0 commit comments