"use client"; import React, { useEffect, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Code2, Disc3, Gamepad2, ExternalLink, Cpu, Zap, Clock, Music } from "lucide-react"; // Types passend zu deinem n8n Output interface StatusData { status: { text: string; color: string; }; music: { isPlaying: boolean; track: string; artist: string; album: string; albumArt: string; url: string; } | null; gaming: { isPlaying: boolean; name: string; image: string | null; state?: string; details?: string; } | null; coding: { isActive: boolean; project?: string; file?: string; stats?: { time: string; topLang: string; topProject: string; }; } | null; } export default function ActivityFeed() { const [data, setData] = useState(null); // Daten abrufen (alle 10 Sekunden für schnelleres Feedback) useEffect(() => { const fetchData = async () => { try { const res = await fetch("/api/n8n/status"); if (!res.ok) return; const json = await res.json(); setData(json); } catch (e) { console.error("Failed to fetch activity", e); } }; fetchData(); const interval = setInterval(fetchData, 10000); // 10s Refresh return () => clearInterval(interval); }, []); if (!data) return null; return (
{/* -------------------------------------------------------------------------------- 1. CODING CARD Zeigt entweder "Live Coding" (Grün) oder "Tagesstatistik" (Grau/Blau) -------------------------------------------------------------------------------- */} {data.coding && ( {/* Icon Box */}
{data.coding.isActive ? : }
{data.coding.isActive ? ( // --- LIVE STATUS --- <>
Coding Now
{data.coding.project || "Unknown Project"} {data.coding.file || "Writing code..."} ) : ( // --- STATS STATUS --- <> Today's Stats {data.coding.stats?.time || "0m"} Focus: {data.coding.stats?.topLang} )}
)} {/* -------------------------------------------------------------------------------- 2. GAMING CARD Erscheint nur, wenn du spielst -------------------------------------------------------------------------------- */} {data.gaming?.isPlaying && ( {/* Background Glow */}
{data.gaming.image ? ( Game Art ) : (
)}
In Game {data.gaming.name} {data.gaming.details || data.gaming.state || "Playing..."}
)} {/* -------------------------------------------------------------------------------- 3. MUSIC CARD (Spotify) Erscheint nur, wenn Musik läuft -------------------------------------------------------------------------------- */} {data.music?.isPlaying && (
Album
Spotify {/* Equalizer Animation */}
{[1,2,3].map(i => ( ))}
{data.music.track} {data.music.artist}
)} {/* -------------------------------------------------------------------------------- 4. STATUS BADGE (Optional) Kleiner Indikator ganz unten, falls nichts anderes da ist oder als Abschluss -------------------------------------------------------------------------------- */}
{data.status.text === 'dnd' ? 'Do not disturb' : data.status.text}
); }