Spaces:
Runtime error
Runtime error
| import clsx from "clsx"; | |
| import { AnimatePresence } from "framer-motion"; | |
| import { useTranslation } from "next-i18next"; | |
| import React from "react"; | |
| import { FaBars, FaTimesCircle } from "react-icons/fa"; | |
| import { v1 } from "uuid"; | |
| import Sidebar from "./Sidebar"; | |
| import { useAgentStore } from "../../stores"; | |
| import { useConfigStore } from "../../stores/configStore"; | |
| import { useTaskStore } from "../../stores/taskStore"; | |
| import type { Task as TaskType } from "../../types/task"; | |
| import { MESSAGE_TYPE_TASK, TASK_STATUS_STARTED } from "../../types/task"; | |
| import Button from "../Button"; | |
| import Input from "../Input"; | |
| import FadeIn from "../motions/FadeIn"; | |
| import { getMessageContainerStyle, getTaskStatusIcon } from "../utils/helpers"; | |
| const TaskSidebar = () => { | |
| const [customTask, setCustomTask] = React.useState(""); | |
| const agent = useAgentStore.use.agent(); | |
| const tasks = useTaskStore.use.tasks(); | |
| const addTask = useTaskStore.use.addTask(); | |
| const [t] = useTranslation(); | |
| const { layout, setLayout } = useConfigStore(); | |
| const setShow = (show: boolean) => { | |
| setLayout({ showRightSidebar: show }); | |
| }; | |
| const handleAddTask = () => { | |
| addTask({ | |
| id: v1().toString(), | |
| taskId: v1().toString(), | |
| value: customTask, | |
| status: TASK_STATUS_STARTED, | |
| type: MESSAGE_TYPE_TASK, | |
| }); | |
| setCustomTask(""); | |
| }; | |
| return ( | |
| <Sidebar | |
| show={layout.showRightSidebar} | |
| setShow={setShow} | |
| side="right" | |
| className="border-slate-6s border-l" | |
| > | |
| <div className="flex h-screen flex-col gap-2 text-slate-12"> | |
| <div className="flex flex-row items-center gap-1"> | |
| <button | |
| className="neutral-button-primary rounded-md border-none transition-all" | |
| onClick={() => setShow(!layout.showRightSidebar)} | |
| > | |
| <FaBars size="15" className="z-20 m-2" /> | |
| </button> | |
| <div className="ml-5 font-bold">{t("Current tasks")}</div> | |
| </div> | |
| <div className="flex flex-1 flex-col gap-2 overflow-auto pr-1"> | |
| {tasks.length == 0 && ( | |
| <p className="w-full p-2 text-slate-11"> | |
| This window will display agent tasks as they are created. | |
| </p> | |
| )} | |
| <AnimatePresence> | |
| {tasks.map((task) => ( | |
| <Task key={`${task.id || ""} ${task.taskId || ""}`} task={task} /> | |
| ))} | |
| </AnimatePresence> | |
| </div> | |
| <div className="flex flex-row gap-1"> | |
| <Input | |
| value={customTask} | |
| onChange={(e) => setCustomTask(e.target.value)} | |
| placeholder={"Custom task"} | |
| small | |
| /> | |
| <Button | |
| className="font-sm px-2 py-[0] text-sm sm:px-2 sm:py-[0]" | |
| onClick={handleAddTask} | |
| disabled={!customTask || agent == null} | |
| > | |
| Add | |
| </Button> | |
| </div> | |
| </div> | |
| </Sidebar> | |
| ); | |
| }; | |
| const Task = ({ task }: { task: TaskType }) => { | |
| const isAgentStopped = useAgentStore.use.lifecycle() === "stopped"; | |
| const deleteTask = useTaskStore.use.deleteTask(); | |
| const isTaskDeletable = task.taskId && !isAgentStopped && task.status === "started"; | |
| const handleDeleteTask = () => { | |
| if (isTaskDeletable) { | |
| deleteTask(task.taskId as string); | |
| } | |
| }; | |
| return ( | |
| <FadeIn> | |
| <div | |
| className={clsx( | |
| "w-full rounded-md bg-slate-1 p-2 text-sm text-slate-12 shadow-depth-1", | |
| isAgentStopped && "opacity-50", | |
| getMessageContainerStyle(task) | |
| )} | |
| > | |
| {getTaskStatusIcon(task, { isAgentStopped })} | |
| <span>{task.value}</span> | |
| <div className="flex justify-end"> | |
| <FaTimesCircle | |
| onClick={handleDeleteTask} | |
| className={clsx( | |
| isTaskDeletable && "cursor-pointer hover:text-red-500", | |
| !isTaskDeletable && "cursor-not-allowed opacity-30" | |
| )} | |
| /> | |
| </div> | |
| </div> | |
| </FadeIn> | |
| ); | |
| }; | |
| export default TaskSidebar; | |