import { useColorMode } from "@chakra-ui/react"; import { useRef, useState } from "react"; import { TaskControls } from "src/components/Survey/TaskControls"; import { CreateTask } from "src/components/Tasks/CreateTask"; import { EvaluateTask } from "src/components/Tasks/EvaluateTask"; import { LabelTask } from "src/components/Tasks/LabelTask"; import { TaskCategory, TaskInfo, TaskTypes } from "src/components/Tasks/TaskTypes"; import { UnchangedWarning } from "src/components/Tasks/UnchangedWarning"; import poster from "src/lib/poster"; import { TaskContent } from "src/types/Task"; import { TaskReplyState } from "src/types/TaskReplyState"; import useSWRMutation from "swr/mutation"; export type TaskStatus = "NOT_SUBMITTABLE" | "DEFAULT" | "SUBMITABLE" | "SUBMITTED"; export interface TaskSurveyProps { // we need a task type // eslint-disable-next-line @typescript-eslint/no-explicit-any task: any; taskType: TaskInfo; onReplyChanged: (state: TaskReplyState) => void; } export const Task = ({ task, trigger, mutate }) => { const [taskStatus, setTaskStatus] = useState("NOT_SUBMITTABLE"); const replyContent = useRef(null); const [showUnchangedWarning, setShowUnchangedWarning] = useState(false); const taskType = TaskTypes.find((taskType) => taskType.type === task.type); const { colorMode } = useColorMode(); const mainBgClasses = colorMode === "light" ? "bg-slate-300 text-gray-900" : "bg-slate-900 text-white"; const { trigger: sendRejection } = useSWRMutation("/api/reject_task", poster, { onSuccess: async () => { mutate(); }, }); const rejectTask = (reason: string) => { sendRejection({ id: task.id, reason, }); }; const onReplyChanged = useRef((state: TaskReplyState) => { if (taskStatus === "SUBMITTED") return; replyContent.current = state?.content; if (state === null) { if (taskStatus !== "NOT_SUBMITTABLE") setTaskStatus("NOT_SUBMITTABLE"); } else if (state.state === "DEFAULT") { if (taskStatus !== "DEFAULT") setTaskStatus("DEFAULT"); } else if (state.state === "VALID") { if (taskStatus !== "SUBMITABLE") setTaskStatus("SUBMITABLE"); } }).current; const submitResponse = () => { switch (taskStatus) { case "NOT_SUBMITTABLE": return; case "DEFAULT": setShowUnchangedWarning(true); break; case "SUBMITABLE": { trigger({ id: task.id, update_type: taskType.update_type, content: replyContent.current, }); setTaskStatus("SUBMITTED"); break; } case "SUBMITTED": return; } }; function taskTypeComponent() { switch (taskType.category) { case TaskCategory.Create: return ; case TaskCategory.Evaluate: return ; case TaskCategory.Label: return ; } } return (
{taskTypeComponent()} setShowUnchangedWarning(false)} onSubmitAnyway={() => { if (taskStatus === "DEFAULT") { trigger({ id: task.id, update_type: taskType.update_type, content: replyContent.current, }); setTaskStatus("SUBMITTED"); setShowUnchangedWarning(false); } }} />
); };