All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import React from "react";
 | |
| import { Outlet } from "react-router-dom";
 | |
| import {
 | |
|   AccommodationListApi,
 | |
|   AccommodationsList,
 | |
| } from "../../api/accommodations/AccommodationListApi";
 | |
| import { CreateAccommodationCalendarURLDialogProvider } from "../../hooks/context_providers/accommodations/CreateAccommodationCalendarURLDialogProvider";
 | |
| import { InstallCalendarDialogProvider } from "../../hooks/context_providers/accommodations/InstallCalendarDialogProvider";
 | |
| import { UpdateAccommodationDialogProvider } from "../../hooks/context_providers/accommodations/UpdateAccommodationDialogProvider";
 | |
| import { UpdateReservationDialogProvider } from "../../hooks/context_providers/accommodations/UpdateReservationDialogProvider";
 | |
| import { AsyncWidget } from "../AsyncWidget";
 | |
| import { useFamily } from "../BaseFamilyRoute";
 | |
| 
 | |
| interface AccommodationsContext {
 | |
|   accommodations: AccommodationsList;
 | |
|   reloadAccommodationsList: () => Promise<void>;
 | |
| }
 | |
| 
 | |
| const AccommodationsContextK =
 | |
|   React.createContext<AccommodationsContext | null>(null);
 | |
| 
 | |
| export function BaseAccommodationsRoute(): React.ReactElement {
 | |
|   const family = useFamily();
 | |
| 
 | |
|   const [accommodations, setAccommodations] =
 | |
|     React.useState<null | AccommodationsList>(null);
 | |
| 
 | |
|   const loadKey = React.useRef(1);
 | |
| 
 | |
|   const loadPromise = React.useRef<() => void>(null);
 | |
| 
 | |
|   const load = async () => {
 | |
|     setAccommodations(
 | |
|       await AccommodationListApi.GetListOfFamily(family.family)
 | |
|     );
 | |
|   };
 | |
| 
 | |
|   const onReload = async () => {
 | |
|     loadKey.current += 1;
 | |
|     setAccommodations(null);
 | |
| 
 | |
|     return new Promise<void>((res, _rej) => {
 | |
|       loadPromise.current = () => res();
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <AsyncWidget
 | |
|       ready={accommodations !== null}
 | |
|       loadKey={`${family.familyId}-${loadKey.current}`}
 | |
|       load={load}
 | |
|       errMsg="Échec du chargement des informations sur les logements de la famille !"
 | |
|       build={() => {
 | |
|         if (loadPromise.current != null) {
 | |
|           loadPromise.current?.();
 | |
|           loadPromise.current = null;
 | |
|         }
 | |
| 
 | |
|         return (
 | |
|           <AccommodationsContextK.Provider
 | |
|             value={{
 | |
|               accommodations: accommodations!,
 | |
|               reloadAccommodationsList: onReload,
 | |
|             }}
 | |
|           >
 | |
|             <UpdateAccommodationDialogProvider>
 | |
|               <CreateAccommodationCalendarURLDialogProvider>
 | |
|                 <InstallCalendarDialogProvider>
 | |
|                   <UpdateReservationDialogProvider>
 | |
|                     <Outlet />
 | |
|                   </UpdateReservationDialogProvider>
 | |
|                 </InstallCalendarDialogProvider>
 | |
|               </CreateAccommodationCalendarURLDialogProvider>
 | |
|             </UpdateAccommodationDialogProvider>
 | |
|           </AccommodationsContextK.Provider>
 | |
|         );
 | |
|       }}
 | |
|     />
 | |
|   );
 | |
| }
 | |
| 
 | |
| export function useAccommodations(): AccommodationsContext {
 | |
|   return React.useContext(AccommodationsContextK)!;
 | |
| }
 |