11import React , { useEffect , useState } from "react" ;
2+ import { toApiDate } from "common/src/common/util" ;
23import CommonCalendar , { CalendarEvent } from "common/src/calendar/Calendar" ;
34import { useQuery } from "@apollo/client" ;
45import { get } from "lodash" ;
5- import { endOfISOWeek , startOfISOWeek } from "date-fns" ;
6+ import { addDays , endOfISOWeek , startOfISOWeek } from "date-fns" ;
67import styled from "styled-components" ;
78import { useTranslation } from "react-i18next" ;
89import {
910 Query ,
10- QueryReservationsArgs ,
1111 ReservationType ,
12+ ReservationUnitByPkTypeReservationsArgs ,
13+ QueryReservationUnitByPkArgs ,
1214} from "common/types/gql-types" ;
1315import { reservationUrl } from "../../common/urls" ;
1416import { combineResults } from "../../common/util" ;
@@ -17,10 +19,11 @@ import Legend from "../reservations/requested/Legend";
1719import { RESERVATIONS_BY_RESERVATIONUNITS } from "./queries" ;
1820import eventStyleGetter , { legend } from "./eventStyleGetter" ;
1921import { publicUrl } from "../../common/const" ;
22+ import { getReserveeName } from "../reservations/requested/util" ;
23+ import Loader from "../Loader" ;
2024
2125type Props = {
2226 begin : string ;
23- intersectingReservationUnits : number [ ] ;
2427 reservationUnitPk : number ;
2528} ;
2629
@@ -48,55 +51,79 @@ const updateQuery = (
4851 return combineResults ( previousResult , fetchMoreResult , "reservations" ) ;
4952} ;
5053
54+ const getEventTitle = ( {
55+ reservationUnitPk,
56+ reservation,
57+ } : {
58+ reservationUnitPk : number ;
59+ reservation : ReservationType ;
60+ } ) => {
61+ const reservationUnit = reservation . reservationUnits ?. [ 0 ] ;
62+ const isOtherReservationUnit = reservationUnitPk !== reservationUnit ?. pk ;
63+
64+ if ( isOtherReservationUnit ) {
65+ const reserveeName = getReserveeName ( reservation ) ;
66+ const reservationUnitName = reservationUnit ?. nameFi ?? "" ;
67+
68+ return [ reserveeName , reservationUnitName ] ;
69+ }
70+
71+ return null ;
72+ } ;
73+
5174const ReservationUnitCalendar = ( {
5275 begin,
5376 reservationUnitPk,
54- intersectingReservationUnits,
5577} : Props ) : JSX . Element => {
5678 const [ events , setEvents ] = useState ( [ ] as CalendarEvent < ReservationType > [ ] ) ;
5779 const [ hasMore , setHasMore ] = useState ( false ) ;
5880 const { notifyError } = useNotification ( ) ;
5981
6082 const { t } = useTranslation ( ) ;
6183
62- const { fetchMore } = useQuery < Query , QueryReservationsArgs > (
63- RESERVATIONS_BY_RESERVATIONUNITS ,
64-
65- {
66- fetchPolicy : "network-only" ,
67- variables : {
68- offset : 0 ,
69- first : 100 ,
70- reservationUnit : intersectingReservationUnits . map ( String ) ,
71- begin : startOfISOWeek ( new Date ( begin ) ) ,
72- end : endOfISOWeek ( new Date ( begin ) ) ,
73- } ,
74- onCompleted : ( { reservations } ) => {
75- if ( reservations ) {
76- setEvents (
77- ( reservations ?. edges || [ ] ) . map ( ( r ) => ( {
78- title : `${
79- r ?. node ?. reserveeOrganisationName ||
80- `${ r ?. node ?. reserveeFirstName || "" } ${
81- r ?. node ?. reserveeLastName || ""
84+ const { fetchMore, loading } = useQuery <
85+ Query ,
86+ QueryReservationUnitByPkArgs & ReservationUnitByPkTypeReservationsArgs
87+ > ( RESERVATIONS_BY_RESERVATIONUNITS , {
88+ fetchPolicy : "network-only" ,
89+ variables : {
90+ pk : reservationUnitPk ,
91+ from : toApiDate ( startOfISOWeek ( new Date ( begin ) ) ) ,
92+ to : toApiDate ( addDays ( endOfISOWeek ( new Date ( begin ) ) , 1 ) ) ,
93+ } ,
94+ onCompleted : ( { reservationUnitByPk } ) => {
95+ const reservations =
96+ reservationUnitByPk ?. reservations ?. filter (
97+ ( item ) : item is ReservationType => ! ! item
98+ ) || [ ] ;
99+
100+ if ( reservations ) {
101+ setEvents (
102+ reservations . map ( ( reservation ) => {
103+ const titleParts = getEventTitle ( {
104+ reservationUnitPk,
105+ reservation,
106+ } ) ;
107+ const title = titleParts
108+ ? `${ titleParts [ 0 ] } / ${ t ( "common.reservationUnit" ) } ${
109+ titleParts [ 1 ]
82110 } `
83- } `,
84- event : r ?. node as ReservationType ,
85- start : new Date ( get ( r ?. node , "begin" ) ) ,
86- end : new Date ( get ( r ?. node , "end" ) ) ,
87- } ) )
88- ) ;
111+ : "" ;
89112
90- if ( reservations . pageInfo . hasNextPage ) {
91- setHasMore ( true ) ;
92- }
93- }
94- } ,
95- onError : ( ) => {
96- notifyError ( t ( "errors.errorFetchingData" ) ) ;
97- } ,
98- }
99- ) ;
113+ return {
114+ title,
115+ event : reservation as ReservationType ,
116+ start : new Date ( get ( reservation , "begin" ) ) ,
117+ end : new Date ( get ( reservation , "end" ) ) ,
118+ } ;
119+ } )
120+ ) ;
121+ }
122+ } ,
123+ onError : ( ) => {
124+ notifyError ( t ( "errors.errorFetchingData" ) ) ;
125+ } ,
126+ } ) ;
100127 useEffect ( ( ) => {
101128 if ( hasMore ) {
102129 setHasMore ( false ) ;
@@ -110,6 +137,8 @@ const ReservationUnitCalendar = ({
110137 // eslint-disable-next-line react-hooks/exhaustive-deps
111138 } , [ hasMore , setHasMore ] ) ;
112139
140+ if ( loading ) return < Loader /> ;
141+
113142 return (
114143 < Container >
115144 < CommonCalendar
0 commit comments