diff --git a/src/components/PrefetchedImage.tsx b/src/components/PrefetchedImage.tsx
new file mode 100644
index 0000000..c6d520d
--- /dev/null
+++ b/src/components/PrefetchedImage.tsx
@@ -0,0 +1,22 @@
+import { useState, useEffect } from "react";
+import ImageSkeleton from "./ui/Skeletons/ImageSkeleton";
+
+interface PrefetchedImageProps {
+ src: string;
+ alt: string;
+ className?: string;
+}
+
+export default function PrefetchedImage({ src, alt, className }: PrefetchedImageProps) {
+ const [loaded, setLoaded] = useState(false);
+
+ useEffect(() => {
+ const img = new Image();
+ img.src = src;
+ img.onload = () => setLoaded(true);
+ }, [src]);
+
+ if (!loaded) return
+
+ return
;
+}
\ No newline at end of file
diff --git a/src/components/ui/Skeletons/ImageSkeleton.tsx b/src/components/ui/Skeletons/ImageSkeleton.tsx
new file mode 100644
index 0000000..22ae4ca
--- /dev/null
+++ b/src/components/ui/Skeletons/ImageSkeleton.tsx
@@ -0,0 +1,27 @@
+import { Skeleton } from "@/components/ui/skeleton";
+import { useTheme } from "@/contexts/ThemeContext";
+
+export default function SkeletonCard() {
+ const { theme } = useTheme();
+
+ const skeletonColor = theme === "light" ? "bg-gray-300" : "bg-gray-700";
+ const bgGradient =
+ theme === "light"
+ ? "bg-gradient-to-r from-white to-gray-200"
+ : "bg-gradient-to-r from-gray-900 to-gray-700";
+
+ return (
+
+
+
+ );
+}
diff --git a/src/pages/SkeletonCard.tsx b/src/components/ui/Skeletons/SkeletonCard.tsx
similarity index 100%
rename from src/pages/SkeletonCard.tsx
rename to src/components/ui/Skeletons/SkeletonCard.tsx
diff --git a/src/hooks/useImagePrefetch.ts b/src/hooks/useImagePrefetch.ts
new file mode 100644
index 0000000..9127a8e
--- /dev/null
+++ b/src/hooks/useImagePrefetch.ts
@@ -0,0 +1,10 @@
+import { useEffect } from "react";
+
+export function useImagePrefetch(urls: string[]) {
+ useEffect(() => {
+ urls.forEach((src) => {
+ const img = new Image();
+ img.src = src;
+ });
+ }, [urls]);
+}
diff --git a/src/layouts/MainLayout.tsx b/src/layouts/MainLayout.tsx
index d45410f..27a8c34 100644
--- a/src/layouts/MainLayout.tsx
+++ b/src/layouts/MainLayout.tsx
@@ -3,7 +3,8 @@ import Footer from "@/components/Footer";
import { Outlet, useLocation } from "react-router-dom";
import { ThemeProvider } from "@/contexts/ThemeContext";
import { Suspense, useEffect } from "react";
-import SkeletonCard from "@/pages/SkeletonCard";
+import { useImagePrefetch } from "@/hooks/useImagePrefetch";
+import SkeletonCard from "@/components/ui/Skeletons/SkeletonCard";
function ScrollToTop() {
const { pathname } = useLocation();
@@ -14,6 +15,15 @@ function ScrollToTop() {
}
function MainLayout() {
+ useImagePrefetch([
+ "/svg/pagessvg/bookingpage.svg",
+ "/svg/pagessvg/buspage.svg",
+ "/svg/pagessvg/trainpage.svg",
+ "/svg/pagessvg/hotelpage.svg",
+ "/svg/pagessvg/holidaypage.svg",
+ "/svg/pagessvg/flightpage.svg",
+ "/svg/pagessvg/cabpage.svg",
+ ]);
return (
diff --git a/src/pages/Booking.tsx b/src/pages/Booking.tsx
index 1ae5637..95111d5 100644
--- a/src/pages/Booking.tsx
+++ b/src/pages/Booking.tsx
@@ -1,3 +1,4 @@
+import PrefetchedImage from "@/components/PrefetchedImage";
import { useTheme } from "@/contexts/ThemeContext";
export default function Booking() {
@@ -13,7 +14,7 @@ export default function Booking() {
}`}
>
-