From 0987a64a85d5399c8d906833cb2bdb98edaf5f4e Mon Sep 17 00:00:00 2001 From: AbdBarho Date: Tue, 27 Dec 2022 11:14:21 +0100 Subject: [PATCH] Implement `*_reply` for the web Also, start extracting shared components --- website/src/components/Button.tsx | 19 +++++ website/src/components/Messages.tsx | 18 +++++ website/src/components/TwoColumns.tsx | 14 ++++ website/src/pages/create/assistant_reply.tsx | 83 +++++++++++++++++++ website/src/pages/create/user_reply.tsx | 84 ++++++++++++++++++++ website/src/pages/index.tsx | 6 ++ 6 files changed, 224 insertions(+) create mode 100644 website/src/components/Button.tsx create mode 100644 website/src/components/Messages.tsx create mode 100644 website/src/components/TwoColumns.tsx create mode 100644 website/src/pages/create/assistant_reply.tsx create mode 100644 website/src/pages/create/user_reply.tsx diff --git a/website/src/components/Button.tsx b/website/src/components/Button.tsx new file mode 100644 index 00000000..5ae1e7b4 --- /dev/null +++ b/website/src/components/Button.tsx @@ -0,0 +1,19 @@ +import clsx from "clsx"; + +export const Button = ( + props: React.DetailedHTMLProps, HTMLButtonElement> +) => { + const { className, children, ...rest } = props; + return ( + + ); +}; diff --git a/website/src/components/Messages.tsx b/website/src/components/Messages.tsx new file mode 100644 index 00000000..4bc747d5 --- /dev/null +++ b/website/src/components/Messages.tsx @@ -0,0 +1,18 @@ +export interface Message { + text: string; + is_assistant: boolean; +} + +const getColor = (isAssistant: boolean) => (isAssistant ? "bg-slate-800" : "bg-sky-900"); + +export const Messages = ({ messages }: { messages: Message[] }) => { + const items = messages.map(({ text, is_assistant }: Message, i: number) => { + return ( +
+ {text} +
+ ); + }); + // Maybe also show a legend of the colors? + return <>{items}; +}; diff --git a/website/src/components/TwoColumns.tsx b/website/src/components/TwoColumns.tsx new file mode 100644 index 00000000..5792f7d0 --- /dev/null +++ b/website/src/components/TwoColumns.tsx @@ -0,0 +1,14 @@ +export const TwoColumns = ({ children }: { children: React.ReactNode[] }) => { + if (!Array.isArray(children) || children.length !== 2) { + throw new Error("TwoColumns expects 2 children"); + } + + const [first, second] = children; + + return ( +
+
{first}
+
{second}
+
+ ); +}; diff --git a/website/src/pages/create/assistant_reply.tsx b/website/src/pages/create/assistant_reply.tsx new file mode 100644 index 00000000..14e78e54 --- /dev/null +++ b/website/src/pages/create/assistant_reply.tsx @@ -0,0 +1,83 @@ +import { Textarea } from "@chakra-ui/react"; +import { useRef, useState } from "react"; +import useSWRMutation from "swr/mutation"; +import useSWRImmutable from "swr/immutable"; + +import fetcher from "src/lib/fetcher"; +import poster from "src/lib/poster"; +import { Messages } from "src/components/Messages"; +import { TwoColumns } from "src/components/TwoColumns"; +import { Button } from "src/components/Button"; + +const AssistantReply = () => { + const [tasks, setTasks] = useState([]); + + const inputRef = useRef(null); + + const { isLoading } = useSWRImmutable("/api/new_task/assistant_reply ", fetcher, { + onSuccess: (data) => { + console.log(data); + setTasks([data]); + }, + }); + + const { trigger, isMutating } = useSWRMutation("/api/update_task", poster, { + onSuccess: async (data) => { + const newTask = await data.json(); + setTasks((oldTasks) => [...oldTasks, newTask]); + }, + }); + + const submitResponse = (task: { id: string }) => { + const text = inputRef.current.value.trim(); + trigger({ + id: task.id, + update_type: "text_reply_to_post", + content: { + text, + }, + }); + }; + + /** + * TODO: Make this a nicer loading screen. + */ + if (tasks.length == 0) { + return
Loading...
; + } + + const task = tasks[0].task; + return ( +
+ + <> +
Reply as the assistant
+

Given the following conversation, provide an adequate reply

+ + +