import React, { useState, useEffect } from 'react'; import { useParams, useNavigate, useSearchParams } from 'react-router-dom'; import { Page } from './_util'; import { Button } from '@/components/ui/button'; import { useAppearance } from '../../hooks/use-appearance'; import { Clock, RefreshCw, Smile } from 'lucide-react'; import BottomNav from '../components/BottomNav'; import { useEventData } from '../hooks/useEventData'; import { EventData } from '../services/eventApi'; interface Task { id: number; title: string; description: string; instructions: string; duration: number; // in minutes emotion?: { slug: string; name: string; }; is_completed: boolean; } export default function TaskPickerPage() { const { slug } = useParams<{ slug: string }>(); const [searchParams] = useSearchParams(); // emotionSlug = searchParams.get('emotion'); // Temporär deaktiviert, da API-Filter nicht verfügbar const navigate = useNavigate(); const { appearance } = useAppearance(); const isDark = appearance === 'dark'; const [tasks, setTasks] = useState([]); const [currentTask, setCurrentTask] = useState(null); const [timeLeft, setTimeLeft] = useState(0); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Timer state useEffect(() => { if (!currentTask) return; const durationMs = currentTask.duration * 60 * 1000; setTimeLeft(durationMs / 1000); const interval = setInterval(() => { setTimeLeft(prev => { if (prev <= 1) { clearInterval(interval); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(interval); }, [currentTask]); // Load tasks useEffect(() => { if (!slug) return; async function fetchTasks() { try { setLoading(true); setError(null); const url = `/api/v1/events/${slug}/tasks`; console.log('Fetching tasks from:', url); // Debug const response = await fetch(url); if (!response.ok) throw new Error('Tasks konnten nicht geladen werden'); const data = await response.json(); setTasks(Array.isArray(data) ? data : []); console.log('Loaded tasks:', data); // Debug // Select random task if (data.length > 0) { const randomIndex = Math.floor(Math.random() * data.length); setCurrentTask(data[randomIndex]); console.log('Selected random task:', data[randomIndex]); // Debug } } catch (err) { console.error('Fetch tasks error:', err); setError(err instanceof Error ? err.message : 'Unbekannter Fehler'); } finally { setLoading(false); } } fetchTasks(); }, [slug]); const formatTime = (seconds: number) => { const mins = Math.floor(seconds / 60); const secs = seconds % 60; return `${mins}:${secs.toString().padStart(2, '0')}`; }; const handleNewTask = () => { if (tasks.length === 0) return; const randomIndex = Math.floor(Math.random() * tasks.length); setCurrentTask(tasks[randomIndex]); setTimeLeft(tasks[randomIndex].duration * 60); }; const handleStartTask = () => { if (!currentTask) return; // Navigate to upload with task context navigate(`/e/${slug}/upload?task=${currentTask.id}&emotion=${currentTask.emotion?.slug || ''}`); }; const handleChangeMood = () => { navigate(`/e/${slug}`); }; if (loading) { return (

Lade Aufgabe...

); } if (error || !currentTask) { return (

Keine passende Aufgabe gefunden

{error || 'Für deine Stimmung gibt es derzeit keine Aufgaben. Versuche eine andere Stimmung oder warte auf neue Inhalte.'}

); } return (
{/* Task Header with Selfie Overlay */}
{/* Selfie Placeholder */}
📸

Selfie-Vorschau

{/* Timer */}
60 ? 'bg-green-500/20 text-green-400 border-green-500/30' : timeLeft > 30 ? 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30' : 'bg-red-500/20 text-red-400 border-red-500/30' } border`}> {formatTime(timeLeft)}
{/* Task Description Overlay */}

{currentTask.title}

{currentTask.description}

{currentTask.instructions && (

💡 {currentTask.instructions}

)}
{/* Action Buttons */}
{/* Bottom Navigation */}
); }