modal animation container

This commit is contained in:
2024-03-01 15:28:38 +05:00
parent df467b55e3
commit 193b43e0a1
15 changed files with 67 additions and 76 deletions
+4 -6
View File
@@ -1,11 +1,10 @@
import { Outlet } from "react-router-dom";
import useStore from "../store/store";
import { FullScreen, useFullScreenHandle } from "react-full-screen";
import { useEffect } from "react";
import ModalContainer from "./ModalContainer";
import { Outlet } from "react-router-dom";
import useStore from "../store/store";
const Layout = () => {
const { loader, setOnFullscreen } = useStore();
const { loader, setOnFullscreen, modal } = useStore();
const onFullscreenHandle = useFullScreenHandle();
useEffect(() => {
@@ -14,10 +13,9 @@ const Layout = () => {
return (
<FullScreen handle={onFullscreenHandle}>
{/* {modal} */}
{modal}
{loader}
<Outlet />
<ModalContainer />
</FullScreen>
);
};
+1 -1
View File
@@ -26,7 +26,7 @@ const LoaderModal = ({ isSimleLoader = false }: LoaderModalProps) => {
}, []);
return (
<div className="bg-[#F3F2F0] h-full w-full flex justify-center items-center flex-col fixed z-30">
<div className="bg-[#F3F2F0] h-full w-full flex justify-center items-center flex-col fixed z-50">
<LoadingIcon className="animate-spin w-16" />
{!isSimleLoader ? (
<div className="relative h-7 overflow-hidden">
+1 -1
View File
@@ -34,7 +34,7 @@ export const MapMediaLayer = ({
useEffect(() => {
const allVillasImage = new ImageElement({
image: "/images/map/Villas1.png",
image: "/images/map/Villas2.png",
georeference: new ExtentAndRotationGeoreference({
extent: extent,
}),
+1 -7
View File
@@ -94,18 +94,12 @@ type MapViewComponentProps = {
export const MapViewComponent = (props: MapViewComponentProps) => {
const { children, className } = props;
const { selectedOnMapVilla, setLoader, setModal, loader } = useStore();
const { selectedOnMapVilla, setLoader, setModal } = useStore();
const [isLoading, setIsLoading] = useState(true);
const [view, setView] = useState<__esri.MapView | undefined>();
const mapRef = useRef(null);
useEffect(() => {
// setLoader(<LoaderModal isSimleLoader />);
console.log("isLoading", isLoading);
console.log("loader", loader);
});
useEffect(() => {
if (isLoading) {
setLoader(<LoaderModal isSimleLoader />);
-32
View File
@@ -1,32 +0,0 @@
import { useEffect } from "react";
import useStore from "../store/store";
function ModalContainer() {
const { modal, modalAnimation, setModal } = useStore();
useEffect(() => {
if (modalAnimation !== 1) return;
const timeout = setTimeout(() => {
setModal(null);
}, 300);
return clearTimeout(timeout);
}, [modalAnimation]);
if (modal) {
return (
<div
className="fixed top-0 left-0 w-full h-full transition-all duration-500 ease-in-out"
style={{
transform: `translate(${modalAnimation * 100}vw, ${
-modalAnimation * 100
}vh)`,
}}
>
{modal}
</div>
);
}
}
export default ModalContainer;
@@ -11,6 +11,7 @@ import ControlHelpModal from "./ControlHelpModal/ControlHelpModal";
import LayoutModal from "./LayoutModal";
import ImagesModal from "./ImagesModal";
import PedestrianIcon from "../../../icons/Pedestrianicon";
import ModalAnimationContainer from "./ModalAnimationContainer";
type ButtonPanelProps = {
handleFullscreen: FullScreenHandle | null;
@@ -38,12 +39,20 @@ const ButtonPanel = ({ handleFullscreen }: ButtonPanelProps) => {
const handleOnLayoutClick = () => {
setModalAnimation(0);
setModal(<LayoutModal />);
setModal(
<ModalAnimationContainer>
<LayoutModal />
</ModalAnimationContainer>
);
};
const handleOnImagesClick = () => {
setModalAnimation(0);
setModal(<ImagesModal />);
setModal(
<ModalAnimationContainer>
<ImagesModal />
</ModalAnimationContainer>
);
};
return (
@@ -0,0 +1,34 @@
import { useEffect } from "react";
import useStore from "../../../store/store";
type ModalContainerProps = {
children: React.ReactNode;
};
function ModalAnimationContainer({ children }: ModalContainerProps) {
const { modalAnimation, setModal } = useStore();
useEffect(() => {
if (modalAnimation !== 1) return;
const timeout = setTimeout(() => {
setModal(null);
}, 300);
return clearTimeout(timeout);
}, [modalAnimation]);
return (
<div
className="fixed top-0 left-0 w-full h-full transition-all duration-500 ease-in-out z-20"
style={{
transform: `translate(${modalAnimation * 100}vw, ${
-modalAnimation * 100
}vh)`,
}}
>
{children}
</div>
);
}
export default ModalAnimationContainer;
+15 -12
View File
@@ -1,22 +1,25 @@
import HouseItem from "./HouseItem";
import { VILLAS } from "../../../consts/villas";
const enableVillas = ["a1t", "a1m", "b2t", "b2m"];
const HouseList = () => {
return (
<div className="max-h-screen overflow-y-scroll">
<div className="flex flex-col gap-2 p-4">
{VILLAS.map((villa) => {
return (
<HouseItem
villa={villa}
key={villa.type}
isDisable={!enableVillas.includes(villa.type)}
/>
);
})}
<>
<div className="max-h-screen overflow-y-scroll">
<div className="flex flex-col gap-2 p-4">
{VILLAS.map((villa) => {
return (
<HouseItem
villa={villa}
key={villa.type}
isDisable={!enableVillas.includes(villa.type)}
/>
);
})}
</div>
</div>
</div>
</>
);
};