diff --git a/client/src/components/apartmentPage/ApartmentLayout.tsx b/client/src/components/apartmentPage/ApartmentLayout.tsx index 87eccd8..8b57bd7 100644 --- a/client/src/components/apartmentPage/ApartmentLayout.tsx +++ b/client/src/components/apartmentPage/ApartmentLayout.tsx @@ -3,6 +3,7 @@ import { ISwitchLabel } from "../../types/switchLabel"; import SwitchToggle from "../SwitchToggle"; import { IAparmentRes } from "../../types/apartmentsRes"; import { apartmentRoutes } from "../../consts/apartmentsRoutes"; +import { apartmentLayoutImages } from "../../consts/apartmentLayoutsImages"; const apartmentLayouts: ISwitchLabel[] = [ { id: "1", label: "Layout" }, @@ -14,6 +15,8 @@ interface ApartmentLayoutProps { } const ApartmentLayout = ({ currentApartment }: ApartmentLayoutProps) => { + const apartmentLayoutImage = + apartmentLayoutImages[currentApartment.Unit_Type]; const [currentLabel, setCurrentLabel] = useState(apartmentLayouts[0]); const handleOnSwitchClick = (label: ISwitchLabel) => { setCurrentLabel(label); @@ -27,7 +30,7 @@ const ApartmentLayout = ({ currentApartment }: ApartmentLayoutProps) => {
@@ -37,6 +40,7 @@ const ApartmentLayout = ({ currentApartment }: ApartmentLayoutProps) => { className="absolute right-10 bottom-10" /> { const { setFavorites } = useFavorites(); const handleOnBackClick = () => { - navigate("../search"); + navigate(-1); }; const handleOnFavoriteClick = ( diff --git a/client/src/components/complexWingPage/FloorSidebar/EastWingHighlighting.tsx b/client/src/components/complexWingPage/FloorSidebar/EastWingHighlighting.tsx index b005322..22d732d 100644 --- a/client/src/components/complexWingPage/FloorSidebar/EastWingHighlighting.tsx +++ b/client/src/components/complexWingPage/FloorSidebar/EastWingHighlighting.tsx @@ -1,11 +1,11 @@ interface EastWingHighlightingProps { - handleOnMouseOut: + handleOnMouseOut?: | (() => void) | ((event: React.MouseEvent) => void); - handleOnMouseOver: ( + handleOnMouseOver?: ( event: React.MouseEvent ) => void; - handleOnApartmentClick: ( + handleOnApartmentClick?: ( e: React.MouseEvent ) => void; } diff --git a/client/src/components/complexWingPage/FloorSidebar/WestWingHighlighting.tsx b/client/src/components/complexWingPage/FloorSidebar/WestWingHighlighting.tsx index 74bc3a8..d3fcf7f 100644 --- a/client/src/components/complexWingPage/FloorSidebar/WestWingHighlighting.tsx +++ b/client/src/components/complexWingPage/FloorSidebar/WestWingHighlighting.tsx @@ -1,11 +1,11 @@ interface FloorEastWingHighlightingProps { - handleOnMouseOut: + handleOnMouseOut?: | (() => void) | ((event: React.MouseEvent) => void); - handleOnMouseOver: ( + handleOnMouseOver?: ( event: React.MouseEvent ) => void | (() => void); - handleOnApartmentClick: ( + handleOnApartmentClick?: ( event: React.MouseEvent ) => void; } diff --git a/client/src/components/complexWingPage/FloorSidebar/WestWingTopLevelsHighlighting.tsx b/client/src/components/complexWingPage/FloorSidebar/WestWingTopLevelsHighlighting.tsx index d8ac337..6d74798 100644 --- a/client/src/components/complexWingPage/FloorSidebar/WestWingTopLevelsHighlighting.tsx +++ b/client/src/components/complexWingPage/FloorSidebar/WestWingTopLevelsHighlighting.tsx @@ -1,11 +1,11 @@ interface WestWingTopLevelsHighlightingProps { - handleOnMouseOut: + handleOnMouseOut?: | (() => void) | ((event: React.MouseEvent) => void); - handleOnMouseOver: + handleOnMouseOver?: | (() => void) | ((event: React.MouseEvent) => void); - handleOnApartmentClick: ( + handleOnApartmentClick?: ( event: React.MouseEvent ) => void; } diff --git a/client/src/components/complexWingPage/MobileApartmentDescription.tsx b/client/src/components/complexWingPage/MobileApartmentDescription.tsx new file mode 100644 index 0000000..9a5c0c3 --- /dev/null +++ b/client/src/components/complexWingPage/MobileApartmentDescription.tsx @@ -0,0 +1,110 @@ +import { apartmentsWithoutVirtualTour } from "../../consts/apartmentsWithoutVirtualTour"; +import { IAparmentRes } from "../../types/apartmentsRes"; +import Button from "../Button"; +import RightArrowSliderIcon from "../icons/RightArrowSliderIcon"; +import VirtualTourIcon from "../icons/VirtualTourIcon"; +import useModal from "../../store/useModal"; +import { MobileModalWrapper } from "../modals/mobile/MobileModalWrapper"; +import AboutComplexMobileModal from "../modals/mobile/AboutCompexMobileModal/AboutComplexMobileModal"; +import { IDesctiptionFloor } from "../../types/descriptionFloor"; + +interface MobileApartmentDescriptionProps { + apartment: IAparmentRes | null; + apartments: IAparmentRes[]; + apartmentDataType: string | null; + floor: IDesctiptionFloor | null; +} + +const MobileApartmentDescription = ({ + apartment, + apartmentDataType, + apartments, + floor, +}: MobileApartmentDescriptionProps) => { + const wing = + apartment && apartment.Unit_No.split("-")[0] === "E" + ? "East Wing" + : "West Wing"; + const isVirtualTourAvailiable = + apartment && + !apartmentsWithoutVirtualTour.some( + (aprt) => + aprt.type === apartment.Unit_Type || aprt.type === apartmentDataType + ); + const { setModal } = useModal(); + + const handleOnExploreClick = ( + event: React.MouseEvent + ) => { + event.preventDefault(); + if (!apartment) return; + setModal(null); + const timeout = setTimeout(() => { + setModal( + + + + ); + clearTimeout(timeout); + }, 300); + }; + + return ( + <> + {apartment && ( +
+
+

+ {apartment?.Unit_Type},{" "} + {apartment && Math.round(apartment?.Total_Area_Sqft)} Sqft +

+
+

{wing}

+
+

Floor {apartment.Floor}

+
+

{apartment.Unit_No}

+
+
+

+ Unvailiable +

+ {/*

+ AED 1,668,888 +

*/} + {isVirtualTourAvailiable && ( +
+ +

+ 3D-tour +

+
+ )} +
+
+
+
+
+
+ )} + + ); +}; + +export default MobileApartmentDescription; diff --git a/client/src/components/complexWingPage/SequenceWing/FloorsHighlighting.tsx b/client/src/components/complexWingPage/SequenceWing/FloorsHighlighting.tsx index f96096a..341df5a 100644 --- a/client/src/components/complexWingPage/SequenceWing/FloorsHighlighting.tsx +++ b/client/src/components/complexWingPage/SequenceWing/FloorsHighlighting.tsx @@ -3,8 +3,8 @@ import { MouseEvent } from "react"; import { IDesctiptionFloor } from "../../../types/descriptionFloor"; interface FloorsHighlightingProps { - handleOnFloorClick: () => void; - handleOnSkygardenClick: () => void; + handleOnFloorClick: (e: MouseEvent | any) => void; + handleOnSkygardenClick: (e: React.MouseEvent) => void; handleOnWingWrapperMouseEnter: (e: React.MouseEvent) => void; handleOnFloorMouseEnter: | (( diff --git a/client/src/components/complexWingPage/SequenceWing/MobileFloorDescription.tsx b/client/src/components/complexWingPage/SequenceWing/MobileFloorDescription.tsx index b5cac69..7274675 100644 --- a/client/src/components/complexWingPage/SequenceWing/MobileFloorDescription.tsx +++ b/client/src/components/complexWingPage/SequenceWing/MobileFloorDescription.tsx @@ -7,9 +7,7 @@ import RightArrowSliderIcon from "../../icons/RightArrowSliderIcon"; interface MobileFloorDescriptionProps { descriptionFloor: IDesctiptionFloor | null; floorApartments: IAparmentRes[]; - onClick: ( - e: React.MouseEvent> - ) => void; + onClick: (event: React.MouseEvent) => void; } const MobileFloorDescription = ({ diff --git a/client/src/components/complexWingPage/SequenceWing/MobileSkygardenDescription.tsx b/client/src/components/complexWingPage/SequenceWing/MobileSkygardenDescription.tsx new file mode 100644 index 0000000..7fbd3dc --- /dev/null +++ b/client/src/components/complexWingPage/SequenceWing/MobileSkygardenDescription.tsx @@ -0,0 +1,63 @@ +import Button from "../../Button"; +import CrossIcon from "../../icons/CrossIcon"; +import RightArrowSliderIcon from "../../icons/RightArrowSliderIcon"; + +interface MobileSkygardenDescriptionProps { + onClick: (e: React.MouseEvent) => void; +} + +const MobileSkygardenDescription = ({ + onClick, +}: MobileSkygardenDescriptionProps) => { + return ( + <> +
+
+
+
+

+ Sky Garden +

+
+
+
+
+
+
+

8

+
+

Indoor

+
+

3 amenties

+
+
+
+
+

8

+
+

Studio

+
+

14 amenties

+
+
+
+
+
+ + ); +}; + +export default MobileSkygardenDescription; diff --git a/client/src/components/complexWingPage/SequenceWing/SequenceWing.tsx b/client/src/components/complexWingPage/SequenceWing/SequenceWing.tsx index 0d3c095..253413d 100644 --- a/client/src/components/complexWingPage/SequenceWing/SequenceWing.tsx +++ b/client/src/components/complexWingPage/SequenceWing/SequenceWing.tsx @@ -1,10 +1,7 @@ +/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { MouseEvent, useEffect, useState } from "react"; -import FloorDescription from "../FloorDescription"; import { IDesctiptionFloor } from "../../../types/descriptionFloor"; -import SkygardenDescription from "../SkygardenDescription"; -import FloorSidebar from "../FloorSidebar/FloorSidebar"; -import SkygardenSidebar from "../SkygardenSidebar/SkygardenSidebar"; import useWingSidebar from "../../../store/useWingSidebar"; import useModal from "../../../store/useModal"; import { @@ -26,14 +23,15 @@ import { isMobile } from "react-device-detect"; import FloorsHighlighting from "./FloorsHighlighting"; import MobileFloorDescription from "./MobileFloorDescription"; import WingFloorModal from "../../modals/mobile/WingFloorModal"; +import MobileSkygardenDescription from "./MobileSkygardenDescription"; +import SkygardenModal from "../../modals/mobile/SkygardenModal"; -const skyGardenFloor = 22; +// const skyGardenFloor = 22; const SequenceWing = () => { const [width, setWidth] = useState(0); const [top, setTop] = useState(0); const [left, setLeft] = useState(0); - // const leftWingRef = useRef(null); const { isSidebar, setIsSidebar } = useWingSidebar(); const [mousePos, setMousePos] = useState<[number, number]>([0, 0]); const [currentHoveredFloor, setHoverCurrentFloor] = @@ -42,7 +40,7 @@ const SequenceWing = () => { const [currentFloor, setCurrentFloor] = useState( null ); - const [isWrapperHovered, setIsWrapperHovered] = useState(false); + const [, setIsWrapperHovered] = useState(false); const [isSkygardenSidebar, setIsSkygardenSidebar] = useState(false); const [isFloorSidebar, setIsFloorSidebar] = useState(false); const { setModal } = useModal(); @@ -50,12 +48,10 @@ const SequenceWing = () => { const [currentHoveredApartments, setCurrentHoveredApartments] = useState< IAparmentRes[] >([]); - const [selectedApartments, setSelectedApartments] = useState( - [] - ); const [isDescriptionFloorMobile, setIsDescriptionFloorMobile] = useState(false); + const [isDescriptionSkygarden, setIsDescriptionSkygarden] = useState(false); const { apartmentTypeCheckboxes, @@ -96,60 +92,17 @@ const SequenceWing = () => { setIsWrapperHovered(false); }; - const handleOnFloorClick = (e: MouseEvent | any) => { - const isFloorClicked = Boolean(e.currentTarget.dataset.id); - if (isFloorClicked) { - // detect mouse pos - const screenWidth = window.innerWidth; - const screenHeight = window.innerHeight; - // >1072 - if (screenWidth > laptopWidth) { - const _top = screenWidth / 2 - screenHeight / 2; - setMousePos([e.clientX - 384, e.clientY + Math.abs(_top) - 20]); - } else { - // 640-1072 - if (screenWidth > mobileWidht) { - const _top = screenHeight / 4; - const _left = laptopWidth - screenWidth; - setMousePos([ - e.clientX - 440 + _left, - e.clientY + Math.abs(_top) + 20, - ]); - // <640 - } else { - const _top = screenHeight / 2.5; - const _left = laptopWidth - screenWidth; - setMousePos([ - e.clientX - 440 + _left, - e.clientY + Math.abs(_top) + 20, - ]); - } - } - - //detect currentFloor, current sidebar and apartment on floor - if (!currentHoveredFloor && !currentHoveredApartments) return; - setSelectedApartments(currentHoveredApartments); - setCurrentFloor(currentHoveredFloor); - if (!isMobile) { - setIsFloorSidebar(true); - setIsSkygardenSidebar(false); - setIsSidebar(true); - } else { - setIsDescriptionFloorMobile(true); - } - } else { - setIsDescriptionFloorMobile(false); - } + const handleOnFloorClick = () => { + setIsDescriptionSkygarden(false); + //detect currentFloor + if (!currentHoveredFloor && !currentHoveredApartments) return; + setCurrentFloor(currentHoveredFloor); }; const handleOnSkygardenClick = () => { - if (!isMobile) { - setIsSkygardenSidebar(true); - setIsFloorSidebar(false); - setIsSidebar(true); - } else { - // setModal(); - } + setCurrentFloor(null); + setIsDescriptionFloorMobile(false); + setIsDescriptionSkygarden(true); }; function handleMouseMove( @@ -195,7 +148,6 @@ const SequenceWing = () => { //detect currentFloor, current sidebar and apartment on floor if (!currentHoveredFloor && !currentHoveredApartments) return; - setSelectedApartments(currentHoveredApartments); setCurrentFloor(currentHoveredFloor); if (!isMobile) { setIsFloorSidebar(true); @@ -203,6 +155,7 @@ const SequenceWing = () => { setIsSidebar(true); } else { setIsDescriptionFloorMobile(true); + setCurrentFloor(null); } } } @@ -233,11 +186,25 @@ const SequenceWing = () => { } } - const handleOnExploreClick = ( - e: MouseEvent> + const handleOnExploreFloorClick = ( + e: MouseEvent> | any ) => { e.stopPropagation(); - setModal(); + if (!currentHoveredFloor) return; + setModal( + + ); + setIsDescriptionFloorMobile(false); + }; + const handleOnExploreSkygardenClick = ( + e: MouseEvent> | any + ) => { + e.stopPropagation(); + setIsDescriptionSkygarden(false); + setModal(); setIsDescriptionFloorMobile(false); }; @@ -313,33 +280,16 @@ const SequenceWing = () => { sortList, ]); - // useEffect(() => { - // if (isLoading) { - // setModal(); - // } else { - // setModal(null); - // } - // }, [isLoading, setModal]); + useEffect(() => { + if (isLoading) { + setModal(); + } else { + setModal(null); + } + }, [isLoading, setModal]); return (
-
- -
-
- -
-
{ }`, }} > - - - {/* */}
+ +
+
diff --git a/client/src/components/complexWingPage/SkygardenSidebar/LayoutSlider.tsx b/client/src/components/complexWingPage/SkygardenSidebar/LayoutSlider.tsx index 79f9544..b6fe1b6 100644 --- a/client/src/components/complexWingPage/SkygardenSidebar/LayoutSlider.tsx +++ b/client/src/components/complexWingPage/SkygardenSidebar/LayoutSlider.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -// import { useSwipeable } from "react-swipeable"; +import { useSwipeable } from "react-swipeable"; import SkygardenIndoorLayout from "./SkygardenIndoorLayout"; import { ISwitchLabel } from "../../../types/switchLabel"; import SwitchToggle from "../../SwitchToggle"; @@ -14,13 +14,18 @@ const LayoutSlider = () => { const [currentLabel, setCurrentLabel] = useState( skygardenLayouts[0] ); + const handlers = useSwipeable({ + onSwipedLeft: () => setCurrentLabel(skygardenLayouts[1]), + onSwipedRight: () => setCurrentLabel(skygardenLayouts[0]), + trackMouse: true, + }); const handleOnSwitchClick = (label: ISwitchLabel) => { setCurrentLabel(label); }; return ( -
+
{ useEffect(() => { setOnFullscreen(onFullscreenHandle); - }, []); + }, [onFullscreenHandle, setOnFullscreen]); return ( <> - {isMobile ? : } + {modal} diff --git a/client/src/components/header/Header/MobileHeader.tsx b/client/src/components/header/Header/MobileHeader.tsx index f5204af..ecdd4f5 100644 --- a/client/src/components/header/Header/MobileHeader.tsx +++ b/client/src/components/header/Header/MobileHeader.tsx @@ -18,7 +18,7 @@ const MobileHeader = () => { isToggled ? "rounded-ee-lg rounded-es-lg shadow-[#00000026] shadow-md" : "" - } text-white flex flex-col text-sm items-center transition-all duration-500 ease-in-out absolute top-0 left-0 z-[99999900] overflow-hidden font-usual ${ + } text-white flex flex-col text-sm items-center transition-all duration-500 ease-in-out absolute top-0 left-0 z-[99999999] overflow-hidden font-usual ${ isToggled ? "max-h-[472px]" : "max-h-14" }`} > diff --git a/client/src/components/header/Navbar/Navbar.tsx b/client/src/components/header/Navbar/Navbar.tsx index 465c83b..b88c0cc 100644 --- a/client/src/components/header/Navbar/Navbar.tsx +++ b/client/src/components/header/Navbar/Navbar.tsx @@ -1,8 +1,6 @@ import { useEffect, useState } from "react"; -import { isMobile } from "react-device-detect"; import { useNavigate, useLocation } from "react-router-dom"; import { Tab } from "../../../types/tab"; -import NavbarDesktop from "./NavbarDesktop"; import NavbarMobile from "./NavbarMobile"; import { tabs as _tabs } from "../../../consts/tabs"; import useFavorites from "../../../store/useFavorites"; @@ -50,15 +48,13 @@ const Navbar = () => { return ( <> - {isMobile ? ( - - ) : ( - - )} + } ); }; diff --git a/client/src/components/header/Navbar/NavbarMobile.tsx b/client/src/components/header/Navbar/NavbarMobile.tsx index c615c5b..235d553 100644 --- a/client/src/components/header/Navbar/NavbarMobile.tsx +++ b/client/src/components/header/Navbar/NavbarMobile.tsx @@ -4,14 +4,20 @@ import NavbarTabMobile from "./NavbarTabMobile"; interface NavbarProps { onTabClick: (tab: Tab) => void; tabs: Tab[]; + selectedTab: Tab | null; } -const NavbarMobile = ({ onTabClick, tabs }: NavbarProps) => ( +const NavbarMobile = ({ onTabClick, tabs, selectedTab }: NavbarProps) => ( ); diff --git a/client/src/components/header/Navbar/NavbarTabMobile.tsx b/client/src/components/header/Navbar/NavbarTabMobile.tsx index de40544..ca811ce 100644 --- a/client/src/components/header/Navbar/NavbarTabMobile.tsx +++ b/client/src/components/header/Navbar/NavbarTabMobile.tsx @@ -4,15 +4,16 @@ import RightArrowIcon from "../../icons/RightArrowIcon"; interface NavbarTabProps { tab: Tab; onClick: (tab: Tab) => void; + isSelected: boolean; } const NavbarTabMobile = ({ tab, onClick }: NavbarTabProps) => { return ( -
+
+ ); +}; + +export default ButtonPanel; diff --git a/client/src/components/modals/mobile/MasterplanFiltersModal.tsx b/client/src/components/modals/mobile/MasterplanFiltersModal.tsx index d8a45ba..b7293d5 100644 --- a/client/src/components/modals/mobile/MasterplanFiltersModal.tsx +++ b/client/src/components/modals/mobile/MasterplanFiltersModal.tsx @@ -15,18 +15,27 @@ import { initialViewCheckboxes, } from "../../../consts/initialMasterplanFilters"; import { ICheckbox } from "../../../types/checkbox"; +import useMasterplanFilters from "../../../store/useMasterplanFilters"; const MasterplanFiltersModal = () => { const { setModal } = useModal(); const { setIsAnimate } = useContext(MobileModalWrapperContext); - const [apartmentTypeCheckboxes, setApartmentTypeCheckboxes] = useState< - ICheckbox[] - >(initialAparmentTypeCheckboxes); - const [viewCheckboxes, setViewCheckboxes] = useState( + + const { + setApartmentTypeCheckboxes, + setViewCheckboxes, + setMultirangeSliders, + setSwitchers, + } = useMasterplanFilters(); + + const [localApartmentTypeCheckboxes, setLocalApartmentTypeCheckboxes] = + useState(initialAparmentTypeCheckboxes); + const [localViewCheckboxes, setLocalViewCheckboxes] = useState( initialViewCheckboxes ); - const [switchers, setSwitchers] = useState(initialSwitchers); - const [multirangeSliders, setMultirangeSliders] = useState(initialSliders); + const [localSwitchers, setLocalSwitchers] = useState(initialSwitchers); + const [localMultirangeSliders, setLocalMultirangeSliders] = + useState(initialSliders); const handlers = useSwipeable({ onSwipedDown: () => handleOnCrossClick(), }); @@ -42,49 +51,49 @@ const MasterplanFiltersModal = () => { }; const handleOnCheckboxApartmentTypeClick = (checkboxId: string) => { - const updatedCheckboxes = apartmentTypeCheckboxes.map((cbox) => { + const updatedCheckboxes = localApartmentTypeCheckboxes.map((cbox) => { if (checkboxId !== cbox.id) return cbox; const isSelected = !cbox.selected; return { ...cbox, selected: isSelected }; }); - setApartmentTypeCheckboxes(updatedCheckboxes); + setLocalApartmentTypeCheckboxes(updatedCheckboxes); }; const handleOnSwitcherClick = (switcherId: string) => { - const updatedSwitchers = switchers.map((switcher) => { + const updatedSwitchers = localSwitchers.map((switcher) => { if (switcherId !== switcher.id) return switcher; const { isSwitched } = switcher; return { ...switcher, isSwitched: !isSwitched }; }); - setSwitchers(updatedSwitchers); + setLocalSwitchers(updatedSwitchers); }; const handleOnSliderValueChange = ( sliderId: string, e: [a: number, b: number] ) => { - const updatedSliders = multirangeSliders.map((slider) => { + const updatedSliders = localMultirangeSliders.map((slider) => { if (sliderId !== slider.id) return slider; return { ...slider, startValue: e[0], endValue: e[1] }; }); - setMultirangeSliders(updatedSliders); + setLocalMultirangeSliders(updatedSliders); }; const handleOnViewCheckboxClick = (checkboxId: string) => { - const updatedCheckboxes = viewCheckboxes.map((cbox) => { + const updatedCheckboxes = localViewCheckboxes.map((cbox) => { if (checkboxId !== cbox.id) return cbox; const isSelected = !cbox.selected; return { ...cbox, selected: isSelected }; }); - setViewCheckboxes(updatedCheckboxes); + setLocalViewCheckboxes(updatedCheckboxes); }; const handleOnShowApartmentClick = () => { @@ -92,16 +101,21 @@ const MasterplanFiltersModal = () => { setIsAnimate(false); const timeout = setTimeout(() => { setModal(null); + setApartmentTypeCheckboxes(localApartmentTypeCheckboxes); + setViewCheckboxes(localViewCheckboxes); + setMultirangeSliders(localMultirangeSliders); + setSwitchers(localSwitchers); + clearTimeout(timeout); }, 300); } }; const handleOnResetClick = () => { - setViewCheckboxes(initialViewCheckboxes); - setSwitchers(initialSwitchers); - setMultirangeSliders(initialSliders); - setApartmentTypeCheckboxes(initialAparmentTypeCheckboxes); + setLocalViewCheckboxes(initialViewCheckboxes); + setLocalSwitchers(initialSwitchers); + setLocalMultirangeSliders(initialSliders); + setLocalApartmentTypeCheckboxes(initialAparmentTypeCheckboxes); }; return ( @@ -124,7 +138,7 @@ const MasterplanFiltersModal = () => {

Apartment type

- {apartmentTypeCheckboxes.map((checkbox) => ( + {localApartmentTypeCheckboxes.map((checkbox) => ( {
- {multirangeSliders.map((slider) => ( + {localMultirangeSliders.map((slider) => (

{slider.title}

@@ -147,7 +161,7 @@ const MasterplanFiltersModal = () => {
))}
- {switchers.map((switcher) => ( + {localSwitchers.map((switcher) => (

{switcher.title}

@@ -158,7 +172,7 @@ const MasterplanFiltersModal = () => {

Views

- {viewCheckboxes.map((checkbox) => ( + {localViewCheckboxes.map((checkbox) => ( { +const MobileModalWrapper = ({ + children, + isHeightScreen = false, +}: MobileModalWrapperProps) => { const [isAnimate, setIsAnimate] = useState(false); useEffect(() => { @@ -30,8 +34,10 @@ const MobileModalWrapper = ({ children }: MobileModalWrapperProps) => { return (
{ + const { setModal } = useModal(); + const [isAnimate, setIsAnimate] = useState(false); + + const handleOnClose = () => { + if (setIsAnimate) { + setIsAnimate(false); + const timeout = setTimeout(() => { + setModal(null); + clearTimeout(timeout); + }, 300); + } + }; + + const handlers = useSwipeable({ + onSwipedDown: () => handleOnClose(), + }); + + useEffect(() => { + setIsAnimate(true); + }, []); + + return ( +
+
+

+ Rove Home Marasi Drive +

+

Skygarden

+
+
+
+ +
+
+
+

+ Skygarden +

+

22-23 floor

+
+
+ 17 amenties +
+
+
+
+ +
+
+
+
+ Indoor Amenties +
+ } + /> + } + /> + } /> +
+
+
+ Outdoor Amenties +
+ } /> + } + /> + } /> + } + /> + } + /> + } /> + } + /> + } + /> + } /> + } /> + } /> + } /> + } + /> + } + /> +
+
+ +
+ ); +}; + +export default SkygardenModal; diff --git a/client/src/components/modals/mobile/WingFloorModal.tsx b/client/src/components/modals/mobile/WingFloorModal.tsx index 011d72e..e0bcfad 100644 --- a/client/src/components/modals/mobile/WingFloorModal.tsx +++ b/client/src/components/modals/mobile/WingFloorModal.tsx @@ -1,11 +1,73 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { useSwipeable } from "react-swipeable"; import useModal from "../../../store/useModal"; import { useEffect, useState } from "react"; import MinusIcon from "../../icons/MinusIcon"; +import { IAparmentRes } from "../../../types/apartmentsRes"; +import { IDesctiptionFloor } from "../../../types/descriptionFloor"; +import { apartmentsWithoutVirtualTour } from "../../../consts/apartmentsWithoutVirtualTour"; +import EastWingHighlighting from "../../complexWingPage/FloorSidebar/EastWingHighlighting"; +import EastWingLayout from "../../complexWingPage/FloorSidebar/EastWingLayout"; +import WestWingHighlighting from "../../complexWingPage/FloorSidebar/WestWingHighlighting"; +import WestWingLayout from "../../complexWingPage/FloorSidebar/WestWingLayout"; +import WestWingTopLevelsHighlighting from "../../complexWingPage/FloorSidebar/WestWingTopLevelsHighlighting"; +import WestWingTopLevelsLayout from "../../complexWingPage/FloorSidebar/WestWingTopLevelsLayout"; +import { filterCurrentApartment } from "../../../calc/filterCurrentApartment"; +import MobileApartmentDescription from "../../complexWingPage/MobileApartmentDescription"; -const WingFloorModal = () => { +const getDefaultApartments = (currentFloor: IDesctiptionFloor | null) => { + if (!currentFloor) return []; + const defaultApartment: IAparmentRes[] = apartmentsWithoutVirtualTour.map( + (aprt, index) => { + const unitNo = `${currentFloor?.wing.slice(0, 1)}-${ + currentFloor.floor + }0${index}`; + return { + id: unitNo, + Floor: currentFloor.floor, + Property_Status: "Available", + Unit_Type: aprt.type, + Project_Name: "Rove Home Marasi Drive", + Suite_Area_Sqft: 0, + Balcony_Area_Sqft: 0, + No_Of_Bedrooms: 1, + Unit_No: unitNo, + Total_Area_Sqft: 0, + No_of_Bathrooms: 0, + Property_Name: "-", + Unit_View: "-", + }; + } + ); + + return defaultApartment; +}; + +interface WingFloorModalProps { + currentFloor: IDesctiptionFloor | null; + floorApartments: IAparmentRes[]; +} + +const WingFloorModal = ({ + currentFloor, + floorApartments, +}: WingFloorModalProps) => { const { setModal } = useModal(); const [isAnimate, setIsAnimate] = useState(false); + const [apartments, setApartments] = useState([]); + const [currentApartmentType, setCurrentApartmentType] = useState< + string | null + >(null); + const [currentApartment, setCurrentApartment] = useState( + null + ); + const [isDescVisible, setIsDescVisible] = useState(false); + const [mousePos, setMousePos] = useState([0, 0]); + const wing = + floorApartments.length > 0 && + floorApartments[0].Unit_No.split("-")[0] === "E" + ? "East Wing" + : "West Wing"; const handleOnClose = () => { if (setIsAnimate) { @@ -17,85 +79,194 @@ const WingFloorModal = () => { } }; + function handleOnApartmentClick( + event: React.MouseEvent + ) { + const apartmentType = event.currentTarget.dataset.type; + if (!apartmentType) { + return; + } + + setCurrentApartmentType(apartmentType); + + // const apartments = [ + // ...getDefaultApartments(currentFloor), + // ...floorApartments, + // ]; + // console.log("apartments", apartments); + + const apartment = filterCurrentApartment(apartments, apartmentType); + if (!apartment) return; + + setCurrentApartment(apartment); + setIsDescVisible(true); + } + const handlers = useSwipeable({ onSwipedDown: () => handleOnClose(), }); + function handleMouseClick( + event: React.MouseEvent | any + ) { + const isApartmentClicked = event.target.parentElement.dataset.type; + if (!isApartmentClicked) { + setIsDescVisible(false); + } else { + const scrollOffsetY = window.scrollY; + //detect mouse pos + const y = event.clientY - 65 + scrollOffsetY - 205; + const x = event.clientX - 50; + setMousePos([x, y]); + } + } + + useEffect(() => { + if (!currentFloor) return; + const defaultApartment: IAparmentRes[] = getDefaultApartments(currentFloor); + + setApartments([...defaultApartment, ...floorApartments]); + }, [currentFloor, currentFloor?.floor, currentFloor?.wing, floorApartments]); + useEffect(() => { setIsAnimate(true); }, []); + useEffect(() => { + window.addEventListener("mousemove", handleMouseClick); + return () => { + window.removeEventListener("mousemove", handleMouseClick); + }; + }, []); + return ( -
+ <>
-

- Rove Home Marasi Drive -

-

11 floor

-
-
+ {isDescVisible && ( +
+ +
+ )}
- +

+ Rove Home Marasi Drive +

+

{currentFloor?.floor} floor

-
-
-

- 11 floor -

-

East Wing

+
+
+
-
- 22 units -
-
-
-
11 floor
-
-
-
- 1 -
-

Studio flex

+
+
+

+ {currentFloor?.floor} floor +

+

{wing}

-
-
- 11 -
-

Studio

-
-
-
- 3 -
-

1 Bedroom

-
-
-
- 7 -
-

2 Bedroom

+
+ {floorApartments.length} units
-
-
-
- +
+
{currentFloor?.floor} floor
+
+
+
+ 1 +
+

Studio flex

+
+
+
+ 11 +
+

Studio

+
+
+
+ 3 +
+

1 Bedroom

+
+
+
+ 7 +
+

2 Bedroom

+
+
+
+
+ {currentFloor?.wing === "West Wing" ? ( + currentFloor && currentFloor.floor <= 21 ? ( + + + + + ) : ( + + + + + ) + ) : ( + + + + + )}
-
+ ); }; diff --git a/server/.env b/server/.env index 593a6d4..d1e6a69 100644 --- a/server/.env +++ b/server/.env @@ -1,2 +1,2 @@ -PORT=4002 +PORT=4003 REFRESH_TOKEN=1000.da3146d49fa8a399f0c635e74954ff9c.e010dbb1bb605d7e1aa5bf7fc0521f8b \ No newline at end of file