fix(web): remove mock data from dashboard telemetry/tasks/calendar (#656)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful

Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
This commit was merged in pull request #656.
This commit is contained in:
2026-03-02 14:19:27 +00:00
committed by jason.woltje
parent a16371c6f9
commit 5b77774d91
6 changed files with 367 additions and 201 deletions

View File

@@ -4,68 +4,56 @@
import { useState, useEffect } from "react";
import { CheckCircle, Circle, Clock, AlertCircle } from "lucide-react";
import type { WidgetProps } from "@mosaic/shared";
import { TaskPriority, TaskStatus, type WidgetProps, type Task } from "@mosaic/shared";
import { fetchTasks } from "@/lib/api/tasks";
interface Task {
id: string;
title: string;
status: string;
priority: string;
dueDate?: string;
}
// eslint-disable-next-line no-empty-pattern
export function TasksWidget({}: WidgetProps): React.JSX.Element {
export function TasksWidget({ id: _id, config: _config }: WidgetProps): React.JSX.Element {
const [tasks, setTasks] = useState<Task[]>([]);
const [isLoading, setIsLoading] = useState(true);
// Mock data for now - will fetch from API later
useEffect(() => {
setIsLoading(true);
// Simulate API call
setTimeout(() => {
setTasks([
{
id: "1",
title: "Complete project documentation",
status: "IN_PROGRESS",
priority: "HIGH",
dueDate: "2024-02-01",
},
{
id: "2",
title: "Review pull requests",
status: "NOT_STARTED",
priority: "MEDIUM",
dueDate: "2024-02-02",
},
{
id: "3",
title: "Update dependencies",
status: "COMPLETED",
priority: "LOW",
dueDate: "2024-01-30",
},
]);
setIsLoading(false);
}, 500);
let isMounted = true;
const loadTasks = async (): Promise<void> => {
setIsLoading(true);
try {
const data = await fetchTasks();
if (isMounted) {
setTasks(data);
}
} catch {
if (isMounted) {
setTasks([]);
}
} finally {
if (isMounted) {
setIsLoading(false);
}
}
};
void loadTasks();
return (): void => {
isMounted = false;
};
}, []);
const getPriorityIcon = (priority: string): React.JSX.Element => {
const getPriorityIcon = (priority: TaskPriority): React.JSX.Element => {
switch (priority) {
case "HIGH":
case TaskPriority.HIGH:
return <AlertCircle className="w-4 h-4 text-red-500" />;
case "MEDIUM":
case TaskPriority.MEDIUM:
return <Clock className="w-4 h-4 text-yellow-500" />;
case "LOW":
case TaskPriority.LOW:
return <Circle className="w-4 h-4 text-gray-400" />;
default:
return <Circle className="w-4 h-4 text-gray-400" />;
}
};
const getStatusIcon = (status: string): React.JSX.Element => {
return status === "COMPLETED" ? (
const getStatusIcon = (status: TaskStatus): React.JSX.Element => {
return status === TaskStatus.COMPLETED ? (
<CheckCircle className="w-4 h-4 text-green-500" />
) : (
<Circle className="w-4 h-4 text-gray-400" />
@@ -74,8 +62,8 @@ export function TasksWidget({}: WidgetProps): React.JSX.Element {
const stats = {
total: tasks.length,
inProgress: tasks.filter((t) => t.status === "IN_PROGRESS").length,
completed: tasks.filter((t) => t.status === "COMPLETED").length,
inProgress: tasks.filter((t) => t.status === TaskStatus.IN_PROGRESS).length,
completed: tasks.filter((t) => t.status === TaskStatus.COMPLETED).length,
};
if (isLoading) {