import React, { useState, useEffect, useMemo } from 'react'; import { Location, Coop, Floor } from '../../types'; interface LocationSelectorProps { locations: Location[]; coops: Coop[]; floors: Floor[]; initialFloorId: string | null; onFloorChange: (floorId: string | null) => void; } const LocationSelector: React.FC = ({ locations, coops, floors, initialFloorId, onFloorChange, }) => { const [selectedLocationId, setSelectedLocationId] = useState(''); const [selectedCoopId, setSelectedCoopId] = useState(''); useEffect(() => { if (initialFloorId) { const floor = floors.find((f) => f.id === initialFloorId); const coop = floor ? coops.find((c) => c.id === floor.coopId) : undefined; const location = coop ? locations.find((l) => l.id === coop.locationId) : undefined; if (location) setSelectedLocationId(location.id); if (coop) setSelectedCoopId(coop.id); } else { setSelectedLocationId(locations[0]?.id || ''); } }, [initialFloorId, locations, coops, floors]); useEffect(() => { if (!initialFloorId) { const firstCoop = coops.find((c) => c.locationId === selectedLocationId); setSelectedCoopId(firstCoop?.id || ''); } }, [selectedLocationId, coops, initialFloorId]); useEffect(() => { if (!initialFloorId) { const firstFloor = floors.find((f) => f.coopId === selectedCoopId); onFloorChange(firstFloor?.id || null); } // We only want this to run when the coop changes, not when the parent's floor changes. // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedCoopId, floors, initialFloorId]); const availableCoops = useMemo( () => coops.filter((c) => c.locationId === selectedLocationId), [coops, selectedLocationId] ); const availableFloors = useMemo( () => floors.filter((f) => f.coopId === selectedCoopId), [floors, selectedCoopId] ); return (
); }; export default LocationSelector;