"use client"; import React, { useEffect, useState } from "react"; import Image from "next/image"; import { motion, AnimatePresence } from "framer-motion"; import { Code2, Disc3, Gamepad2, Zap, Clock, Activity, } from "lucide-react"; 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 | number; details?: string | number; } | null; coding: { isActive: boolean; project?: string; file?: string; language?: string; stats?: { time: string; topLang: string; topProject: string; }; } | null; customActivities?: Record; } function getSafeGamingText(details: string | number | undefined, state: string | number | undefined, fallback: string): string { if (typeof details === 'string' && details.trim().length > 0) return details; if (typeof state === 'string' && state.trim().length > 0) return state; if (typeof details === 'number' && !isNaN(details)) return String(details); if (typeof state === 'number' && !isNaN(state)) return String(state); return fallback; } export default function ActivityFeed({ onActivityChange }: { onActivityChange?: (active: boolean) => void }) { const [data, setData] = useState(null); const [hasActivity, setHasActivity] = useState(false); useEffect(() => { const fetchData = async () => { try { const res = await fetch("/api/n8n/status"); if (!res.ok) throw new Error(); const json = await res.json(); const activityData = Array.isArray(json) ? json[0] : json; setData(activityData); const isActive = Boolean( activityData.coding?.isActive || activityData.gaming?.isPlaying || activityData.music?.isPlaying || Object.values(activityData.customActivities || {}).some((act: any) => act?.enabled) ); setHasActivity(isActive); onActivityChange?.(isActive); } catch (error) { setHasActivity(false); onActivityChange?.(false); } }; fetchData(); const interval = setInterval(fetchData, 30000); return () => clearInterval(interval); }, [onActivityChange]); if (!data || !hasActivity) return null; return (
{/* CODING */} {data.coding?.isActive && (
Coding Now

{data.coding.project}

{data.coding.file}

)} {/* GAMING */} {data.gaming?.isPlaying && (
Gaming
{data.gaming.image &&
}

{data.gaming.name}

{getSafeGamingText(data.gaming.details, data.gaming.state, "In Game")}

)} {/* MUSIC */} {data.music?.isPlaying && (
Spotify

{data.music.track}

{data.music.artist}

)}
); }