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 {alt}; +} \ 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() { }`} >
- Manage Booking
- Bus Booking
- Cab Service
- Flight Booking
- Holiday planning
- Hotel Booking
-