This commit is contained in:
2024-07-26 17:38:47 +05:00
parent b3e6ff5e9c
commit 08b86c8b51
14 changed files with 520 additions and 298 deletions
@@ -1,25 +1,21 @@
interface Props {
handleMouseOver: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
handleMouseOut: () => void;
handleClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseEnter: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseLeave: () => void;
onClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
}
function EastWingFloorLayout({
handleMouseOver,
handleMouseOut,
handleClick,
}: Props) {
function onMouseEnter(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
function EastWingFloorLayout({ onMouseEnter, onMouseLeave, onClick }: Props) {
// function onMouseEnter(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
handleMouseOver(e);
}
// handleMouseOver(e);
// }
function onMouseLeave(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
// function onMouseLeave(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
handleMouseOut();
}
// handleMouseOut();
// }
return (
<svg
@@ -1276,7 +1272,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={2}
@@ -1289,7 +1285,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={3}
@@ -1302,7 +1298,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={4}
@@ -1315,7 +1311,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={5}
@@ -1328,7 +1324,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={6}
@@ -1341,7 +1337,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={7}
@@ -1354,7 +1350,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={8}
@@ -1367,7 +1363,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={16}
@@ -1380,7 +1376,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={15}
@@ -1393,7 +1389,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={14}
@@ -1406,7 +1402,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={13}
@@ -1419,7 +1415,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={12}
@@ -1432,7 +1428,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={11}
@@ -1445,7 +1441,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={10}
@@ -1458,7 +1454,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
<path
data-number={9}
@@ -1471,7 +1467,7 @@ function EastWingFloorLayout({
className="cursor-pointer transition-colors"
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={handleClick}
onClick={onClick}
/>
</g>
</g>
@@ -1,4 +1,4 @@
import { useState, useEffect, useRef } from "react";
import { useState } from "react";
import { IDesctiptionFloor } from "../../../types/descriptionFloor";
import useModal from "../../../store/useModal";
import EastWingFloorLayout from "./EastWingFloorLayout";
@@ -18,9 +18,9 @@ interface Props {
function FloorSidebar({ currentFloor }: Props) {
const { setModal } = useModal();
const descRef = useRef(null);
const { setIsSidebar } = useWingSidebar();
const [hoveredUnit, setHoveredUnit] = useState<IUnit | null>(null);
const [hoveredUnit, setHoveredUnit] = useState<IUnit | undefined>();
const [isShowPopup, setIsShowPopup] = useState(false);
const [mousePos, setMousePos] = useState<[number, number]>([0, 0]);
const [type, setType] = useState<string | null>(null);
@@ -42,19 +42,27 @@ function FloorSidebar({ currentFloor }: Props) {
}
}
function handleOnMouseOver(e: React.MouseEvent<SVGPathElement>) {
function handleMouseMove(e: React.MouseEvent<HTMLDivElement>) {
const x = e.clientX - e.currentTarget.getBoundingClientRect().left;
const y = e.clientY - e.currentTarget.getBoundingClientRect().top;
setMousePos([x, y]);
}
async function handleMouseEnter(e: React.MouseEvent<SVGPathElement>) {
const unitNumber = e.currentTarget.dataset.number;
const type = e.currentTarget.dataset.type;
if (!unitNumber || !type) return;
setType(type);
console.log("type", type);
getUnit(unitNumber);
setType(type);
setIsShowPopup(true);
setHoveredUnit(hoveredUnit);
}
function handleOnMouseOut() {
setHoveredUnit(null);
function handleMouseLeave() {
setIsShowPopup(false);
setHoveredUnit(undefined);
}
function handleClick() {
@@ -63,94 +71,81 @@ function FloorSidebar({ currentFloor }: Props) {
setModal(<UnitModal unit={hoveredUnit} type={type} />);
}
function handleMouseMove(e: MouseEvent) {
const x = e.clientX - window.innerWidth / 2 - 360;
const y = e.clientY - 78;
setMousePos([x, y]);
}
useEffect(() => {
window.addEventListener("mousemove", handleMouseMove);
return () => {
window.removeEventListener("mousemove", handleMouseMove);
};
}, []);
return (
<>
<div
ref={descRef}
className="absolute w-full h-[calc(100vh-56px)] right-0 z-30 bg-[#F3F3F2] p-6 top-[56px] flex flex-col"
>
<div className="flex justify-between pb-4">
<div className="flex flex-col">
<h1 className="text-subheadline-m font-semibold text-[#0D1922]">
{currentFloor?.floor} Floor
</h1>
<p className="text-s text-[#73787C]">{currentFloor?.wing}</p>
</div>
<Button
buttonType="cta"
icon={<CloseIcon />}
onClick={() => setIsSidebar(false)}
/>
<div
className="absolute w-full h-[calc(100vh-56px)] right-0 z-30 bg-[#F3F3F2] p-6 top-[56px] flex flex-col"
onMouseMove={handleMouseMove}
>
<div className="flex justify-between pb-4">
<div className="flex flex-col">
<h1 className="text-subheadline-m font-semibold text-[#0D1922]">
{currentFloor?.floor} Floor
</h1>
<p className="text-s text-[#73787C]">{currentFloor?.wing}</p>
</div>
<div className="px-4 py-[18px] bg-white flex justify-between text-[#73787C] font-semibold text-caption-m rounded-2xl mb-2">
<div className="flex gap-6">
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#A19E9E] w-3 h-3"></div>
<p>Studio Flex</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#8299AD] w-3 h-3"></div>
<p>Studio</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#A19E9E] w-3 h-3"></div>
<p>1 Bedroom</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#BFC9D1] w-3 h-3"></div>
<p>1 Bedroom</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#B2B8C4] w-3 h-3"></div>
<p>2 Bedroom</p>
</div>
<Button
buttonType="cta"
icon={<CloseIcon />}
onClick={() => setIsSidebar(false)}
/>
</div>
<div className="px-4 py-[18px] bg-white flex justify-between text-[#73787C] font-semibold text-caption-m rounded-2xl mb-2">
<div className="flex gap-6">
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#A19E9E] w-3 h-3"></div>
<p>Studio Flex</p>
</div>
{/* <div className="bg-[#00BED7] text-white text-s px-2 py-[3px] rounded-3xl flex h-fit">
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#8299AD] w-3 h-3"></div>
<p>Studio</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#A19E9E] w-3 h-3"></div>
<p>1 Bedroom</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#BFC9D1] w-3 h-3"></div>
<p>1 Bedroom</p>
</div>
<div className="gap-2 flex items-center">
<div className="rounded-full bg-[#B2B8C4] w-3 h-3"></div>
<p>2 Bedroom</p>
</div>
</div>
{/* <div className="bg-[#00BED7] text-white text-s px-2 py-[3px] rounded-3xl flex h-fit">
{floorApartments.length} units
</div> */}
</div>
<svg className="flex-1 px-10 bg-white font-semibold text-caption-m rounded-2xl py-4">
{currentFloor?.wing === "West Wing" ? (
currentFloor && currentFloor.floor <= 21 ? (
<WestWingBottomFloorLayout
handleMouseOver={handleOnMouseOver}
handleMouseOut={handleOnMouseOut}
handleClick={handleClick}
/>
) : (
<WestWingFloorLayout
handleMouseOver={handleOnMouseOver}
handleMouseOut={handleOnMouseOut}
handleClick={handleClick}
/>
)
) : (
<EastWingFloorLayout
handleMouseOver={handleOnMouseOver}
handleMouseOut={handleOnMouseOut}
handleClick={handleClick}
/>
)}
</svg>
</div>
<UnitPopup unit={hoveredUnit} type={type} mousePos={mousePos} />
</>
<svg className="flex-1 px-10 bg-white font-semibold text-caption-m rounded-2xl py-4">
{currentFloor?.wing === "West Wing" ? (
currentFloor && currentFloor.floor <= 21 ? (
<WestWingBottomFloorLayout
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
onClick={handleClick}
/>
) : (
<WestWingFloorLayout
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
onClick={handleClick}
/>
)
) : (
<EastWingFloorLayout
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
onClick={handleClick}
/>
)}
</svg>
<UnitPopup
unit={hoveredUnit}
type={type}
isShowPopup={isShowPopup}
mousePos={mousePos}
/>
</div>
);
}
@@ -3,27 +3,25 @@ import VirtualTourIcon from "../../icons/VirtualTourIcon";
import unitTypes from "../../../data/unitTypes.json";
interface Props {
unit: IUnit | null;
unit: IUnit | undefined;
type: string | null;
isShowPopup: boolean;
mousePos: [number, number];
}
function UnitPopup({ unit, type, mousePos }: Props) {
function UnitPopup({ unit, type, isShowPopup, mousePos }: Props) {
return (
<div
className={`absolute top-0 left-0 w-[344px] h-[156px] z-30 p-6 space-y-4 bg-white rounded-2xl shadow-lg transition-opacity pointer-events-none ${
unit ? "opacity-100" : "opacity-0"
className={`absolute top-0 left-0 w-[344px] h-[156px] z-30 p-6 space-y-4 bg-white rounded-2xl shadow-lg pointer-events-none -translate-x-[calc(100%+16px)] -translate-y-[50%] transition-opacity ${
isShowPopup ? "opacity-100" : "opacity-0"
}`}
style={{
top: `${mousePos[1]}px`,
left: `${mousePos[0]}px`,
}}
style={{ top: `${mousePos[1]}px`, left: `${mousePos[0]}px` }}
>
{unit && type ? (
<>
<div className="pb-4 border-b border-[#E2E2DC] space-y-1">
<p className="text-xl text-[#0D1922] font-semibold">
{unit.unitType}, {unit.totalArea} Sqft
{unit.unitName}, {unit.totalArea} Sqft
</p>
<div className="text-xs font-semibold flex items-center gap-2">
<p>{unit.unitNo[0] === "E" ? "East" : "West"} Wing</p>
@@ -1,33 +1,28 @@
import { useRef } from "react";
interface Props {
handleMouseOver: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
handleMouseOut: () => void;
handleClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseEnter: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseLeave: () => void;
onClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
}
function WestWingBottomFloorLayout({
handleMouseOver,
handleMouseOut,
handleClick,
onMouseEnter,
onMouseLeave,
onClick,
}: Props) {
const ref = useRef<SVGSVGElement>(null);
// function onMouseOver(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
function onMouseOver(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
// handleMouseOver(e);
// }
handleMouseOver(e);
}
// function onMouseOut(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
function onMouseOut(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
handleMouseOut();
}
// handleMouseOut();
// }
return (
<svg
ref={ref}
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 619.96 570.52"
className="w-full h-full"
@@ -1436,9 +1431,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={6}
@@ -1449,9 +1444,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={5}
@@ -1462,9 +1457,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={4}
@@ -1475,9 +1470,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={3}
@@ -1488,9 +1483,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={2}
@@ -1501,9 +1496,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={1}
@@ -1515,9 +1510,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={8}
@@ -1529,9 +1524,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={9}
@@ -1542,9 +1537,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={10}
@@ -1555,9 +1550,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={11}
@@ -1568,9 +1563,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={12}
@@ -1581,9 +1576,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={13}
@@ -1594,9 +1589,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={14}
@@ -1607,9 +1602,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={15}
@@ -1620,9 +1615,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={16}
@@ -1633,9 +1628,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={17}
@@ -1646,9 +1641,9 @@ function WestWingBottomFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
</g>
</g>
@@ -1,25 +1,21 @@
interface Props {
handleMouseOver: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
handleMouseOut: () => void;
handleClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseEnter: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
onMouseLeave: () => void;
onClick: (e: React.MouseEvent<SVGPathElement, MouseEvent>) => void;
}
function WestWingFloorLayout({
handleMouseOver,
handleMouseOut,
handleClick,
}: Props) {
function onMouseOver(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
function WestWingFloorLayout({ onMouseEnter, onMouseLeave, onClick }: Props) {
// function onMouseOver(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(0, 190, 215, .25)";
handleMouseOver(e);
}
// handleMouseOver(e);
// }
function onMouseOut(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
// function onMouseOut(e: React.MouseEvent<SVGPathElement, MouseEvent>) {
// e.currentTarget.style.fill = "rgba(255, 255, 255, 0)";
handleMouseOut();
}
// handleMouseOut();
// }
return (
<svg
@@ -1273,9 +1269,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={6}
@@ -1286,9 +1282,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={5}
@@ -1299,9 +1295,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={4}
@@ -1312,9 +1308,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={3}
@@ -1325,9 +1321,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={2}
@@ -1338,9 +1334,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={1}
@@ -1352,9 +1348,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={8}
@@ -1366,9 +1362,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={9}
@@ -1379,9 +1375,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={10}
@@ -1392,9 +1388,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={11}
@@ -1405,9 +1401,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={12}
@@ -1418,9 +1414,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={13}
@@ -1431,9 +1427,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={14}
@@ -1444,9 +1440,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
<path
data-number={15}
@@ -1457,9 +1453,9 @@ function WestWingFloorLayout({
strokeWidth: 0,
}}
className="cursor-pointer transition-colors"
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onClick={handleClick}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
</g>
</g>
+33
View File
@@ -0,0 +1,33 @@
interface Props {
className?: string;
}
function ShareIcon({ className }: Props) {
return (
<svg
width={24}
height={24}
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
d="M19 14.875L19 16C19 17.6569 17.6569 19 16 19L8.00002 19C6.34316 19 5.00001 17.6568 5.00002 16L5.00009 7.99998C5.0001 6.34313 6.34324 5 8.00009 5L9.12494 5"
stroke="currentColor"
strokeWidth={1.5}
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M13.5 10.5L18.8502 5M18.8502 5V10.4M18.8502 5H13.4502"
stroke="currentColor"
strokeWidth={1.5}
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
export default ShareIcon;
+26 -5
View File
@@ -7,10 +7,11 @@ import BookingIcon from "../icons/BookingIcon";
import HeartIcon from "../icons/HeartIcon";
import VirtualTourIcon from "../icons/VirtualTourIcon";
import unitTypes from "../../data/unitTypes.json";
import { useNavigate } from "react-router-dom";
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
import { useEffect } from "react";
import useFavoritesStore from "../../store/useFavoritesStore";
import HeartFilledIcon from "../icons/HeartFilledIcon";
import ShareIcon from "../icons/ShareIcon";
interface Props {
unit: IUnit;
@@ -21,6 +22,8 @@ function UnitModal({ unit, type }: Props) {
const { setModal } = useModal();
const navigate = useNavigate();
const { favoriteUnits, setFavoriteUnits } = useFavoritesStore();
const [searchParams, setSearchParams] = useSearchParams();
const location = useLocation();
function getViewImage(): string {
const unitView = unit.unitView;
@@ -190,11 +193,15 @@ function UnitModal({ unit, type }: Props) {
}
useEffect(() => {
console.log("type", type);
searchParams.set("unitNo", unit.unitNo);
setSearchParams(searchParams);
document.body.classList.add("overflow-y-hidden");
return () => {
searchParams.delete("unitNo");
setSearchParams(searchParams);
document.body.classList.remove("overflow-y-hidden");
};
}, []);
@@ -221,7 +228,19 @@ function UnitModal({ unit, type }: Props) {
}
</p>
</div>
<div className="">
<div className="flex gap-2">
<button
className="w-10 h-10 flex items-center justify-center border border-[#E2E2DC] rounded-full bg-[#FFFFFF] bg-opacity-80 hover:text-[#0D1922] hover:bg-opacity-100 hover:border-[#00BED7] transition-all"
onClick={() =>
navigator.share({
title: "IRTH",
text: `${unit.unitNo}`,
url: `/search${location.search}`,
})
}
>
<ShareIcon className="w-5 h-5" />
</button>
<button
className="w-10 h-10 flex items-center justify-center border border-[#E2E2DC] rounded-full bg-[#FFFFFF] bg-opacity-80 hover:text-[#0D1922] hover:bg-opacity-100 hover:border-[#00BED7] transition-all"
onClick={() => addOrRemoveFromFavorites(unit)}
@@ -277,7 +296,7 @@ function UnitModal({ unit, type }: Props) {
<div className="bg-white p-6 rounded-2xl space-y-6">
<div className="space-y-2 border-b border-[E2E2DC] pb-4">
<p className="text-xl text-[#0D1922] font-semibold">
{unit.unitType}, {unit.totalArea} Sqft
{unit.unitName}, {unit.totalArea} Sqft
</p>
<div className="">
<p className="text-sm text-[#00BED7]">
@@ -337,7 +356,9 @@ function UnitModal({ unit, type }: Props) {
icon={<VirtualTourIcon />}
text="3D tour"
className="justify-center text-sm w-full"
onClick={() => navigate(`/virtual-tour/${type}?unitNo=${unit.unitNo}`)}
onClick={() =>
navigate(`/virtual-tour/${type}?unitNo=${unit.unitNo}`)
}
/>
)}
<Button
@@ -7,10 +7,11 @@ import BookingIcon from "../icons/BookingIcon";
import HeartIcon from "../icons/HeartIcon";
import VirtualTourIcon from "../icons/VirtualTourIcon";
import unitTypes from "../../data/unitTypes.json";
import { useNavigate } from "react-router-dom";
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
import { useEffect } from "react";
import useFavoritesStore from "../../store/useFavoritesStore";
import HeartFilledIcon from "../icons/HeartFilledIcon";
import ShareIcon from "../icons/ShareIcon";
interface Props {
unit: IUnit;
@@ -21,6 +22,8 @@ function UnitModalForSearchPage({ unit, type }: Props) {
const { setModal } = useModal();
const navigate = useNavigate();
const { favoriteUnits, setFavoriteUnits } = useFavoritesStore();
const [searchParams, setSearchParams] = useSearchParams();
const location = useLocation();
function getViewImage(): string {
const unitView = unit.unitView;
@@ -190,9 +193,15 @@ function UnitModalForSearchPage({ unit, type }: Props) {
}
useEffect(() => {
searchParams.set("unitNo", unit.unitNo);
setSearchParams(searchParams);
document.body.classList.add("overflow-y-hidden");
return () => {
searchParams.delete("unitNo");
setSearchParams(searchParams);
document.body.classList.remove("overflow-y-hidden");
};
}, []);
@@ -219,7 +228,19 @@ function UnitModalForSearchPage({ unit, type }: Props) {
}
</p>
</div>
<div className="">
<div className="flex gap-2">
<button
className="w-10 h-10 flex items-center justify-center border border-[#E2E2DC] rounded-full bg-[#FFFFFF] bg-opacity-80 hover:text-[#0D1922] hover:bg-opacity-100 hover:border-[#00BED7] transition-all"
onClick={() =>
navigator.share({
title: "IRTH",
text: `${unit.unitNo}`,
url: location.hash,
})
}
>
<ShareIcon className="w-5 h-5" />
</button>
<button
className="w-10 h-10 flex items-center justify-center border border-[#E2E2DC] rounded-full bg-[#FFFFFF] bg-opacity-80 hover:text-[#0D1922] hover:bg-opacity-100 hover:border-[#00BED7] transition-all"
onClick={() => addOrRemoveFromFavorites(unit)}
@@ -275,7 +296,7 @@ function UnitModalForSearchPage({ unit, type }: Props) {
<div className="bg-white p-6 rounded-2xl space-y-6">
<div className="space-y-2 border-b border-[E2E2DC] pb-4">
<p className="text-xl text-[#0D1922] font-semibold">
{unit.unitType}, {unit.totalArea} Sqft
{unit.unitName}, {unit.totalArea} Sqft
</p>
<div className="">
<p className="text-sm text-[#00BED7]">
@@ -182,7 +182,7 @@ function VirtualTourCard({ unit, type }: Props) {
onClick={() => navigate(-1)}
/>
<p className="font-[#0D1922] font-semibold">
{unit.unitType}, {unit.totalArea} Sqft
{unit.unitName}, {unit.totalArea} Sqft
</p>
</div>
<div>
+36 -27
View File
@@ -13,6 +13,7 @@ import unitTypes from "../data/unitTypes.json";
import UnitModalForSearchPage from "../components/modals/UnitModalForSearchPage";
import useFavoritesStore from "../store/useFavoritesStore";
import HeartFilledIcon from "../components/icons/HeartFilledIcon";
import { useSearchParams } from "react-router-dom";
function SearchPage2() {
const [units, setUnits] = useState<IUnit[]>([]);
@@ -34,6 +35,7 @@ function SearchPage2() {
const [isSortPriceAsc, setIsSortPriceAsc] = useState<boolean | undefined>();
const { setModal } = useModal();
const { favoriteUnits, setFavoriteUnits } = useFavoritesStore();
const [searchParams, setSearchParams] = useSearchParams();
async function getUnits() {
try {
@@ -245,6 +247,22 @@ function SearchPage2() {
}
}
function handleClickCard(unit: IUnit) {
setModal(
<UnitModalForSearchPage
unit={unit}
type={
unitTypes.find(
(unitType) => unitType.type === getTypeByUnitNo(unit.unitNo)
)?.type || ""
}
/>
);
searchParams.set("unitNo", unit.unitNo);
setSearchParams(searchParams);
}
useEffect(() => {
let newFilteredUnits = units
.filter((unit) =>
@@ -363,6 +381,21 @@ function SearchPage2() {
getUnits();
}, []);
useEffect(() => {
if (searchParams.has("unitNo")) {
const unitNo = searchParams.get("unitNo");
if (!unitNo) return;
const type = getTypeByUnitNo(unitNo);
const unit = units.find((unit) => unit.unitNo === unitNo);
if (!unit) return;
setModal(<UnitModalForSearchPage unit={unit} type={type} />);
}
}, [units]);
return (
<div className="pt-[58px] flex select-none">
<div className="p-6 min-w-[360px] w-[360px] space-y-6 border-r border-[#E2E2DC]">
@@ -830,19 +863,7 @@ function SearchPage2() {
</div>
<div
className="flex justify-center cursor-pointer"
onClick={() =>
setModal(
<UnitModalForSearchPage
unit={unit}
type={
unitTypes.find(
(unitType) =>
unitType.type === getTypeByUnitNo(unit.unitNo)
)?.type || ""
}
/>
)
}
onClick={() => handleClickCard(unit)}
>
<img
src={getImageSrc(unit.unitNo)}
@@ -852,22 +873,10 @@ function SearchPage2() {
</div>
<div
className="space-y-1 cursor-pointer"
onClick={() =>
setModal(
<UnitModalForSearchPage
unit={unit}
type={
unitTypes.find(
(unitType) =>
unitType.type === getTypeByUnitNo(unit.unitNo)
)?.type || ""
}
/>
)
}
onClick={() => handleClickCard(unit)}
>
<p className="text-sm">
{unit.unitType}, {unit.totalArea} Sqft
{unit.unitName}, {unit.totalArea} Sqft
</p>
<p className="text-xl text-[#00BED7] font-semibold">
{(unit.unitPrice &&
+1
View File
@@ -15,6 +15,7 @@ interface IUnit {
bathrooms: number;
parkingSpaces: number;
unitPrice?: number;
unitName: string;
}
export default IUnit;
+2
View File
@@ -10,6 +10,7 @@ import apartmentRoute from "./routes/apartment.js";
import apartmentsRoute from "./routes/apartments.js";
import updateAccessToken from "./routes/zohoAccessToken.js";
import unitsRoute from "./routes/unitsRoute.js";
import updateApartments2Route from "./routes/updateApartments2Route.js";
// import updateApartmentsRoute from "./routes/updateApartmentsRoute.js";
const __filename = fileURLToPath(import.meta.url);
@@ -35,6 +36,7 @@ app.use("/apartment", apartmentRoute);
app.use("/updateAccessToken", updateAccessToken);
app.use("/units", unitsRoute);
// app.use("/update-apartments", updateApartmentsRoute);
// app.use("/update-apartments-2", updateApartments2Route);
app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
+3
View File
@@ -47,6 +47,9 @@ const unitSchema = new Schema(
unitPrice: {
type: Number,
},
unitName: {
type: String,
},
},
{
timestamps: true,
+152
View File
@@ -0,0 +1,152 @@
import { Router } from "express";
import Unit from "../models/Unit.js";
function getUnitName(unit: any): string {
const side = unit.unitNo[0];
const floor = Number(unit.floor);
const unitNumber = Number(unit.unitNo.split("-")[1].slice(-2));
if (side === "W") {
if (floor < 24) {
switch (unitNumber) {
case 1:
return "2 Bedroom²";
case 2:
return "Studio²";
case 3:
return "1 Bedroom²";
case 4:
return "Studio²";
case 5:
return "Studio²";
case 6:
return "1 Bedroom²";
case 7:
return "1 Bedroom²";
case 8:
return "1 Bedroom²";
case 9:
return "Studio Flex";
case 10:
return "Studio Flex";
case 11:
return "Studio Flex";
case 12:
return "Studio Flex";
case 13:
return "Studio Flex";
case 14:
return "Studio Flex";
case 15:
return "1 Bedroom²";
case 16:
return "1 Bedroom²";
case 17:
return "2 Bedroom²";
}
} else {
switch (unitNumber) {
case 1:
return "2 Bedroom²";
case 2:
return "Studio²";
case 3:
return "1 Bedroom²";
case 4:
return "Studio²";
case 5:
return "Studio²";
case 6:
return "1 Bedroom²";
case 7:
return "1 Bedroom²";
case 8:
return "1 Bedroom²";
case 9:
return "1 Bedroom²";
case 10:
return "Studio²";
case 11:
return "Studio²";
case 12:
return "1 Bedroom²";
case 13:
return "1 Bedroom²";
case 14:
return "1 Bedroom²";
case 15:
return "2 Bedroom²";
}
}
} else {
switch (unitNumber) {
case 1:
return "2 Bedroom²";
case 2:
return "Studio²";
case 3:
return "1 Bedroom²";
case 4:
return "Studio²";
case 5:
return "Studio²";
case 6:
return "1 Bedroom²";
case 7:
return "1 Bedroom²";
case 8:
return "1 Bedroom²";
case 9:
return "1 Bedroom²";
case 10:
return "1 Bedroom²";
case 11:
return "Studio²";
case 12:
return "Studio²";
case 13:
return "Studio²";
case 14:
return "Studio²";
case 15:
return "1 Bedroom²";
case 16:
return "1 Bedroom²";
}
}
console.log(side, floor, unitNumber);
return "";
}
const router = Router();
router.get("/", async (req, res) => {
const units = await Unit.find({});
for (const unit of units) {
const unitName = getUnitName(unit);
const updatedUnit = await Unit.findByIdAndUpdate(
unit.id,
{ unitName },
{ new: true }
);
console.log("updatedUnit", updatedUnit);
}
// const file = fs.readFileSync(
// path.resolve("./src/data/irth_unit_pirces.json"),
// { encoding: "utf8" }
// );
// const data = JSON.parse(file);
res.json({ ok: 1 });
});
const updateApartmentsRoute = router;
export default updateApartmentsRoute;