sabrebooking / sabrefrontend / src / pages / Homepage.jsx
Homepage.jsx
Raw
import Container from "react-bootstrap/esm/Container"
import Row from 'react-bootstrap/Row'
import Col from 'react-bootstrap/Col'
import leadersPath from '../assets/Leaders.jpeg'
import philosophersPath from '../assets/Philosophers.jpeg'
import visionariesPath from '../assets/Visionaries.jpeg'
import legendsPath from '../assets/legends.webp'
import investorsPath from '../assets/investors.webp'
import explorersPath from '../assets/Explorers.jpeg'
import './Homepage.css'
import WifiIcon from "../components/icons/WifiIcon"
import WhiteBoardIcon from "../components/icons/WhiteBoardIcon"
import RoomCard from "../components/RoomCard"
import TVIcon from "../components/icons/TVIcon"
import AirConditioningIcon from "../components/Icons/AirConditioningIcon"
import SpeakerIcon from "../components/Icons/SpeakerIcon"
import { useState, useEffect } from "react"
import AllAmenitiesModalHome from "../components/AdditionalAmenitiesModal"
import { useNavigate } from 'react-router-dom';
import FilterRoomsNew from "../components/filterRoomsNew"



export default function Homepage() {
    const [rooms, setRooms] = useState([])
    const [validRooms, setValidRooms] = useState([])
    const [bookingDetails, setbookingDetails] = useState({})

    useEffect(() => {
        async function fetchRooms() {
            const response = await fetch("http://127.0.0.1:8000/sabreapi/v1/rooms/");
            const rooms = await response.json();
            setRooms(rooms);          
        }
        fetchRooms();
    }, [])
    
    function handleRooms(updatedRooms, bookingDetails) {
        setValidRooms([])
        setbookingDetails(bookingDetails)

        let filtered_rooms = []
        for (let i=0; i< updatedRooms.length; i++) {
            let room_id = updatedRooms[i][0]
          
            for (let j=0; j<rooms.length;j++) {
    
                if (rooms[j].id == room_id) {
                    filtered_rooms.push(rooms[j])
                }
            }
        }
        setValidRooms(filtered_rooms)
    }
   
    // Room display function, for displaying all rooms on the home pages
    function DisplayRooms({roomsData}) {

        const navigateTo = useNavigate();
       
        return (
            roomsData.map((room_data) => {

                    let roomPath = ""

                   switch (room_data.name) {
                        case "Inventors":
                            roomPath = investorsPath;
                            break;
                        case "Legends":
                            roomPath = legendsPath;
                            break;
                        case "Leaders":
                            roomPath = leadersPath;
                            break;
                        case "Explorers":
                            roomPath = explorersPath;
                            break;
                        case "Visionaries":
                            roomPath = visionariesPath;
                            break;
                        case "Philosophers":
                            roomPath = philosophersPath;
                            break;                            
                    }
                return ( 

                
                    <Col key={room_data.id} xs={12} md={6} lg={4}>
                    
                    <a  style={{
                        textDecoration: "none"
                    }}
                        onClick={() => navigateTo(`view/${room_data.id}`,
                        { state: {room_id: room_data?.id, bookingDetails: bookingDetails}})}
                        href="">
                        
                    <RoomCard className="room-card" room={room_data.name} imagePath={roomPath} />
                        </a>
                    </Col>
        

                )})
        );
    }

    {/* Arrange rooms in two rows, each consisting of 3 columns */}
    function RoomsDisplay({rooms}) {
        return (
        rooms?.length>3?
          
            <Container>
           <Row className="mt-5">
               <DisplayRooms roomsData = {rooms.slice(0, 3)} />
           </Row>
           <Row className="mt=5">
               <DisplayRooms roomsData = {rooms.slice(3, rooms.length)}/>
           </Row>
           </Container>
           :
           <Row className="mt-5">
               <DisplayRooms roomsData = {rooms} />
           </Row>
       
    )
    }

    return (
        <>
            <Container className="mt-4" fluid>
                    <Container className="mt-4 d-flex justify-content-center" fluid>    
                    {/* Amenities ribbon */}
                    <Container className="d-flex align-items-center justify-content-center" fluid>
                        <Container style={{
                            fontSize: 20,
                            borderRight: "2px solid black",
                            textAlign: "center",
                            width: "6em"

                        }} className="mr-3" >
                                    <strong>Amenities</strong>
                        </Container>

                            <Container className="d-flex align-items-center justify-content-center">
                                <AirConditioningIcon className="mr-1" /> 
                                    <Container>Air Conditioning</Container>
                                    
                                </Container>
                                <Container className="d-flex justify-content-space-around align-items-center" >
                                    <WhiteBoardIcon className="mr-1" />
                                    <Container>Whiteboard</Container>
                                    
                                </Container>
                                <Container className="d-flex justify-content-space-around align-items-center ">
                                    <WifiIcon className="mr-1" /> 
                                    <Container>Wifi</Container>
                                    
                                </Container>
                                <Container className="d-flex justify-content-space-around align-items-center">
                                    <TVIcon className="mr-1" /> 
                                    <Container>TV</Container>  
                                </Container>
                                
                                <Container className="d-flex justify-content-space-around align-items-center">
                                    <SpeakerIcon className="mr-1" /> 
                                        <Container>Sound System</Container>
                                    </Container>
                            
                                <AllAmenitiesModalHome/>      
                    </Container>
                    {/* Filter rooms ribbon */}
                </Container >
                <Container className="d-flex align-items-center justify-content-center">
                        <FilterRoomsNew handleRooms={handleRooms} />
                </Container>
                
                <Container>

                    {/* "See avaiable rooms" Title */}
                <Container className="d-flex align-items-center mt-3 justify-content-center" fluid>
                        <Container  
                            className=" mt-2 "
                            style={{
                                borderBottom: "2px solid #DDDD"
                            }}
                        >
                       <h1> {validRooms.length?"Click a room below to reserve":"See all rooms"}</h1> 
                    </Container>
                </Container >
                    {/* Display rooms. Refresh page with updated rooms when users enters booking details */}
                <RoomsDisplay sx={{
                }} rooms={validRooms.length?validRooms:rooms}/>
                                    
                </Container>
            </Container>
            
        </>
    )
}