import { useQuery } from "@tanstack/react-query"; import { useState, useEffect, useRef } from "react"; import { Link, useSearch, useLocation } from "wouter"; import { Search, Play, FileText, ArrowLeft } from "lucide-react"; import { usePageMeta } from "@/hooks/use-page-meta"; import Header from "@/components/header"; interface SearchResult { articles: { id: number; title: string; slug: string; excerpt: string; coverImage: string; category: string; author: string; publishedAt: string; }[]; videos: { guid: string; title: string; description: string; thumbnail: string; embedUrl: string; }[]; } export default function SearchPage() { usePageMeta("Suche - Volksmusik & Schlager", "Durchsuchen Sie FOLX TV nach Volksmusik- und Schlager-Inhalten."); const searchString = useSearch(); const initialQuery = new URLSearchParams(searchString).get("q") || ""; const [query, setQuery] = useState(initialQuery); const [searchTerm, setSearchTerm] = useState(initialQuery); const debounceRef = useRef | null>(null); useEffect(() => { const q = new URLSearchParams(searchString).get("q") || ""; if (q && q !== searchTerm) { setQuery(q); setSearchTerm(q); } }, [searchString]); const handleQueryChange = (val: string) => { setQuery(val); if (debounceRef.current) clearTimeout(debounceRef.current); debounceRef.current = setTimeout(() => { if (val.trim().length >= 2) { setSearchTerm(val.trim()); } }, 500); }; const { data, isLoading } = useQuery({ queryKey: ["/api/search", searchTerm], queryFn: async () => { if (!searchTerm || searchTerm.length < 2) return { articles: [], videos: [] }; const resp = await fetch(`/api/search?q=${encodeURIComponent(searchTerm)}`); return resp.json(); }, enabled: searchTerm.length >= 2, }); const [, navigate] = useLocation(); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (debounceRef.current) clearTimeout(debounceRef.current); if (query.trim().length >= 2) { setSearchTerm(query.trim()); } }; const totalResults = (data?.articles?.length || 0) + (data?.videos?.length || 0); return (
handleQueryChange(e.target.value)} placeholder="Artikel, Videos, Künstler suchen..." className="w-full pl-12 pr-4 py-3 bg-card border border-card-border rounded-lg text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary text-base" autoFocus data-testid="input-search" />
{searchTerm.length >= 2 && (

{isLoading ? "Suche läuft..." : `${totalResults} Ergebnis${totalResults !== 1 ? "se" : ""} für "${searchTerm}"`}

)} {isLoading && (
{Array.from({ length: 4 }).map((_, i) => (
))}
)} {data && data.articles.length > 0 && (

Artikel ({data.articles.length})

{data.articles.map((article) => (
{article.coverImage && ( {article.title} )}
{article.category}

{article.title}

{article.excerpt}

))}
)} {data && data.videos.length > 0 && (

Videos ({data.videos.length})

)} {data && totalResults === 0 && searchTerm.length >= 2 && !isLoading && (

Keine Ergebnisse für "{searchTerm}" gefunden.

Versuchen Sie einen anderen Suchbegriff.

)}
); }