From 805bc33ba42ea74ec0e471f26d7d5f947d92559e Mon Sep 17 00:00:00 2001 From: Adrian Cowan Date: Wed, 11 Jan 2023 01:53:51 +1100 Subject: [PATCH] website: Unify task controls Also happens to fix some issues with the no-changes are-you-sure dialog only appearing once and other form values not being reset correctly. --- .../src/components/Survey/TaskControls.tsx | 26 ++-- .../Survey/TaskControlsOverridable.tsx | 60 -------- website/src/components/Tasks/CreateTask.tsx | 80 ++++------- website/src/components/Tasks/EvaluateTask.tsx | 83 ++++------- website/src/components/Tasks/LabelTask.tsx | 96 ++++++------- website/src/components/Tasks/Task.tsx | 129 ++++++++++++------ website/src/components/Tasks/TaskTypes.tsx | 18 +++ .../src/components/Tasks/UnchangedWarning.tsx | 42 ++++++ website/src/pages/create/assistant_reply.tsx | 2 +- website/src/pages/create/initial_prompt.tsx | 2 +- website/src/pages/create/summarize_story.tsx | 11 +- website/src/pages/create/user_reply.tsx | 2 +- .../pages/evaluate/rank_assistant_replies.tsx | 2 +- .../pages/evaluate/rank_initial_prompts.tsx | 2 +- .../src/pages/evaluate/rank_user_replies.tsx | 2 +- website/src/pages/evaluate/rate_summary.tsx | 11 +- .../src/pages/label/label_assistant_reply.tsx | 2 +- .../src/pages/label/label_initial_prompt.tsx | 2 +- .../src/pages/label/label_prompter_reply.tsx | 2 +- website/src/types/Task.ts | 4 + website/src/types/TaskReplyState.ts | 10 ++ 21 files changed, 293 insertions(+), 295 deletions(-) delete mode 100644 website/src/components/Survey/TaskControlsOverridable.tsx create mode 100644 website/src/components/Tasks/UnchangedWarning.tsx create mode 100644 website/src/types/TaskReplyState.ts diff --git a/website/src/components/Survey/TaskControls.tsx b/website/src/components/Survey/TaskControls.tsx index 7f419fcb..f451d871 100644 --- a/website/src/components/Survey/TaskControls.tsx +++ b/website/src/components/Survey/TaskControls.tsx @@ -4,21 +4,22 @@ import clsx from "clsx"; import { SkipButton } from "src/components/Buttons/Skip"; import { SubmitButton } from "src/components/Buttons/Submit"; import { TaskInfo } from "src/components/TaskInfo/TaskInfo"; +import { TaskStatus } from "src/components/Tasks/Task"; export interface TaskControlsProps { // we need a task type // eslint-disable-next-line @typescript-eslint/no-explicit-any - tasks: any[]; + task: any; className?: string; - onSubmitResponse: (task: { id: string }) => void; - onSkipTask: (task: { id: string }, reason: string) => void; + taskStatus: TaskStatus; + onSubmit: () => void; + onSkip: (reason: string) => void; onNextTask: () => void; } export const TaskControls = (props: TaskControlsProps) => { const { colorMode } = useColorMode(); const isLightMode = colorMode === "light"; - const endTask = props.tasks[props.tasks.length - 1]; return (
{ } )} > - + - { - props.onSkipTask(props.tasks[0], reason); - }} - /> - {endTask.task.type !== "task_done" ? ( - props.onSubmitResponse(props.tasks[0])}> + + {props.taskStatus !== "SUBMITTED" ? ( + Submit ) : ( diff --git a/website/src/components/Survey/TaskControlsOverridable.tsx b/website/src/components/Survey/TaskControlsOverridable.tsx deleted file mode 100644 index 25e973fb..00000000 --- a/website/src/components/Survey/TaskControlsOverridable.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { - Button, - Flex, - Modal, - ModalBody, - ModalCloseButton, - ModalContent, - ModalFooter, - ModalHeader, - ModalOverlay, - useDisclosure, -} from "@chakra-ui/react"; -import { TaskControls, TaskControlsProps } from "src/components/Survey/TaskControls"; - -interface TaskControlsOverridableProps extends TaskControlsProps { - isValid: boolean; - prepareForSubmit: () => void; -} - -export const TaskControlsOverridable = (props: TaskControlsOverridableProps) => { - const { isValid, onSubmitResponse, ...rest } = props; - const { isOpen: isModalOpen, onOpen: onOpenModal, onClose: onModalClose } = useDisclosure(); - - const unchangedResponsePrompt = () => { - onOpenModal(); - - // Ideally this happens when the user clicks submit, but we can't - // reliably wait for it to be executed before submitting the response - // without significant refactoring. - // As a result, modal will only display once even if the user doesn't proceed - props.prepareForSubmit(); - }; - - const onSubmitResponseOverride = () => { - onSubmitResponse(props.tasks[0]); - onModalClose(); - }; - - return ( - <> - - - - - Order Unchanged - You have not changed the order of the prompts. Are you sure you would like to submit? - - - - - - - - - - - ); -}; diff --git a/website/src/components/Tasks/CreateTask.tsx b/website/src/components/Tasks/CreateTask.tsx index a424315a..ad1aca3b 100644 --- a/website/src/components/Tasks/CreateTask.tsx +++ b/website/src/components/Tasks/CreateTask.tsx @@ -1,70 +1,38 @@ import { useState } from "react"; import { Messages } from "src/components/Messages"; -import { TaskControls } from "src/components/Survey/TaskControls"; import { TrackedTextarea } from "src/components/Survey/TrackedTextarea"; import { TwoColumnsWithCards } from "src/components/Survey/TwoColumnsWithCards"; -import { TaskInfo } from "src/components/Tasks/TaskTypes"; +import { TaskSurveyProps } from "src/components/Tasks/Task"; -export interface CreateTaskProps { - // we need a task type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - tasks: any[]; - taskType: TaskInfo; - trigger: (update: { id: string; update_type: string; content: { text: string } }) => void; - onSkipTask: (task: { id: string }, reason: string) => void; - onNextTask: () => void; - mainBgClasses: string; -} -export const CreateTask = ({ tasks, taskType, trigger, onSkipTask, onNextTask, mainBgClasses }: CreateTaskProps) => { - const task = tasks[0].task; - const valid_labels = tasks[0].valid_labels; +export const CreateTask = ({ task, taskType, onReplyChanged }: TaskSurveyProps<{ text: string }>) => { const [inputText, setInputText] = useState(""); - const submitResponse = (task: { id: string }) => { - const text = inputText.trim(); - trigger({ - id: task.id, - update_type: "text_reply_to_message", - content: { - text, - }, - }); - }; + const valid_labels = task.valid_labels; const textChangeHandler = (event: React.ChangeEvent) => { - setInputText(event.target.value); + const text = event.target.value; + onReplyChanged({ content: { text }, state: "VALID" }); + setInputText(text); }; return ( -
- - <> -
{taskType.label}
-

{taskType.overview}

- {task.conversation ? ( - - ) : null} - - <> -
{taskType.instruction}
- - -
- - { - setInputText(""); - onSkipTask(task, reason); - }} - onNextTask={onNextTask} - /> -
+ + <> +
{taskType.label}
+

{taskType.overview}

+ {task.conversation ? ( + + ) : null} + + <> +
{taskType.instruction}
+ + +
); }; diff --git a/website/src/components/Tasks/EvaluateTask.tsx b/website/src/components/Tasks/EvaluateTask.tsx index 61ed3889..9d69d73c 100644 --- a/website/src/components/Tasks/EvaluateTask.tsx +++ b/website/src/components/Tasks/EvaluateTask.tsx @@ -1,63 +1,40 @@ -import { useState } from "react"; +import { useEffect } from "react"; +import { MessageTable } from "src/components/Messages/MessageTable"; import { Sortable } from "src/components/Sortable/Sortable"; import { SurveyCard } from "src/components/Survey/SurveyCard"; -import { TaskControlsOverridable } from "src/components/Survey/TaskControlsOverridable"; +import { TaskSurveyProps } from "src/components/Tasks/Task"; -import { MessageTable } from "../Messages/MessageTable"; - -export interface EvaluateTaskProps { - // we need a task type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - tasks: any[]; - trigger: (update: { id: string; update_type: string; content: { ranking: number[] } }) => void; - onSkipTask: (task: { id: string }, reason: string) => void; - onNextTask: () => void; - mainBgClasses: string; -} - -export const EvaluateTask = ({ tasks, trigger, onSkipTask, onNextTask, mainBgClasses }: EvaluateTaskProps) => { - const [ranking, setRanking] = useState([]); - const submitResponse = (task) => { - trigger({ - id: task.id, - update_type: "message_ranking", - content: { - ranking, - }, - }); - }; - - let messages = null; - if (tasks[0].task.conversation) { - messages = tasks[0].task.conversation.messages; +export const EvaluateTask = ({ task, onReplyChanged }: TaskSurveyProps<{ ranking: number[] }>) => { + let messages = []; + if (task.conversation) { + messages = task.conversation.messages; messages = messages.map((message, index) => ({ ...message, id: index })); } - const valid_labels = tasks[0].valid_labels; - const sortables = tasks[0].task.replies ? "replies" : "prompts"; + useEffect(() => { + const conversationMsgs = task.conversation ? task.conversation.messages : []; + const defaultRanking = conversationMsgs.map((message, index) => index); + onReplyChanged({ + content: { ranking: defaultRanking }, + state: "DEFAULT", + }); + }, [task.conversation, onReplyChanged]); + + const onRank = (newRanking: number[]) => { + onReplyChanged({ content: { ranking: newRanking }, state: "VALID" }); + }; + + const valid_labels = task.valid_labels; + const sortables = task.replies ? "replies" : "prompts"; return ( -
- -
Instructions
-

- Given the following {sortables}, sort them from best to worst, best being first, worst being last. -

- {messages ? : null} - -
- - setRanking(tasks[0].task[sortables].map((_, idx) => idx))} - onSubmitResponse={submitResponse} - onSkipTask={(task, reason) => { - setRanking([]); - onSkipTask(task, reason); - }} - onNextTask={onNextTask} - /> -
+ +
Instructions
+

+ Given the following {sortables}, sort them from best to worst, best being first, worst being last. +

+ + +
); }; diff --git a/website/src/components/Tasks/LabelTask.tsx b/website/src/components/Tasks/LabelTask.tsx index 966c0a53..4b94c947 100644 --- a/website/src/components/Tasks/LabelTask.tsx +++ b/website/src/components/Tasks/LabelTask.tsx @@ -3,70 +3,55 @@ import { useColorMode } from "@chakra-ui/react"; import { useEffect, useId, useState } from "react"; import { MessageView } from "src/components/Messages"; import { MessageTable } from "src/components/Messages/MessageTable"; -import { TaskControls } from "src/components/Survey/TaskControls"; import { TwoColumnsWithCards } from "src/components/Survey/TwoColumnsWithCards"; -import { TaskInfo } from "src/components/Tasks/TaskTypes"; +import { TaskSurveyProps } from "src/components/Tasks/Task"; import { TaskType } from "src/types/Task"; import { colors } from "styles/Theme/colors"; -export interface LabelTaskProps { - // we need a task type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - tasks: any[]; - taskType: TaskInfo; - trigger: (update: { - id: string; - update_type: string; - content: { text: string; labels: { [k: string]: number }; message_id: string }; - }) => void; - onSkipTask: (task: { id: string }, reason: string) => void; - onNextTask: () => void; - mainBgClasses: string; -} -export const LabelTask = ({ tasks, taskType, trigger, onSkipTask, onNextTask, mainBgClasses }: LabelTaskProps) => { - const task = tasks[0].task; - const valid_labels = tasks[0].valid_labels; - +export const LabelTask = ({ + task, + taskType, + onReplyChanged, +}: TaskSurveyProps<{ text: string; labels: { [k: string]: number }; message_id: string }>) => { const [sliderValues, setSliderValues] = useState([]); - const submitResponse = (task: { id: string; reply: string; message_id: string }) => { + const valid_labels = task.valid_labels; + + useEffect(() => { + onReplyChanged({ content: { labels: {}, text: task.reply, message_id: task.message_id }, state: "DEFAULT" }); + }, [task.reply, task.message_id, onReplyChanged]); + + const onSliderChange = (values: number[]) => { console.assert(valid_labels.length === sliderValues.length); - const labels = Object.fromEntries(valid_labels.valid_labels.map((label, i) => [label, sliderValues[i]])); - trigger({ - id: task.id, - update_type: "text_labels", - content: { labels, text: task.reply, message_id: task.message_id }, - }); + const labels = Object.fromEntries(valid_labels.map((label, i) => [label, sliderValues[i]])); + onReplyChanged({ content: { labels, text: task.reply, message_id: task.message_id }, state: "VALID" }); + setSliderValues(values); }; return ( -
- - <> -
{taskType.label}
-

{taskType.overview}

+ + <> +
{taskType.label}
+

{taskType.overview}

- {task.conversation ? ( - - ) : ( - - )} - - -
- - -
+ {task.conversation ? ( + + ) : ( + + )} + + + ); }; @@ -79,10 +64,6 @@ interface LabelSliderGroupProps { export const LabelSliderGroup = ({ labelIDs, onChange }: LabelSliderGroupProps) => { const [sliderValues, setSliderValues] = useState(Array.from({ length: labelIDs.length }).map(() => 0)); - useEffect(() => { - onChange(sliderValues); - }, [sliderValues, onChange]); - return ( {labelIDs.map((labelId, idx) => ( @@ -93,6 +74,7 @@ export const LabelSliderGroup = ({ labelIDs, onChange }: LabelSliderGroupProps) sliderHandler={(sliderValue) => { const newState = sliderValues.slice(); newState[idx] = sliderValue; + onChange(sliderValues); setSliderValues(newState); }} /> diff --git a/website/src/components/Tasks/Task.tsx b/website/src/components/Tasks/Task.tsx index e95fe3e2..cd4ddeed 100644 --- a/website/src/components/Tasks/Task.tsx +++ b/website/src/components/Tasks/Task.tsx @@ -1,13 +1,32 @@ 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, TaskTypes } from "src/components/Tasks/TaskTypes"; +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 const Task = ({ tasks, trigger, mutate }) => { - const task = tasks[0].task; +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-800" : "bg-slate-900 text-white"; @@ -18,51 +37,85 @@ export const Task = ({ tasks, trigger, mutate }) => { }, }); - const rejectTask = (task: { id: string }, reason: string) => { + const rejectTask = (reason: string) => { sendRejection({ id: task.id, reason, }); }; - function taskTypeComponent(type) { - const taskType = TaskTypes.find((taskType) => taskType.type === type); - const category = taskType.category; - switch (category) { + 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 ( - - ); + return ; case TaskCategory.Evaluate: - return ( - - ); + return ; case TaskCategory.Label: - return ( - - ); + return ; } } - return taskTypeComponent(task.type); + return ( +
+ {taskTypeComponent()} + + setShowUnchangedWarning(false)} + onSubmitAnyway={() => { + if (taskStatus === "DEFAULT") { + trigger({ + id: task.id, + update_type: taskType.update_type, + content: replyContent.current, + }); + setTaskStatus("SUBMITTED"); + setShowUnchangedWarning(false); + } + }} + /> +
+ ); }; diff --git a/website/src/components/Tasks/TaskTypes.tsx b/website/src/components/Tasks/TaskTypes.tsx index c9a978d6..f2e00df5 100644 --- a/website/src/components/Tasks/TaskTypes.tsx +++ b/website/src/components/Tasks/TaskTypes.tsx @@ -12,6 +12,9 @@ export interface TaskInfo { type: string; overview?: string; instruction?: string; + update_type: string; + unchanged_title?: string; + unchanged_message?: string; } export const TaskTypes: TaskInfo[] = [ @@ -24,6 +27,7 @@ export const TaskTypes: TaskInfo[] = [ type: "initial_prompt", overview: "Create an initial message to send to the assistant", instruction: "Provide the initial prompt", + update_type: "text_reply_to_message", }, { label: "Reply as User", @@ -33,6 +37,7 @@ export const TaskTypes: TaskInfo[] = [ type: "prompter_reply", overview: "Given the following conversation, provide an adequate reply", instruction: "Provide the user`s reply", + update_type: "text_reply_to_message", }, { label: "Reply as Assistant", @@ -42,6 +47,7 @@ export const TaskTypes: TaskInfo[] = [ type: "assistant_reply", overview: "Given the following conversation, provide an adequate reply", instruction: "Provide the assistant`s reply", + update_type: "text_reply_to_message", }, // evaluate { @@ -50,6 +56,9 @@ export const TaskTypes: TaskInfo[] = [ desc: "Help Open Assistant improve its responses to conversations with other users.", pathname: "/evaluate/rank_user_replies", type: "rank_prompter_replies", + update_type: "message_ranking", + unchanged_title: "Order Unchanged", + unchanged_message: "You have not changed the order of the prompts. Are you sure you would like to submit?", }, { label: "Rank Assistant Replies", @@ -57,6 +66,9 @@ export const TaskTypes: TaskInfo[] = [ category: TaskCategory.Evaluate, pathname: "/evaluate/rank_assistant_replies", type: "rank_assistant_replies", + update_type: "message_ranking", + unchanged_title: "Order Unchanged", + unchanged_message: "You have not changed the order of the prompts. Are you sure you would like to submit?", }, { label: "Rank Initial Prompts", @@ -64,6 +76,9 @@ export const TaskTypes: TaskInfo[] = [ category: TaskCategory.Evaluate, pathname: "/evaluate/rank_initial_prompts", type: "rank_initial_prompts", + update_type: "message_ranking", + unchanged_title: "Order Unchanged", + unchanged_message: "You have not changed the order of the prompts. Are you sure you would like to submit?", }, // label { @@ -73,6 +88,7 @@ export const TaskTypes: TaskInfo[] = [ pathname: "/label/label_initial_prompt", overview: "Provide labels for the following prompt", type: "label_initial_prompt", + update_type: "text_labels", }, { label: "Label Prompter Reply", @@ -81,6 +97,7 @@ export const TaskTypes: TaskInfo[] = [ pathname: "/label/label_prompter_reply", overview: "Given the following discussion, provide labels for the final promp", type: "label_prompter_reply", + update_type: "text_labels", }, { label: "Label Assistant Reply", @@ -89,5 +106,6 @@ export const TaskTypes: TaskInfo[] = [ pathname: "/label/label_assistant_reply", overview: "Given the following discussion, provide labels for the final prompt.", type: "label_assistant_reply", + update_type: "text_labels", }, ]; diff --git a/website/src/components/Tasks/UnchangedWarning.tsx b/website/src/components/Tasks/UnchangedWarning.tsx new file mode 100644 index 00000000..65d7b50d --- /dev/null +++ b/website/src/components/Tasks/UnchangedWarning.tsx @@ -0,0 +1,42 @@ +import { + Button, + Flex, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, +} from "@chakra-ui/react"; + +interface UnchangedWarningProps { + show: boolean; + title: string; + message: string; + onClose: () => void; + onSubmitAnyway: () => void; +} + +export const UnchangedWarning = (props: UnchangedWarningProps) => { + return ( + <> + + + + + {props.title} + {props.message} + + + + + + + + + + ); +}; diff --git a/website/src/pages/create/assistant_reply.tsx b/website/src/pages/create/assistant_reply.tsx index 6e389190..f078fa40 100644 --- a/website/src/pages/create/assistant_reply.tsx +++ b/website/src/pages/create/assistant_reply.tsx @@ -21,7 +21,7 @@ const AssistantReply = () => { Reply as Assistant - + ); }; diff --git a/website/src/pages/create/initial_prompt.tsx b/website/src/pages/create/initial_prompt.tsx index 20b36467..01b882f9 100644 --- a/website/src/pages/create/initial_prompt.tsx +++ b/website/src/pages/create/initial_prompt.tsx @@ -21,7 +21,7 @@ const InitialPrompt = () => { Reply as Assistant - + ); }; diff --git a/website/src/pages/create/summarize_story.tsx b/website/src/pages/create/summarize_story.tsx index 61415962..d551b8e6 100644 --- a/website/src/pages/create/summarize_story.tsx +++ b/website/src/pages/create/summarize_story.tsx @@ -36,10 +36,10 @@ const SummarizeStory = () => { // Trigger a mutation that updates the current task. We should probably // signal somewhere that this interaction is being processed. - const submitResponse = (task: { id: string }) => { + const submitResponse = () => { const text = inputText.trim(); trigger({ - id: task.id, + id: tasks[0].task.id, update_type: "text_reply_to_message", content: { text, @@ -88,9 +88,10 @@ const SummarizeStory = () => { diff --git a/website/src/pages/create/user_reply.tsx b/website/src/pages/create/user_reply.tsx index 41969e54..51a54b0e 100644 --- a/website/src/pages/create/user_reply.tsx +++ b/website/src/pages/create/user_reply.tsx @@ -21,7 +21,7 @@ const UserReply = () => { Reply as Assistant - + ); }; diff --git a/website/src/pages/evaluate/rank_assistant_replies.tsx b/website/src/pages/evaluate/rank_assistant_replies.tsx index 16eee130..6686a42f 100644 --- a/website/src/pages/evaluate/rank_assistant_replies.tsx +++ b/website/src/pages/evaluate/rank_assistant_replies.tsx @@ -21,7 +21,7 @@ const RankAssistantReplies = () => { Rank Assistant Replies - + ); }; diff --git a/website/src/pages/evaluate/rank_initial_prompts.tsx b/website/src/pages/evaluate/rank_initial_prompts.tsx index 0b305192..1350305b 100644 --- a/website/src/pages/evaluate/rank_initial_prompts.tsx +++ b/website/src/pages/evaluate/rank_initial_prompts.tsx @@ -21,7 +21,7 @@ const RankInitialPrompts = () => { Rank Initial Prompts - + ); }; diff --git a/website/src/pages/evaluate/rank_user_replies.tsx b/website/src/pages/evaluate/rank_user_replies.tsx index c269745f..0bd23c64 100644 --- a/website/src/pages/evaluate/rank_user_replies.tsx +++ b/website/src/pages/evaluate/rank_user_replies.tsx @@ -21,7 +21,7 @@ const RankUserReplies = () => { Rank User Replies - + ); }; diff --git a/website/src/pages/evaluate/rate_summary.tsx b/website/src/pages/evaluate/rate_summary.tsx index e9da4a63..3ea2448e 100644 --- a/website/src/pages/evaluate/rate_summary.tsx +++ b/website/src/pages/evaluate/rate_summary.tsx @@ -39,9 +39,9 @@ const RateSummary = () => { // Trigger a mutation that updates the current task. We should probably // signal somewhere that this interaction is being processed. - const submitResponse = (t) => { + const submitResponse = () => { trigger({ - id: t.id, + id: tasks[0].task.id, update_type: "message_rating", content: { rating: rating, @@ -103,9 +103,10 @@ const RateSummary = () => { diff --git a/website/src/pages/label/label_assistant_reply.tsx b/website/src/pages/label/label_assistant_reply.tsx index 945a612e..ffc3af4d 100644 --- a/website/src/pages/label/label_assistant_reply.tsx +++ b/website/src/pages/label/label_assistant_reply.tsx @@ -21,7 +21,7 @@ const LabelAssistantReply = () => { Label Assistant Reply - + ); }; diff --git a/website/src/pages/label/label_initial_prompt.tsx b/website/src/pages/label/label_initial_prompt.tsx index bfacfdbe..beea5ee8 100644 --- a/website/src/pages/label/label_initial_prompt.tsx +++ b/website/src/pages/label/label_initial_prompt.tsx @@ -21,7 +21,7 @@ const LabelInitialPrompt = () => { Label Initial Prompt - + ); }; diff --git a/website/src/pages/label/label_prompter_reply.tsx b/website/src/pages/label/label_prompter_reply.tsx index 3d47f74b..0eeaad33 100644 --- a/website/src/pages/label/label_prompter_reply.tsx +++ b/website/src/pages/label/label_prompter_reply.tsx @@ -21,7 +21,7 @@ const LabelPrompterReply = () => { Label Prompter Reply - + ); }; diff --git a/website/src/types/Task.ts b/website/src/types/Task.ts index 6975fa14..a681b2e5 100644 --- a/website/src/types/Task.ts +++ b/website/src/types/Task.ts @@ -12,6 +12,10 @@ export const enum TaskType { label_assistant_reply = "label_assistant_reply", } +// we need to reconsider how to handle task content types +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type TaskContent = any; + export interface ValidLabel { name: string; display_text: string; diff --git a/website/src/types/TaskReplyState.ts b/website/src/types/TaskReplyState.ts new file mode 100644 index 00000000..602446f9 --- /dev/null +++ b/website/src/types/TaskReplyState.ts @@ -0,0 +1,10 @@ +export interface TaskReplyValid { + content: T; + state: "VALID"; +} +export interface TaskReplyDefault { + content: T; + state: "DEFAULT"; +} + +export type TaskReplyState = TaskReplyValid | TaskReplyDefault;