diff --git a/public/images/players/herren1/carousel/carousel1.jpg b/public/images/players/herren1/carousel/carousel1.jpg deleted file mode 100644 index 6f6c4832e..000000000 Binary files a/public/images/players/herren1/carousel/carousel1.jpg and /dev/null differ diff --git a/public/images/players/herren1/carousel/carousel2.jpg b/public/images/players/herren1/carousel/carousel2.jpg deleted file mode 100644 index 17084c5c0..000000000 Binary files a/public/images/players/herren1/carousel/carousel2.jpg and /dev/null differ diff --git a/public/images/players/herren1/carousel/carousel3.jpg b/public/images/players/herren1/carousel/carousel3.jpg deleted file mode 100644 index d234715e0..000000000 Binary files a/public/images/players/herren1/carousel/carousel3.jpg and /dev/null differ diff --git a/public/images/players/herren1/carousel/carousel4.jpg b/public/images/players/herren1/carousel/carousel4.jpg deleted file mode 100644 index 0ab70eb34..000000000 Binary files a/public/images/players/herren1/carousel/carousel4.jpg and /dev/null differ diff --git a/public/images/players/herren1/carousel/carousel5.jpg b/public/images/players/herren1/carousel/carousel5.jpg deleted file mode 100644 index 44bed3b51..000000000 Binary files a/public/images/players/herren1/carousel/carousel5.jpg and /dev/null differ diff --git a/public/images/players/herren1/david.jpg b/public/images/players/herren1/david.jpg deleted file mode 100644 index 2a7e63760..000000000 Binary files a/public/images/players/herren1/david.jpg and /dev/null differ diff --git a/public/images/players/herren1/erik.jpg b/public/images/players/herren1/erik.jpg deleted file mode 100644 index 2de081b87..000000000 Binary files a/public/images/players/herren1/erik.jpg and /dev/null differ diff --git a/public/images/players/herren1/lasse.jpg b/public/images/players/herren1/lasse.jpg deleted file mode 100644 index 0edbc0adb..000000000 Binary files a/public/images/players/herren1/lasse.jpg and /dev/null differ diff --git a/public/images/players/herren1/marc.jpg b/public/images/players/herren1/marc.jpg deleted file mode 100644 index d1e8abccd..000000000 Binary files a/public/images/players/herren1/marc.jpg and /dev/null differ diff --git a/public/images/players/herren1/peter.jpg b/public/images/players/herren1/peter.jpg deleted file mode 100644 index 86b4c5047..000000000 Binary files a/public/images/players/herren1/peter.jpg and /dev/null differ diff --git a/public/images/players/herren1/phillip.jpg b/public/images/players/herren1/phillip.jpg deleted file mode 100644 index ea33f7247..000000000 Binary files a/public/images/players/herren1/phillip.jpg and /dev/null differ diff --git a/public/images/players/herren1/samuel.jpg b/public/images/players/herren1/samuel.jpg deleted file mode 100644 index eabd00ccf..000000000 Binary files a/public/images/players/herren1/samuel.jpg and /dev/null differ diff --git a/public/images/players/herren1/sten.jpg b/public/images/players/herren1/sten.jpg deleted file mode 100644 index d05727fe3..000000000 Binary files a/public/images/players/herren1/sten.jpg and /dev/null differ diff --git a/public/images/players/herren1/tony.jpg b/public/images/players/herren1/tony.jpg deleted file mode 100644 index e8273799f..000000000 Binary files a/public/images/players/herren1/tony.jpg and /dev/null differ diff --git a/public/images/tgl-ball.png b/public/images/tgl-ball.png new file mode 100644 index 000000000..2df913b3f Binary files /dev/null and b/public/images/tgl-ball.png differ diff --git a/src/admin/EventsAdmin.tsx b/src/admin/EventsAdmin.tsx index f3e692ed8..38b57bfcd 100644 --- a/src/admin/EventsAdmin.tsx +++ b/src/admin/EventsAdmin.tsx @@ -3,7 +3,7 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { Switch } from "@/components/ui/switch"; -import axios from "axios"; +import api from "@/lib/axios"; type Event = { id?: number; @@ -31,38 +31,40 @@ const EventsAdmin = () => { const fetchEvents = async () => { try { - const res = await axios.get("/api/events?showPrivate=true"); - if (Array.isArray(res.data)) { - setEvents(res.data); - } else { - console.warn("⚠️ Events-API hat kein Array geliefert:", res.data); - setEvents([]); - } + const res = await api.get("/api/events?showPrivate=true"); + setEvents(Array.isArray(res.data) ? res.data : []); } catch (error) { console.error("❌ Fehler beim Laden der Events:", error); setEvents([]); } }; - useEffect(() => { fetchEvents(); }, []); const handleSubmit = async () => { - if (isEditing && form.id) { - await axios.put(`/api/events/${form.id}`, form); - } else { - await axios.post("/api/events", form); + try { + if (isEditing && form.id) { + await api.put(`/api/events/${form.id}`, form); + } else { + await api.post("/api/events", form); + } + setForm(defaultEvent); + setIsEditing(false); + fetchEvents(); + } catch (error) { + console.error("❌ Fehler beim Speichern:", error); } - setForm(defaultEvent); - setIsEditing(false); - fetchEvents(); }; const handleDelete = async (id: number) => { - await axios.delete(`/api/events/${id}`); - fetchEvents(); + try { + await api.delete(`/api/events/${id}`); + fetchEvents(); + } catch (error) { + console.error("❌ Fehler beim Löschen:", error); + } }; const handleEdit = (event: Event) => { @@ -89,14 +91,18 @@ const EventsAdmin = () => { type="number" placeholder="Max. Teilnehmer" value={form.max_participants ?? ""} - onChange={(e) => setForm({ ...form, max_participants: parseInt(e.target.value) || undefined })} + onChange={(e) => + setForm({ ...form, max_participants: parseInt(e.target.value) || undefined }) + } /> setForm({ ...form, fee: parseFloat(e.target.value) || undefined })} + onChange={(e) => + setForm({ ...form, fee: parseFloat(e.target.value) || undefined }) + } /> { {isEditing ? "Speichern" : "Erstellen"} {isEditing && ( - )} @@ -126,25 +138,36 @@ const EventsAdmin = () => {

Bestehende Events

- {Array.isArray(events) && events.length > 0 ? ( + {events.length > 0 ? ( - ) : ( + ) : (

Noch keine Events vorhanden.

- )} - + )} ); }; diff --git a/src/components/NewsSection.tsx b/src/components/NewsSection.tsx index a4485b8f3..39952c1c9 100644 --- a/src/components/NewsSection.tsx +++ b/src/components/NewsSection.tsx @@ -18,6 +18,7 @@ type NewsItem = { const NewsSection = () => { const [news, setNews] = useState([]); + const defaultImage = "/images/tgl-ball.png"; const fetchNews = async () => { try{ @@ -49,7 +50,7 @@ const NewsSection = () => { src={ item.image_url ? `${import.meta.env.VITE_API_URL}${item.image_url}` - : "/images/default-news.jpg" + : defaultImage } alt={item.title} className="w-full h-full object-cover" diff --git a/src/components/TeamSection.tsx b/src/components/TeamSection.tsx index 8a5c2f155..7454d39a2 100644 --- a/src/components/TeamSection.tsx +++ b/src/components/TeamSection.tsx @@ -27,6 +27,7 @@ const TeamSection = () => { const [loading, setLoading] = useState(true); const [sliderRef, slider] = useKeenSlider({ + loop: true, slides: { perView: 1, spacing: 16, @@ -60,6 +61,14 @@ const TeamSection = () => { fetchTeams(); }, []); + useEffect(() => { + const interval = setInterval(() => { + slider.current?.next(); + }, 3000); + + return () => clearInterval(interval); + }, [slider]); + return (
diff --git a/src/lib/axios.ts b/src/lib/axios.ts new file mode 100644 index 000000000..ea02df908 --- /dev/null +++ b/src/lib/axios.ts @@ -0,0 +1,7 @@ +import axios from "axios"; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_URL, +}); + +export default api; \ No newline at end of file diff --git a/src/pages/AlleNeuigkeiten.tsx b/src/pages/AlleNeuigkeiten.tsx index a64ee3ace..f8f01e0a1 100644 --- a/src/pages/AlleNeuigkeiten.tsx +++ b/src/pages/AlleNeuigkeiten.tsx @@ -17,6 +17,25 @@ const AlleNeuigkeitenPage = () => { const [news, setNews] = useState([]); const [expandedIds, setExpandedIds] = useState([]); const [activeCardId, setActiveCardId] = useState(null); + const [selectedTeam, setSelectedTeam] = useState("Alle Teams"); + + const defaultImage = "/images/tgl-ball.png"; + + //Filtern nach Teams + const teams = Array.from(new Set(news.map((n) => n.team).filter(Boolean))); + + const filteredNews = selectedTeam === "Alle Teams" ? news : news.filter((n) => n.team === selectedTeam); + + const groupedNews = filteredNews.reduce((acc: Record, item) => { + const year = new Date(item.created_at).getFullYear().toString(); + if (!acc[year]) acc[year] = []; + acc[year].push(item); + return acc; + }, {}); + + + + useEffect(() => { fetch(`${apiBase}/api/news`) @@ -31,13 +50,6 @@ const AlleNeuigkeitenPage = () => { }; - // Gruppieren nach Jahren - const groupedNews = news.reduce((acc: Record, item) => { - const year = new Date(item.created_at).getFullYear().toString(); - if (!acc[year]) acc[year] = []; - acc[year].push(item); - return acc; - }, {}); //Toggle der Cards const toggleExpand = (id: number) => { @@ -47,8 +59,24 @@ const AlleNeuigkeitenPage = () => { } return ( -
-

Alle Neuigkeiten

+
+

Alle Neuigkeiten

+ +
+ +
+ {/* News nach Jahren gruppiert */} {Object.entries(groupedNews).map(([year, items]) => ( @@ -69,7 +97,7 @@ const AlleNeuigkeitenPage = () => { src={ item.image_url ? `${apiBase}${item.image_url}` - : "https://via.placeholder.com/400x300?text=Kein+Bild" + : defaultImage } alt={item.title} className="w-full h-full object-cover"