import React, { useEffect, useState } from 'react'; import { Check, CheckCircle2, Circle, Calendar, Trash2, RotateCcw, FileText, Tag, AlertCircle, } from 'lucide-react'; import { Thought } from '../../lib/types'; import { api, triggerHaptic } from '../../lib/api'; interface TasksViewProps { onRefreshStats: () => void; onOpenDocument: (docId: string) => void; } export const TasksView: React.FC = ({ onRefreshStats, onOpenDocument }) => { const [filter, setFilter] = useState<'open' | 'done' | 'discarded'>('open'); const [tasks, setTasks] = useState([]); const [discarded, setDiscarded] = useState([]); const [loading, setLoading] = useState(true); const loadData = async () => { setLoading(true); try { const [allTasks, allDiscarded] = await Promise.all([ api.getTasks(), api.getThoughts('discarded'), ]); setTasks(allTasks); setDiscarded(allDiscarded); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const handleToggleDone = async (task: Thought) => { triggerHaptic(15); const nextState = !task.isCompleted; setTasks((prev) => prev.map((t) => (t.id === task.id ? { ...t, isCompleted: nextState } : t)) ); await api.updateThought(task.id, { isCompleted: nextState }); onRefreshStats(); }; const handleDueDateChange = async (task: Thought, newDate: string) => { setTasks((prev) => prev.map((t) => (t.id === task.id ? { ...t, dueDate: newDate } : t))); await api.updateThought(task.id, { dueDate: newDate }); }; const handleConvertToDoc = async (task: Thought) => { triggerHaptic(20); const updated = await api.triageAction(task.id, 'keep', { convertTo: 'document' }); onRefreshStats(); if (updated.convertedRefId) { onOpenDocument(updated.convertedRefId); } else { loadData(); } }; const handleRestore = async (item: Thought) => { triggerHaptic(15); await api.triageAction(item.id, 'restore'); await loadData(); onRefreshStats(); }; const handleDeletePermanent = async (id: string) => { triggerHaptic(20); await api.deleteThought(id); await loadData(); onRefreshStats(); }; const handlePurgeAllDiscarded = async () => { await api.purgeDiscarded(); await loadData(); onRefreshStats(); }; const openTasks = tasks.filter((t) => !t.isCompleted); const doneTasks = tasks.filter((t) => t.isCompleted); return (
{/* Filter Pills */}
{filter === 'discarded' && discarded.length > 0 && ( )}
{loading ? (
Lade Aufgaben…
) : filter === 'discarded' ? (
{discarded.length === 0 ? (
Keine verworfenen Gedanken im Papierkorb.
) : ( discarded.map((item) => (

{item.content}

)) )}
) : (
{(filter === 'open' ? openTasks : doneTasks).length === 0 ? (
{filter === 'open' ? 'Keine offenen Aufgaben vorhanden.' : 'Noch keine erledigten Aufgaben.'}
) : ( (filter === 'open' ? openTasks : doneTasks).map((task, idx) => { // Alternate squircle colors matching template: blue, green, purple, orange, violet const squircleColors = [ 'bg-[#1d8cf8]', // electric blue 'bg-[#22c55e]', // vibrant green 'bg-[#a855f7]', // purple 'bg-[#f97316]', // orange 'bg-[#8b5cf6]', // violet ]; const squircleBg = task.priority === 'urgent' ? 'bg-[#ef4444]' : task.isCompleted ? 'bg-[#a855f7]' : squircleColors[idx % squircleColors.length]; // In template: active/top items have a thin bright green outline const isHighlightGreen = !task.isCompleted && idx < 3; return (
{/* Template Squircle Icon */}

{task.content}

{task.priority === 'urgent' && ( Dringend )} {task.priority === 'high' && ( Wichtig )} {task.tags?.map((tag) => ( #{tag} ))}
{/* Action Controls */}
handleDueDateChange(task, e.target.value)} className="pl-8 pr-3 py-1 rounded-full bg-[#16171a] text-white text-xs border border-white/[0.08] focus:outline-none focus:border-[#1d8cf8] transition-colors" />
); }) )}
)}
); };