import { useQuery } from "@tanstack/react-query"; import { Link, useLocation, useSearch } from "wouter"; import { format } from "date-fns"; import { de } from "date-fns/locale"; import { usePageMeta } from "@/hooks/use-page-meta"; import { Play, ArrowLeft, ChevronLeft, ChevronRight } from "lucide-react"; import { Skeleton } from "@/components/ui/skeleton"; import Header from "@/components/header"; import Footer from "@/components/footer"; import { PageSideAds, TopBannerAd, MultiplexAd } from "@/components/adsense"; import { useEffect } from "react"; import type { YtVideo } from "@/pages/video-detail"; import { dauer } from "@/pages/video-detail"; interface YtResponse { items: YtVideo[]; total: number; page: number; totalPages: number; rubriken: string[]; } function VideoCard({ v }: { v: YtVideo }) { return (
{v.shortTitle}
{dauer(v.durationS)}
{v.rubrik}

{v.shortTitle}

{v.teaser && (

{v.teaser}

)}

{format(new Date(v.publishedAt), "d. MMMM yyyy", { locale: de })}

); } function CardSkeleton() { return (
); } export default function VideosPage() { usePageMeta( "Volksmusik & Schlager Videos", "Musik News, Interviews und FOLX STADL: alle Videos von FOLX TV auf einen Blick — Volksmusik, Schlager und die groessten Stars.", ); const searchString = useSearch(); const [, setLocation] = useLocation(); const params = new URLSearchParams(searchString); const currentPage = Math.max(1, parseInt(params.get("page") || "1")); const rubrik = params.get("rubrik") || "Alle"; const limit = 24; const { data, isLoading } = useQuery({ queryKey: [`/api/yt-videos?page=${currentPage}&limit=${limit}&rubrik=${encodeURIComponent(rubrik)}`], }); useEffect(() => { window.scrollTo({ top: 0, behavior: "smooth" }); }, [currentPage, rubrik]); const go = (page: number, r = rubrik) => { const q = new URLSearchParams(); if (r && r !== "Alle") q.set("rubrik", r); if (page > 1) q.set("page", String(page)); const qs = q.toString(); setLocation(qs ? `/videos?${qs}` : "/videos"); }; const totalPages = data?.totalPages || 1; const items = data?.items || []; const rubriken = ["Alle", ...(data?.rubriken || [])]; const pageNumbers = () => { const pages: (number | "...")[] = []; if (totalPages <= 7) { for (let i = 1; i <= totalPages; i++) pages.push(i); } else { pages.push(1); if (currentPage > 3) pages.push("..."); for (let i = Math.max(2, currentPage - 1); i <= Math.min(totalPages - 1, currentPage + 1); i++) pages.push(i); if (currentPage < totalPages - 2) pages.push("..."); pages.push(totalPages); } return pages; }; return (

Videos

{rubriken.length > 1 && (
{rubriken.map((r) => ( ))}
)} {isLoading ? (
{Array.from({ length: 8 }).map((_, i) => )}
) : items.length === 0 ? (

Zurzeit keine Videos in dieser Rubrik.

) : (
{items.map((v) => )}
)} {totalPages > 1 && (
{pageNumbers().map((p, i) => p === "..." ? ( … ) : ( ), )}
)}
); }