import { useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' import Modal from '../ui/Modal' import { Badge, EmptyState, FieldError, Icon } from '../ui/primitives' import { useToast } from '../ui/Toast' import { useFormState } from '../components/AuthLayout' import { seedQuery, useSeedMutation } from '../data/seedQueries' import { fmtDate, fmtShort, getCandidate, savedSearches, TODAY } from '../data/seed' const FILTERS = ['All', 'Open', 'Completed', 'Overdue', 'High', 'Medium', 'Low'] const PRIORITY_CLASS = { High: 'b-red', Medium: 'b-amber', Low: 'b-gray' } export default function Tasks() { const { toast } = useToast() const navigate = useNavigate() const { data: tasks = [] } = useQuery(seedQuery('tasks')) const { data: recruiters = [] } = useQuery(seedQuery('recruiters')) const updateTasks = useSeedMutation('tasks') const [filter, setFilter] = useState('All') const [detail, setDetail] = useState(null) const [adding, setAdding] = useState(false) const isOverdue = (t) => !t.done && t.due < TODAY const list = useMemo(() => { if (filter === 'Open') return tasks.filter((t) => !t.done) if (filter === 'Completed') return tasks.filter((t) => t.done) if (filter === 'Overdue') return tasks.filter(isOverdue) if (['High', 'Medium', 'Low'].includes(filter)) return tasks.filter((t) => t.priority === filter) return tasks }, [tasks, filter]) const openCount = tasks.filter((t) => !t.done).length const overdueCount = tasks.filter(isOverdue).length // Writing to the cache is what makes the sidebar badge update — the prototype // had to remember to call App.updateBadges() at each of these call sites. function toggle(id) { let nowDone = false updateTasks((ts) => ts.map((t) => { if (t.id !== id) return t nowDone = !t.done return { ...t, done: nowDone } }), ) toast(nowDone ? 'Task completed' : 'Task reopened', nowDone ? 'success' : 'info') } function complete(id) { updateTasks((ts) => ts.map((t) => (t.id === id ? { ...t, done: true } : t))) toast('Task completed', 'success') } return (
{openCount} open · {overdueCount} overdue