"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { RefreshCw } from "lucide-react"; interface Task { id: string; headline: string; projectName: string; projectId: number; status: number; type: string; dateToFinish: string; date: string; editFrom: string; editTo: string; editorId: string; authorFirstname?: string; authorLastname?: string; tags?: string; description?: string; milestone?: string; details?: string; milestoneHeadline?: string; } interface ProjectSummary { name: string; tasks: { status: number; count: number; }[]; } export function Flow() { const [tasks, setTasks] = useState([]); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const getStatusLabel = (status: number): string => { switch (status) { case 0: return 'NEW'; case 1: return 'INPROGRESS'; case 2: return 'DONE'; case 3: return 'NEW'; case 4: return 'INPROGRESS'; case 5: return 'DONE'; default: return 'UNKNOWN'; } }; const getStatusColor = (status: number): string => { const statusLabel = getStatusLabel(status); switch (statusLabel) { case 'DONE': return 'bg-green-100 text-green-800'; case 'INPROGRESS': return 'bg-yellow-100 text-yellow-800'; case 'NEW': return 'bg-gray-100 text-gray-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getDateToSort = (task: Task): number => { // Try different date fields in order of preference const dates = [ task.dateToFinish, task.date, task.editTo, task.editFrom ].filter(date => date && date !== '0000-00-00 00:00:00'); return dates.length > 0 ? new Date(dates[0]).getTime() : Number.MAX_SAFE_INTEGER; }; const formatDate = (dateStr: string): string => { if (!dateStr || dateStr === '0000-00-00 00:00:00') return ''; try { const date = new Date(dateStr); if (isNaN(date.getTime())) return ''; return date.toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', year: 'numeric' }); } catch { return ''; } }; const fetchTasks = async (isRefresh = false) => { try { if (isRefresh) setRefreshing(true); const response = await fetch('/api/leantime/tasks'); if (!response.ok) throw new Error('Failed to fetch tasks'); const data = await response.json(); if (!data.tasks || !Array.isArray(data.tasks)) { setTasks([]); return; } // Sort tasks by date (oldest first) const sortedTasks = data.tasks .filter((task: Task) => task.headline && typeof task.headline === 'string' && task.editorId // Only show tasks assigned to the current user ) .sort((a: Task, b: Task) => getDateToSort(a) - getDateToSort(b)); // Limit to 6 tasks setTasks(sortedTasks.slice(0, 6)); setError(null); } catch (err) { console.error('Error fetching tasks:', err); setError('Failed to fetch tasks'); } finally { setLoading(false); setRefreshing(false); } }; useEffect(() => { fetchTasks(); }, []); return ( Tasks {loading ? (
) : error ? (
{error}
) : tasks.length === 0 ? (
No tasks found
) : (
{tasks.map((task) => (

{task.headline}

{task.dateToFinish && task.dateToFinish !== '0000-00-00 00:00:00' && (

Due: {formatDate(task.dateToFinish)}

)}
))}
)} ); }