mirror of
https://github.com/Sea-Haven-Industries/open-swe.git
synced 2026-09-30 11:33:14 +00:00
* feat: Implement tasks component * hookup * improve task UI rendering + responsiveness * progress bar small sizes responsiveness' && gp * transition new TaskSidebar, fix add new Task logic * cr --------- Co-authored-by: starmorph <dylan@starmorph.com>
130 lines
3.9 KiB
TypeScript
130 lines
3.9 KiB
TypeScript
import { useStreamContext } from "@/providers/Stream";
|
|
import { TaskPlan } from "@open-swe/shared/open-swe/types";
|
|
import { useEffect, useState } from "react";
|
|
|
|
export function useTaskPlan() {
|
|
const { values } = useStreamContext();
|
|
const [taskPlan, setTaskPlan] = useState<TaskPlan>();
|
|
|
|
useEffect(() => {
|
|
const currentPlanStr = JSON.stringify(taskPlan, null, 2);
|
|
const newPlanStr = JSON.stringify(values?.plan, null, 2);
|
|
if (currentPlanStr !== newPlanStr) {
|
|
setTaskPlan(values?.plan);
|
|
}
|
|
}, [values?.plan]);
|
|
|
|
const handleTaskChange = (taskId: string) => {
|
|
console.log(`Switched to task: ${taskId}`);
|
|
};
|
|
|
|
const handleRevisionChange = (taskId: string, revisionIndex: number) => {
|
|
console.log(`Task ${taskId} switched to revision ${revisionIndex}`);
|
|
};
|
|
|
|
const handleEditPlanItem = (
|
|
taskId: string,
|
|
planItemIndex: number,
|
|
newPlan: string,
|
|
) => {
|
|
setTaskPlan((prevTaskPlan) => {
|
|
const prevTaskPlan_ = prevTaskPlan ?? {
|
|
tasks: [],
|
|
activeTaskIndex: 0,
|
|
};
|
|
return {
|
|
...prevTaskPlan_,
|
|
tasks: prevTaskPlan_.tasks.map((task) => {
|
|
if (task.id === taskId) {
|
|
const updatedRevisions = [...task.planRevisions];
|
|
const activeRevision = updatedRevisions[task.activeRevisionIndex];
|
|
updatedRevisions[task.activeRevisionIndex] = {
|
|
...activeRevision,
|
|
plans: activeRevision.plans.map((item) =>
|
|
item.index === planItemIndex
|
|
? { ...item, plan: newPlan }
|
|
: item,
|
|
),
|
|
};
|
|
return { ...task, planRevisions: updatedRevisions };
|
|
}
|
|
return task;
|
|
}),
|
|
};
|
|
});
|
|
console.log(
|
|
`Edited plan item ${planItemIndex} in task ${taskId}: ${newPlan}`,
|
|
);
|
|
};
|
|
|
|
const handleAddPlanItem = (taskId: string, plan: string) => {
|
|
setTaskPlan((prevTaskPlan) => {
|
|
const prevTaskPlan_ = prevTaskPlan ?? {
|
|
tasks: [],
|
|
activeTaskIndex: 0,
|
|
};
|
|
return {
|
|
...prevTaskPlan_,
|
|
tasks: prevTaskPlan_.tasks.map((task) => {
|
|
if (task.id === taskId) {
|
|
const updatedRevisions = [...task.planRevisions];
|
|
const activeRevision = updatedRevisions[task.activeRevisionIndex];
|
|
const maxIndex = Math.max(
|
|
...activeRevision.plans.map((item) => item.index),
|
|
0,
|
|
);
|
|
const newPlanItem = {
|
|
index: maxIndex + 1,
|
|
plan,
|
|
completed: false,
|
|
};
|
|
|
|
updatedRevisions[task.activeRevisionIndex] = {
|
|
...activeRevision,
|
|
plans: [...activeRevision.plans, newPlanItem],
|
|
};
|
|
return { ...task, planRevisions: updatedRevisions };
|
|
}
|
|
return task;
|
|
}),
|
|
};
|
|
});
|
|
console.log(`Added new plan item to task ${taskId}: ${plan}`);
|
|
};
|
|
|
|
const handleDeletePlanItem = (taskId: string, planItemIndex: number) => {
|
|
setTaskPlan((prevTaskPlan) => {
|
|
const prevTaskPlan_ = prevTaskPlan ?? {
|
|
tasks: [],
|
|
activeTaskIndex: 0,
|
|
};
|
|
return {
|
|
...prevTaskPlan_,
|
|
tasks: prevTaskPlan_.tasks.map((task) => {
|
|
if (task.id === taskId) {
|
|
const updatedRevisions = [...task.planRevisions];
|
|
const activeRevision = updatedRevisions[task.activeRevisionIndex];
|
|
updatedRevisions[task.activeRevisionIndex] = {
|
|
...activeRevision,
|
|
plans: activeRevision.plans.filter(
|
|
(item) => item.index !== planItemIndex,
|
|
),
|
|
};
|
|
return { ...task, planRevisions: updatedRevisions };
|
|
}
|
|
return task;
|
|
}),
|
|
};
|
|
});
|
|
console.log(`Deleted plan item ${planItemIndex} from task ${taskId}`);
|
|
};
|
|
|
|
return {
|
|
taskPlan,
|
|
handleTaskChange,
|
|
handleRevisionChange,
|
|
handleEditPlanItem,
|
|
handleAddPlanItem,
|
|
handleDeletePlanItem,
|
|
};
|
|
}
|