11import { Grid } from '@mui/material' ;
2- import { DesignReview , User } from 'shared' ;
2+ import { DesignReview , DesignReviewStatus , User , UserWithScheduleSettings } from 'shared' ;
33import { useState } from 'react' ;
44import AvailabilityScheduleView from './AvailabilityScheduleView' ;
55import UserAvailabilites from './UserAvailabilitesView' ;
66import { getWeekDateRange } from '../../../utils/design-review.utils' ;
77import { dateRangePipe } from '../../../utils/pipes' ;
8+ import { DesignReviewEditData } from './DesignReviewDetailPage' ;
89
910interface AvailabilityViewProps {
10- usersToAvailabilities : Map < User , number [ ] > ;
1111 designReview : DesignReview ;
12- selectedDate : Date ;
1312 allDesignReviews : DesignReview [ ] ;
13+ allUsers : UserWithScheduleSettings [ ] ;
14+ editPayload : DesignReviewEditData ;
1415}
1516
16- const AvailabilityView : React . FC < AvailabilityViewProps > = ( {
17- usersToAvailabilities,
18- designReview,
19- selectedDate,
20- allDesignReviews
21- } ) => {
17+ const AvailabilityView : React . FC < AvailabilityViewProps > = ( { designReview, allDesignReviews, allUsers, editPayload } ) => {
2218 const availableUsers = new Map < number , User [ ] > ( ) ;
2319 const unavailableUsers = new Map < number , User [ ] > ( ) ;
2420 const existingMeetingData = new Map < number , string > ( ) ;
21+ const usersToAvailabilities = new Map < User , number [ ] > ( ) ;
22+
23+ const { selectedDate, requiredUserIds, optionalUserIds } = editPayload ;
2524
2625 const [ currentAvailableUsers , setCurrentAvailableUsers ] = useState < User [ ] > ( [ ] ) ;
2726 const [ currentUnavailableUsers , setCurrentUnavailableUsers ] = useState < User [ ] > ( [ ] ) ;
@@ -35,19 +34,33 @@ const AvailabilityView: React.FC<AvailabilityViewProps> = ({
3534 return drDate >= startRange && drDate <= endRange ;
3635 } ) ;
3736
38- const conflictingDesignReviews = allDesignReviews . filter (
39- ( currDr ) =>
40- currDr . dateScheduled . toLocaleDateString ( ) === selectedDate . toLocaleDateString ( ) &&
41- allDesignReviews . some ( ( designReview ) =>
42- designReview . meetingTimes . some ( ( time ) => currDr . meetingTimes . includes ( time ) )
43- ) &&
37+ const conflictingDesignReviews = allDesignReviews . filter ( ( currDr ) => {
38+ const day = editPayload . selectedDate . getDay ( ) ;
39+ const times = [ ] ;
40+ for ( let i = day * 12 + editPayload . startTime ; i <= day * 12 + editPayload . endTime ; i ++ ) {
41+ times . push ( i ) ;
42+ }
43+ const cleanDate = new Date ( currDr . dateScheduled . getTime ( ) - currDr . dateScheduled . getTimezoneOffset ( ) * - 60000 ) ;
44+ return (
45+ currDr . status === DesignReviewStatus . SCHEDULED &&
46+ cleanDate . toLocaleDateString ( ) === selectedDate . toLocaleDateString ( ) &&
47+ times . some ( ( time ) => currDr . meetingTimes . includes ( time ) ) &&
4448 currDr . designReviewId !== designReview . designReviewId
45- ) ;
49+ ) ;
50+ } ) ;
4651
4752 currentWeekDesignReviews . forEach ( ( designReview ) =>
48- designReview . meetingTimes . forEach ( ( meetingTime ) => existingMeetingData . set ( meetingTime , 'build' ) )
53+ designReview . meetingTimes . forEach ( ( meetingTime ) => {
54+ if ( designReview . status === DesignReviewStatus . SCHEDULED ) existingMeetingData . set ( meetingTime , 'build' ) ;
55+ } )
4956 ) ;
5057
58+ allUsers
59+ . filter ( ( user ) => requiredUserIds . concat ( optionalUserIds ) . includes ( user . userId ) )
60+ . forEach ( ( user : UserWithScheduleSettings ) => {
61+ usersToAvailabilities . set ( user , user . scheduleSettings ?. availability ?? [ ] ) ;
62+ } ) ;
63+
5164 return (
5265 < Grid container >
5366 < Grid item xs = { 9 } >
@@ -67,8 +80,8 @@ const AvailabilityView: React.FC<AvailabilityViewProps> = ({
6780 currentUnavailableUsers = { currentUnavailableUsers }
6881 usersToAvailabilities = { usersToAvailabilities }
6982 designReview = { designReview }
70- selectedDate = { selectedDate }
7183 conflictingDesignReviews = { conflictingDesignReviews }
84+ editPayload = { editPayload }
7285 />
7386 </ Grid >
7487 </ Grid >
0 commit comments