diff --git a/client/public/uploads/oberkrainer-geschichte-thumb.webp b/client/public/uploads/oberkrainer-geschichte-thumb.webp new file mode 100644 index 0000000..16b02ee Binary files /dev/null and b/client/public/uploads/oberkrainer-geschichte-thumb.webp differ diff --git a/client/public/uploads/oberkrainer-geschichte.jpg b/client/public/uploads/oberkrainer-geschichte.jpg new file mode 100644 index 0000000..943109d Binary files /dev/null and b/client/public/uploads/oberkrainer-geschichte.jpg differ diff --git a/client/public/uploads/oberkrainer-geschichte.webp b/client/public/uploads/oberkrainer-geschichte.webp new file mode 100644 index 0000000..b8d54aa Binary files /dev/null and b/client/public/uploads/oberkrainer-geschichte.webp differ diff --git a/client/src/App.tsx b/client/src/App.tsx index 12ba210..a8db4ad 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -7,6 +7,8 @@ import NotFound from "@/pages/not-found"; import Home from "@/pages/home"; import ArticlePage from "@/pages/article"; import CategoryPage from "@/pages/category"; +import VideosPage from "@/pages/videos"; +import VideoPage from "@/pages/video"; function Router() { return ( @@ -14,6 +16,8 @@ function Router() { + + ); diff --git a/client/src/pages/video.tsx b/client/src/pages/video.tsx new file mode 100644 index 0000000..8e03711 --- /dev/null +++ b/client/src/pages/video.tsx @@ -0,0 +1,104 @@ +import { useQuery } from "@tanstack/react-query"; +import { useParams, Link } from "wouter"; +import { format } from "date-fns"; +import { de } from "date-fns/locale"; +import { ArrowLeft, Clock } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; +import Header from "@/components/header"; +import Footer from "@/components/footer"; +import { useEffect } from "react"; + +interface BunnyVideo { + guid: string; + title: string; + length: number; + dateUploaded: string; + thumbnail: string; + embedUrl: string; +} + +function formatDuration(seconds: number): string { + const m = Math.floor(seconds / 60); + const s = seconds % 60; + return `${m}:${s.toString().padStart(2, "0")}`; +} + +export default function VideoPage() { + const { guid } = useParams<{ guid: string }>(); + + const { data: video, isLoading } = useQuery({ + queryKey: ["/api/videos", guid], + }); + + useEffect(() => { + window.scrollTo(0, 0); + }, [guid]); + + if (isLoading) { + return ( + + + + + + + + + + ); + } + + if (!video) { + return ( + + + + Video nicht gefunden. + + Zurück zu Videos + + + + ); + } + + return ( + + + + + + + Zurück + + + + + + + + + {video.title} + + + + + + {formatDuration(video.length)} + + + {format(new Date(video.dateUploaded), "d. MMMM yyyy", { locale: de })} + + + + + + ); +}
Video nicht gefunden.