import React, { useState, useEffect, useCallback } from 'react'; import { useAuth } from '../context/AuthContext'; import { useToast, ConfirmModal } from '../components/Toast'; import TaskModal from '../components/TaskModal'; import { apiFetch, safeFileUrl } from '../utils/api'; export default function TasksPage() { const { user } = useAuth(); const toast = useToast(); const [tasks, setTasks] = useState([]); const [totalTasks, setTotalTasks] = useState(0); const [totalPages, setTotalPages] = useState(1); const [currentPage, setCurrentPage] = useState(1); const [selectedTask, setSelectedTask] = useState(null); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [confirmState, setConfirmState] = useState({ open: false, id: null }); const fetchTasks = useCallback(async (page = currentPage) => { try { const statusParam = filter !== 'all' ? `&status=${filter}` : ''; const res = await apiFetch(`/tasks?page=${page}&limit=20${statusParam}`); const data = await res.json(); setTasks(data.tasks || []); setTotalTasks(data.total || 0); setTotalPages(data.totalPages || 1); } catch (e) { console.error('Fehler beim Laden der Aufgaben:', e); } finally { setLoading(false); } }, [currentPage, filter]); useEffect(() => { fetchTasks(); const interval = setInterval(() => fetchTasks(), 30000); return () => clearInterval(interval); }, [fetchTasks]); const updateStatus = async (taskId, status) => { try { const res = await apiFetch(`/tasks/${taskId}/status`, { method: 'PATCH', body: JSON.stringify({ status }), }); if (res.ok) { await fetchTasks(); } } catch (e) { console.error('Fehler beim Aktualisieren:', e); } }; const deleteTask = async (id) => { setConfirmState({ open: true, id }); }; const confirmDeleteTask = async () => { const id = confirmState.id; setConfirmState({ open: false, id: null }); try { const res = await apiFetch(`/tasks/${id}`, { method: 'DELETE' }); if (!res.ok) { toast.error('Fehler beim Löschen der Aufgabe.'); return; } toast.success('Aufgabe gelöscht.'); await fetchTasks(); } catch (e) { toast.error('Netzwerkfehler beim Löschen.'); } }; const filtered = searchQuery.trim() ? tasks.filter(t => t.title?.toLowerCase().includes(searchQuery.toLowerCase()) || t.user_name?.toLowerCase().includes(searchQuery.toLowerCase()) || t.template_name?.toLowerCase().includes(searchQuery.toLowerCase()) ) : tasks; // Reset page when filter changes useEffect(() => { setCurrentPage(1); setLoading(true); fetchTasks(1); }, [filter]); const goToPage = (page) => { setCurrentPage(page); setLoading(true); fetchTasks(page); }; if (loading) { return (
{filter === 'all' ? 'Noch keine Aufgaben vorhanden.' : `Keine ${filter === 'offen' ? 'offenen' : 'erledigten'} Aufgaben.`}