Skip to content

Commit 23c1f7a

Browse files
author
Gerome El-assaad
committed
Add task management hooks
1 parent 99082d2 commit 23c1f7a

2 files changed

Lines changed: 147 additions & 0 deletions

File tree

hooks/use-task.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
'use client'
2+
3+
import { useState, useEffect } from 'react'
4+
import { Task } from '@/lib/tasks'
5+
6+
export function useTask(taskId: string) {
7+
const [task, setTask] = useState<Task | null>(null)
8+
const [isLoading, setIsLoading] = useState(true)
9+
const [error, setError] = useState<string | null>(null)
10+
11+
const fetchTask = async () => {
12+
try {
13+
const response = await fetch(`/api/tasks/${taskId}`)
14+
if (response.ok) {
15+
const data = await response.json()
16+
setTask(data.task)
17+
setError(null)
18+
} else if (response.status === 404) {
19+
setError('Task not found')
20+
setTask(null)
21+
} else {
22+
setError('Failed to fetch task')
23+
}
24+
} catch (err) {
25+
console.error('Error fetching task:', err)
26+
setError('Failed to fetch task')
27+
} finally {
28+
setIsLoading(false)
29+
}
30+
}
31+
32+
// Initial fetch
33+
useEffect(() => {
34+
fetchTask()
35+
}, [taskId])
36+
37+
// Poll for updates every 5 seconds
38+
useEffect(() => {
39+
const interval = setInterval(() => {
40+
fetchTask()
41+
}, 5000)
42+
43+
return () => clearInterval(interval)
44+
}, [taskId])
45+
46+
return { task, isLoading, error, refetch: fetchTask }
47+
}

hooks/use-tasks.ts

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
'use client'
2+
3+
import { useState, useEffect } from 'react'
4+
import { Task } from '@/lib/tasks'
5+
6+
export function useTasks() {
7+
const [tasks, setTasks] = useState<Task[]>([])
8+
const [isLoading, setIsLoading] = useState(true)
9+
const [error, setError] = useState<string | null>(null)
10+
11+
const fetchTasks = async () => {
12+
try {
13+
const response = await fetch('/api/tasks')
14+
if (response.ok) {
15+
const data = await response.json()
16+
setTasks(data.tasks || [])
17+
setError(null)
18+
} else {
19+
setError('Failed to fetch tasks')
20+
}
21+
} catch (err) {
22+
console.error('Error fetching tasks:', err)
23+
setError('Failed to fetch tasks')
24+
} finally {
25+
setIsLoading(false)
26+
}
27+
}
28+
29+
// Create a new task
30+
const createTask = async (taskData: {
31+
prompt: string
32+
repoUrl?: string
33+
selectedAgent?: string
34+
selectedModel?: string
35+
}) => {
36+
try {
37+
setError(null)
38+
const response = await fetch('/api/tasks', {
39+
method: 'POST',
40+
headers: {
41+
'Content-Type': 'application/json',
42+
},
43+
body: JSON.stringify(taskData),
44+
})
45+
46+
if (response.ok) {
47+
const data = await response.json()
48+
setTasks(prev => [data.task, ...prev])
49+
return data.task
50+
} else {
51+
const errorData = await response.json()
52+
setError(errorData.error || 'Failed to create task')
53+
return null
54+
}
55+
} catch (err) {
56+
console.error('Error creating task:', err)
57+
setError('Failed to create task')
58+
return null
59+
}
60+
}
61+
62+
// Delete tasks by status
63+
const deleteTasks = async (actions: string[]) => {
64+
try {
65+
setError(null)
66+
const response = await fetch(`/api/tasks?action=${actions.join(',')}`, {
67+
method: 'DELETE',
68+
})
69+
70+
if (response.ok) {
71+
// Refresh the tasks list
72+
await fetchTasks()
73+
const data = await response.json()
74+
return data
75+
} else {
76+
const errorData = await response.json()
77+
setError(errorData.error || 'Failed to delete tasks')
78+
return null
79+
}
80+
} catch (err) {
81+
console.error('Error deleting tasks:', err)
82+
setError('Failed to delete tasks')
83+
return null
84+
}
85+
}
86+
87+
// Initial fetch
88+
useEffect(() => {
89+
fetchTasks()
90+
}, [])
91+
92+
return {
93+
tasks,
94+
isLoading,
95+
error,
96+
refetch: fetchTasks,
97+
createTask,
98+
deleteTasks
99+
}
100+
}

0 commit comments

Comments
 (0)