"use client"; import Link from "next/link"; import type { Route } from "next"; import { trpc } from "~/lib/trpc/client.js"; import type { WidgetProps } from "~/components/dashboard/widget-registry.js"; import { TaskCard } from "~/components/notifications/TaskCard.js"; // eslint-disable-next-line @typescript-eslint/no-unused-vars export function TaskWidget(_props: Partial = {}) { const utils = trpc.useUtils(); const { data: tasks, isLoading: loadingTasks } = trpc.notification.listTasks.useQuery( { status: "OPEN", limit: 5 }, { staleTime: 30_000, placeholderData: (prev) => prev }, ); const { data: taskCounts, isLoading: loadingCounts } = trpc.notification.taskCounts.useQuery(undefined, { staleTime: 30_000, placeholderData: (prev) => prev, }); const updateTaskStatus = trpc.notification.updateTaskStatus.useMutation({ onSuccess: () => { void utils.notification.taskCounts.invalidate(); void utils.notification.listTasks.invalidate(); void utils.notification.list.invalidate(); void utils.notification.unreadCount.invalidate(); }, }); function handleStatusChange(id: string, status: string) { updateTaskStatus.mutate({ id, status: status as "OPEN" | "IN_PROGRESS" | "DONE" | "DISMISSED" }); } const openCount = (taskCounts?.open ?? 0) + (taskCounts?.inProgress ?? 0); const isLoading = loadingTasks || loadingCounts; if (isLoading) { return (
{[...Array(3)].map((_, i) => (
))}
); } return (
{/* Header */}

Open Tasks {openCount > 0 && ( {openCount} )}

{taskCounts?.overdue !== undefined && taskCounts.overdue > 0 && ( {taskCounts.overdue} overdue )}
{/* Content */}
{!tasks || tasks.length === 0 ? (
No open tasks
) : ( tasks.map((t) => ( )) )}
{/* Footer */}
View all →
); }