From 581095d8a3c1c34b6bd1c5ae88d6d5574724a6e3 Mon Sep 17 00:00:00 2001 From: Rasmus Widing Date: Thu, 4 Sep 2025 10:52:32 +0300 Subject: [PATCH] fix: resolve final TypeScript error in features directory - Update UseTaskEditorReturn interface to properly type projectFeatures - Change from unknown[] to explicit shape with id, label, type, and color properties - All TypeScript errors in /src/features now resolved --- .../src/features/projects/services/projectService.ts | 2 +- .../src/features/projects/tasks/TasksTab.tsx | 10 +++++----- .../src/features/projects/tasks/components/index.ts | 2 +- .../features/projects/tasks/hooks/useTaskActions.ts | 4 ++-- .../src/features/projects/tasks/hooks/useTaskEditor.ts | 9 +++++++-- .../src/features/projects/tasks/types/hooks.ts | 7 ++++++- .../src/features/projects/tasks/types/task.ts | 3 ++- archon-ui-main/src/features/projects/types/project.ts | 9 ++++++++- .../src/features/projects/views/ProjectsView.tsx | 8 ++++---- .../features/ui/components/FeatureErrorBoundary.tsx | 2 +- .../src/features/ui/hooks/useSmartPolling.ts | 2 +- 11 files changed, 38 insertions(+), 20 deletions(-) diff --git a/archon-ui-main/src/features/projects/services/projectService.ts b/archon-ui-main/src/features/projects/services/projectService.ts index 1e0e9ad0..f6d739ad 100644 --- a/archon-ui-main/src/features/projects/services/projectService.ts +++ b/archon-ui-main/src/features/projects/services/projectService.ts @@ -29,7 +29,7 @@ export const projectService = { const processed = { ...project, // Ensure pinned is properly handled as boolean - pinned: project.pinned === true || project.pinned === "true", + pinned: project.pinned === true, progress: project.progress || 0, updated: project.updated || formatRelativeTime(project.updated_at), }; diff --git a/archon-ui-main/src/features/projects/tasks/TasksTab.tsx b/archon-ui-main/src/features/projects/tasks/TasksTab.tsx index 05ecdc06..8d460164 100644 --- a/archon-ui-main/src/features/projects/tasks/TasksTab.tsx +++ b/archon-ui-main/src/features/projects/tasks/TasksTab.tsx @@ -120,7 +120,7 @@ export const TasksTab = ({ projectId }: TasksTabProps) => { const handleTaskReorder = useCallback( async (taskId: string, targetIndex: number, status: Task["status"]) => { // Get all tasks in the target status, sorted by current order - const statusTasks = tasks.filter((task) => task.status === status).sort((a, b) => a.task_order - b.task_order); + const statusTasks = (tasks as Task[]).filter((task) => task.status === status).sort((a, b) => a.task_order - b.task_order); const movingTaskIndex = statusTasks.findIndex((task) => task.id === taskId); if (movingTaskIndex === -1 || targetIndex < 0 || targetIndex >= statusTasks.length) return; @@ -152,12 +152,12 @@ export const TasksTab = ({ projectId }: TasksTabProps) => { // Move task to different status const moveTask = useCallback( async (taskId: string, newStatus: Task["status"]) => { - const movingTask = tasks.find((task) => task.id === taskId); + const movingTask = (tasks as Task[]).find((task) => task.id === taskId); if (!movingTask || movingTask.status === newStatus) return; try { // Calculate position for new status - const tasksInNewStatus = tasks.filter((t) => t.status === newStatus); + const tasksInNewStatus = (tasks as Task[]).filter((t) => t.status === newStatus); const newOrder = getDefaultTaskOrder(tasksInNewStatus); // Update via mutation (handles optimistic updates) @@ -221,7 +221,7 @@ export const TasksTab = ({ projectId }: TasksTabProps) => {
{viewMode === "table" ? ( { /> ) : ( { @@ -17,7 +17,7 @@ export const useTaskActions = (projectId: string): UseTaskActionsReturn => { (taskId: string, newAssignee: string) => { updateTaskMutation.mutate({ taskId, - updates: { assignee: newAssignee }, + updates: { assignee: newAssignee as Assignee }, }); }, [updateTaskMutation], diff --git a/archon-ui-main/src/features/projects/tasks/hooks/useTaskEditor.ts b/archon-ui-main/src/features/projects/tasks/hooks/useTaskEditor.ts index e72f0c62..b6b5860e 100644 --- a/archon-ui-main/src/features/projects/tasks/hooks/useTaskEditor.ts +++ b/archon-ui-main/src/features/projects/tasks/hooks/useTaskEditor.ts @@ -1,7 +1,7 @@ import { useCallback } from "react"; import { useToast } from "../../../../contexts/ToastContext"; import { useProjectFeatures } from "../../hooks/useProjectQueries"; -import type { Assignee, CreateTaskRequest, Task, UseTaskEditorReturn } from "../types"; +import type { Assignee, CreateTaskRequest, Task, UpdateTaskRequest, UseTaskEditorReturn } from "../types"; import { useCreateTask, useUpdateTask } from "./useTaskQueries"; export const useTaskEditor = (projectId: string): UseTaskEditorReturn => { @@ -13,7 +13,12 @@ export const useTaskEditor = (projectId: string): UseTaskEditorReturn => { const updateTaskMutation = useUpdateTask(projectId); // Transform features data - const projectFeatures = featuresData?.features || []; + const projectFeatures = (featuresData?.features || []) as Array<{ + id: string; + label: string; + type?: string; + color?: string; + }>; const isSaving = createTaskMutation.isPending || updateTaskMutation.isPending; // Get default order for new tasks based on status diff --git a/archon-ui-main/src/features/projects/tasks/types/hooks.ts b/archon-ui-main/src/features/projects/tasks/types/hooks.ts index 7de7ae4e..4c0d162a 100644 --- a/archon-ui-main/src/features/projects/tasks/types/hooks.ts +++ b/archon-ui-main/src/features/projects/tasks/types/hooks.ts @@ -30,7 +30,12 @@ export interface UseTaskActionsReturn { */ export interface UseTaskEditorReturn { // Data - projectFeatures: unknown[]; + projectFeatures: Array<{ + id: string; + label: string; + type?: string; + color?: string; + }>; // Actions saveTask: (localTask: Partial | null, editingTask: Task | null, onSuccess?: () => void) => void; diff --git a/archon-ui-main/src/features/projects/tasks/types/task.ts b/archon-ui-main/src/features/projects/tasks/types/task.ts index e9691d81..cbf0edbb 100644 --- a/archon-ui-main/src/features/projects/tasks/types/task.ts +++ b/archon-ui-main/src/features/projects/tasks/types/task.ts @@ -5,7 +5,8 @@ */ // Import priority type from priority.ts to avoid duplication -export type { TaskPriority } from "./priority"; +import type { TaskPriority } from "./priority"; +export type { TaskPriority }; // Database status enum - using database values directly export type DatabaseTaskStatus = "todo" | "doing" | "review" | "done"; diff --git a/archon-ui-main/src/features/projects/types/project.ts b/archon-ui-main/src/features/projects/types/project.ts index c844d695..687c1419 100644 --- a/archon-ui-main/src/features/projects/types/project.ts +++ b/archon-ui-main/src/features/projects/types/project.ts @@ -7,7 +7,14 @@ // Project JSONB field types - replacing any with proper unions export type ProjectPRD = Record; export type ProjectDocs = unknown[]; // Will be refined to ProjectDocument[] when fully migrated -export type ProjectFeatures = unknown[]; +export type ProjectFeature = { + id: string; + label: string; + type?: string; + color?: string; +}; + +export type ProjectFeatures = ProjectFeature[]; export type ProjectData = unknown[]; // Project creation progress tracking diff --git a/archon-ui-main/src/features/projects/views/ProjectsView.tsx b/archon-ui-main/src/features/projects/views/ProjectsView.tsx index 4501bbc9..fc4d72fa 100644 --- a/archon-ui-main/src/features/projects/views/ProjectsView.tsx +++ b/archon-ui-main/src/features/projects/views/ProjectsView.tsx @@ -69,7 +69,7 @@ export function ProjectsView({ className = "", "data-id": dataId }: ProjectsView // Sort projects - pinned first, then alphabetically const sortedProjects = useMemo(() => { - return [...projects].sort((a, b) => { + return [...(projects as Project[])].sort((a, b) => { if (a.pinned && !b.pinned) return -1; if (!a.pinned && b.pinned) return 1; return a.title.localeCompare(b.title); @@ -111,7 +111,7 @@ export function ProjectsView({ className = "", "data-id": dataId }: ProjectsView // Refetch task counts when projects change useEffect(() => { - if (projects.length > 0) { + if ((projects as Project[]).length > 0) { refetchTaskCounts(); } }, [projects, refetchTaskCounts]); @@ -119,7 +119,7 @@ export function ProjectsView({ className = "", "data-id": dataId }: ProjectsView // Handle pin toggle const handlePinProject = async (e: React.MouseEvent, projectId: string) => { e.stopPropagation(); - const project = projects.find((p) => p.id === projectId); + const project = (projects as Project[]).find((p) => p.id === projectId); if (!project) return; updateProjectMutation.mutate({ @@ -146,7 +146,7 @@ export function ProjectsView({ className = "", "data-id": dataId }: ProjectsView // If we deleted the selected project, select another one if (selectedProject?.id === projectToDelete.id) { - const remainingProjects = projects.filter((p) => p.id !== projectToDelete.id); + const remainingProjects = (projects as Project[]).filter((p) => p.id !== projectToDelete.id); if (remainingProjects.length > 0) { const nextProject = remainingProjects[0]; setSelectedProject(nextProject); diff --git a/archon-ui-main/src/features/ui/components/FeatureErrorBoundary.tsx b/archon-ui-main/src/features/ui/components/FeatureErrorBoundary.tsx index c4fab74d..8d03ed82 100644 --- a/archon-ui-main/src/features/ui/components/FeatureErrorBoundary.tsx +++ b/archon-ui-main/src/features/ui/components/FeatureErrorBoundary.tsx @@ -55,7 +55,7 @@ export class FeatureErrorBoundary extends Component { const isDevelopment = process.env.NODE_ENV === "development"; return ( -
+
{ + const getSmartInterval = (): number | false => { if (!isVisible) { // Page is hidden - disable polling return false;