11import { Autocomplete , Box , Checkbox , Grid , TextField , useTheme } from '@mui/material' ;
22import PageLayout from '../../../components/PageLayout' ;
3- import { getDateRange } from '../../../utils/design-review.utils' ;
43import AvailabilityView from './AvailabilityView' ;
54import { useAllUsers } from '../../../hooks/users.hooks' ;
65import LoadingIndicator from '../../../components/LoadingIndicator' ;
76import ErrorPage from '../../ErrorPage' ;
87import { userToAutocompleteOption } from '../../../utils/teams.utils' ;
9- import { useEffect , useMemo , useState } from 'react' ;
8+ import { useState } from 'react' ;
109import CheckBoxIcon from '@mui/icons-material/CheckBox' ;
1110import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank' ;
1211import { DatePicker , TimePicker } from '@mui/x-date-pickers' ;
1312import { DesignReview , User , UserWithScheduleSettings } from 'shared' ;
14- import { wbsPipe } from 'shared' ;
1513import { useAllDesignReviews } from '../../../hooks/design-reviews.hooks' ;
14+ import { designReviewNamePipe } from '../../../utils/pipes' ;
1615
1716interface DesignReviewDetailPageProps {
1817 designReview : DesignReview ;
1918}
2019
2120const DesignReviewDetailPage : React . FC < DesignReviewDetailPageProps > = ( { designReview } ) => {
2221 const theme = useTheme ( ) ;
22+ const [ requiredUsers , setRequiredUsers ] = useState ( [ ] . map ( userToAutocompleteOption ) ) ;
23+ const [ optionalUsers , setOptionalUsers ] = useState ( [ ] . map ( userToAutocompleteOption ) ) ;
24+ const [ date , setDate ] = useState ( new Date ( `${ new Date ( ) . toLocaleDateString ( ) } 12:00:00` ) ) ;
25+
26+ const usersToAvailabilities = new Map < User , number [ ] > ( ) ;
2327
2428 const { isLoading : allUsersIsLoading , isError : allUsersIsError , error : allUsersError , data : allUsers } = useAllUsers ( ) ;
2529 const {
@@ -29,75 +33,6 @@ const DesignReviewDetailPage: React.FC<DesignReviewDetailPageProps> = ({ designR
2933 isLoading : allDesignReviewsIsLoading
3034 } = useAllDesignReviews ( ) ;
3135
32- const [ requiredUsers , setRequiredUsers ] = useState ( [ ] . map ( userToAutocompleteOption ) ) ;
33- const [ optionalUsers , setOptionalUsers ] = useState ( [ ] . map ( userToAutocompleteOption ) ) ;
34- const [ selectedStartDateTime , setselectedStartDateTime ] = useState (
35- new Date ( `${ new Date ( ) . toLocaleDateString ( ) } 12:00:00` )
36- ) ;
37- const [ selectedEndDateTime , setselectedEndDateTime ] = useState ( new Date ( `${ new Date ( ) . toLocaleDateString ( ) } 12:00:00` ) ) ;
38- const [ usersToAvailabilities , setUsersToAvailabilities ] = useState < Map < User , number [ ] > > ( new Map ( ) ) ;
39- const [ existingMeetingData , setexistingMeetingData ] = useState < Map < number , string > > ( new Map ( ) ) ;
40- const [ dateRange , setDateRange ] = useState ( '' ) ;
41- const designReviewName = `${ wbsPipe ( designReview . wbsNum ) } - ${ designReview . wbsName } ` ;
42- const [ startDateRange , endDateRange ] = getDateRange ( selectedStartDateTime ) ;
43-
44- const conflictingDesignReviews = useMemo (
45- ( ) =>
46- allDesignReviews
47- ? allDesignReviews . filter (
48- ( currDr ) =>
49- currDr . dateScheduled . toLocaleDateString ( ) === selectedStartDateTime . toLocaleDateString ( ) &&
50- allDesignReviews . some ( ( designReview ) =>
51- designReview . meetingTimes . some ( ( time ) => currDr . meetingTimes . includes ( time ) )
52- ) &&
53- currDr . designReviewId !== designReview . designReviewId
54- )
55- : [ ] ,
56- [ allDesignReviews , selectedStartDateTime , designReview ]
57- ) ;
58-
59- // Ensures the existing meeting data information only shows up on the current date range
60- const currentWeekDesignReviews = useMemo ( ( ) => {
61- return allDesignReviews
62- ? allDesignReviews . filter ( ( currDr ) => {
63- const drDate = new Date ( currDr . dateScheduled ) . getTime ( ) ;
64- const startRange = startDateRange . getTime ( ) ;
65- const endRange = endDateRange . getTime ( ) ;
66-
67- return drDate >= startRange && drDate <= endRange ;
68- } )
69- : [ ] ;
70- } , [ allDesignReviews , startDateRange , endDateRange ] ) ;
71-
72- // Sets the existing meeting data for the icons that get displayed on the calander
73- useEffect ( ( ) => {
74- if ( currentWeekDesignReviews ) {
75- const newExistingMeetingData = new Map < number , string > ( ) ;
76- currentWeekDesignReviews ?. forEach ( ( designReview ) =>
77- designReview . meetingTimes . forEach ( ( meetingTime ) => newExistingMeetingData . set ( meetingTime , 'build' ) )
78- ) ;
79- setexistingMeetingData ( newExistingMeetingData ) ;
80- }
81- } , [ currentWeekDesignReviews ] ) ;
82-
83- useEffect ( ( ) => {
84- if ( designReview && designReview . confirmedMembers . length > 0 ) {
85- const newUsersToAvailabilities = new Map < User , number [ ] > ( ) ;
86- designReview . confirmedMembers . forEach ( ( user : UserWithScheduleSettings ) => {
87- newUsersToAvailabilities . set ( user , user . scheduleSettings ?. availability ?? [ ] ) ;
88- } ) ;
89- setUsersToAvailabilities ( newUsersToAvailabilities ) ;
90- }
91- } , [ designReview ] ) ;
92-
93- useEffect ( ( ) => {
94- setDateRange (
95- `${ ( startDateRange . getMonth ( ) + 1 ) . toString ( ) } /${ startDateRange . getDate ( ) . toString ( ) } - ${ (
96- endDateRange . getMonth ( ) + 1
97- ) . toString ( ) } /${ endDateRange . getDate ( ) . toString ( ) } `
98- ) ;
99- } , [ startDateRange , endDateRange ] ) ;
100-
10136 if ( allUsersIsError ) return < ErrorPage message = { allUsersError ?. message } /> ;
10237 if ( allDesignReviewsIsError ) return < ErrorPage message = { allDesignReviewsError ?. message } /> ;
10338 if ( allUsersIsLoading || ! allUsers || allDesignReviewsIsLoading || ! allDesignReviews ) return < LoadingIndicator /> ;
@@ -106,19 +41,15 @@ const DesignReviewDetailPage: React.FC<DesignReviewDetailPageProps> = ({ designR
10641
10742 const handleDateChange = ( newDate : Date | null ) => {
10843 if ( newDate ) {
109- const updatedDateTime = new Date ( selectedStartDateTime ) ;
44+ const updatedDateTime = new Date ( ) ;
11045 updatedDateTime . setFullYear ( newDate . getFullYear ( ) , newDate . getMonth ( ) , newDate . getDate ( ) ) ;
111- setselectedStartDateTime ( updatedDateTime ) ;
46+ setDate ( updatedDateTime ) ;
11247 }
11348 } ;
11449
115- const handleTimeChange = ( newTime : Date | null , isStartTime : boolean ) => {
116- if ( newTime ) {
117- const updatedDateTime = new Date ( selectedStartDateTime ) ;
118- updatedDateTime . setHours ( newTime . getHours ( ) , newTime . getMinutes ( ) ) ;
119- isStartTime ? setselectedStartDateTime ( updatedDateTime ) : setselectedEndDateTime ( updatedDateTime ) ;
120- }
121- } ;
50+ designReview . confirmedMembers . forEach ( ( user : UserWithScheduleSettings ) => {
51+ usersToAvailabilities . set ( user , user . scheduleSettings ?. availability ?? [ ] ) ;
52+ } ) ;
12253
12354 return (
12455 < PageLayout title = "Scheduling" >
@@ -148,13 +79,13 @@ const DesignReviewDetailPage: React.FC<DesignReviewDetailPageProps> = ({ designR
14879 width : '100%'
14980 } }
15081 >
151- { designReviewName }
82+ { designReviewNamePipe ( designReview ) }
15283 </ Box >
15384 </ Grid >
15485 < Grid item xs = { 2 } >
15586 < DatePicker
15687 label = { 'Date' }
157- value = { selectedStartDateTime }
88+ value = { setDate }
15889 onChange = { handleDateChange }
15990 renderInput = { ( params ) => < TextField { ...params } /> }
16091 />
@@ -163,17 +94,17 @@ const DesignReviewDetailPage: React.FC<DesignReviewDetailPageProps> = ({ designR
16394 < TimePicker
16495 label = { 'Start Time' }
16596 views = { [ 'hours' ] }
166- value = { selectedStartDateTime }
167- onChange = { ( newTime ) => handleTimeChange ( newTime , true ) }
97+ value = { date }
98+ onChange = { ( newTime ) => { } }
16899 renderInput = { ( params ) => < TextField { ...params } /> }
169100 />
170101 </ Grid >
171102 < Grid item xs = { 2 } >
172103 < TimePicker
173104 label = { 'End Time' }
174105 views = { [ 'hours' ] }
175- value = { selectedEndDateTime }
176- onChange = { ( newTime ) => handleTimeChange ( newTime , false ) }
106+ value = { date }
107+ onChange = { ( newTime ) => { } }
177108 renderInput = { ( params ) => < TextField { ...params } /> }
178109 />
179110 </ Grid >
@@ -276,11 +207,9 @@ const DesignReviewDetailPage: React.FC<DesignReviewDetailPageProps> = ({ designR
276207 </ Grid >
277208 < AvailabilityView
278209 usersToAvailabilities = { usersToAvailabilities }
279- existingMeetingData = { existingMeetingData }
280- designReviewName = { designReviewName }
281- selectedStartDateTime = { selectedStartDateTime }
282- conflictingDesignReviews = { conflictingDesignReviews }
283- dateRange = { dateRange }
210+ designReview = { designReview }
211+ selectedDate = { date }
212+ allDesignReviews = { allDesignReviews }
284213 />
285214 </ PageLayout >
286215 ) ;
0 commit comments