diff --git a/attached_assets/image_1772303671336.png b/attached_assets/image_1772303671336.png new file mode 100644 index 0000000..55ef282 Binary files /dev/null and b/attached_assets/image_1772303671336.png differ diff --git a/client/src/components/news-widget.tsx b/client/src/components/news-widget.tsx index 26d5fc1..8f80365 100644 --- a/client/src/components/news-widget.tsx +++ b/client/src/components/news-widget.tsx @@ -1,4 +1,5 @@ import { useQuery } from "@tanstack/react-query"; +import { useState, useEffect, useCallback } from "react"; import { Newspaper, ExternalLink } from "lucide-react"; interface NewsItem { @@ -8,21 +9,50 @@ interface NewsItem { pubDate: string; } +const VISIBLE_COUNT = 5; + export function NewsWidget() { const { data: news, isLoading } = useQuery({ queryKey: ["/api/news-feed"], }); + const [offset, setOffset] = useState(0); + const [paused, setPaused] = useState(false); + + const items = news || []; + const total = items.length; + + const advance = useCallback(() => { + if (total <= VISIBLE_COUNT) return; + setOffset((o) => (o + 1) % total); + }, [total]); + + useEffect(() => { + if (paused || total <= VISIBLE_COUNT) return; + const timer = setInterval(advance, 5000); + return () => clearInterval(timer); + }, [paused, advance, total]); + + const visible: NewsItem[] = []; + for (let i = 0; i < Math.min(VISIBLE_COUNT, total); i++) { + visible.push(items[(offset + i) % total]); + } + return ( -
+
setPaused(true)} + onMouseLeave={() => setPaused(false)} + data-testid="widget-news" + >

Musiknachrichten

-
- {(news || []).slice(0, 8).map((item, i) => ( +
+ {visible.map((item, i) => (
- {i < 4 &&
} + {i < VISIBLE_COUNT - 1 &&
} ))} {isLoading && ( -
- {Array.from({ length: 4 }).map((_, i) => ( +
+ {Array.from({ length: VISIBLE_COUNT }).map((_, i) => (
- {i < 3 &&
} + {i < VISIBLE_COUNT - 1 &&
}
))}
)} - {!isLoading && (!news || news.length === 0) && ( + {!isLoading && total === 0 && (

Keine Nachrichten verfügbar

)}