import { useState, useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import { type Video } from "@shared/schema"; import VideoCard from "@/components/video-card"; import { Link } from "wouter"; import { Input } from "@/components/ui/input"; import { Search, Menu, X } from "lucide-react"; interface VideosResponse { videos: Video[]; total: number; hasMore: boolean; } export default function Home() { const [searchQuery, setSearchQuery] = useState(""); const [allVideos, setAllVideos] = useState([]); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); // Fetch videos with optimized loading const { data: videosResponse, isLoading, refetch } = useQuery({ queryKey: ["/api/videos", { limit: 150, offset: 0, search: searchQuery || undefined }], queryFn: async ({ queryKey }) => { const [, params] = queryKey as [string, any]; const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined) { searchParams.append(key, String(value)); } }); const response = await fetch(`/api/videos?${searchParams}`); if (!response.ok) { throw new Error('Failed to fetch videos'); } return response.json(); }, staleTime: 5 * 60 * 1000, gcTime: 10 * 60 * 1000, refetchOnWindowFocus: false, refetchOnReconnect: false }); // Update videos when new data comes in useEffect(() => { if (videosResponse) { setAllVideos(videosResponse.videos); } }, [videosResponse]); // Only refetch when search changes useEffect(() => { if (searchQuery !== undefined) { refetch(); } }, [searchQuery, refetch]); const handleVideoClick = (video: Video) => { window.location.href = `/video/${video.id}`; }; return (
{/* Header */}
{/* Logo */}

go4.video

{/* Navigation & Search */}
{/* Desktop navigation */}
setSearchQuery(e.target.value)} className="bg-white/10 border-white/20 text-white placeholder-white/50 w-64" />
{/* Mobile menu button */}
{/* Mobile Menu */} {isMobileMenuOpen && (
setSearchQuery(e.target.value)} className="bg-white/10 border-white/20 text-white placeholder-white/50 w-full" />
)}
{/* Main Content */}
{isLoading ? (
{Array.from({ length: 18 }).map((_, index) => (
))}
) : (
{allVideos.map((video) => ( ))}
)} {allVideos.length === 0 && !isLoading && (
Keine Videos gefunden
)}
); }