From 2db310ab060b82c3f81d0cd19d85046f4344ab59 Mon Sep 17 00:00:00 2001 From: jojopirker Date: Fri, 6 Jan 2023 15:53:18 +0100 Subject: [PATCH] (#309) Message navigation recursive --- .../Messages/MessageWithChildren.tsx | 85 +++++++++++++++++++ website/src/pages/messages/[id]/index.tsx | 71 +++------------- 2 files changed, 99 insertions(+), 57 deletions(-) create mode 100644 website/src/components/Messages/MessageWithChildren.tsx diff --git a/website/src/components/Messages/MessageWithChildren.tsx b/website/src/components/Messages/MessageWithChildren.tsx new file mode 100644 index 00000000..f59017c7 --- /dev/null +++ b/website/src/components/Messages/MessageWithChildren.tsx @@ -0,0 +1,85 @@ +import { Box, CircularProgress, Flex, HStack, Text } from "@chakra-ui/react"; +import { useState } from "react"; +import useSWR from "swr"; + +import fetcher from "src/lib/fetcher"; +import { MessageTableEntry } from "./MessageTableEntry"; + +interface MessageWithChildrenProps { + id: string; + depth?: number; + maxDepth?: number; +} + +export function MessageWithChildren(props: MessageWithChildrenProps) { + const { id, depth, maxDepth } = props; + + const [message, setMessage] = useState(null); + const [children, setChildren] = useState(null); + + const { isLoading } = useSWR(id ? `/api/messages/${id}` : null, fetcher, { + onSuccess: (data) => { + setMessage(data); + }, + onError: (err, key, config) => { + setMessage(null); + }, + }); + const { isLoading: isLoadingChildren } = useSWR(id ? `/api/messages/${id}/children` : null, fetcher, { + onSuccess: (data) => { + setChildren(data); + }, + onError: (err, key, config) => { + setChildren(null); + }, + }); + + const renderRecursive = maxDepth && ((depth && (depth < maxDepth)) || !depth); + + if (isLoading || isLoadingChildren) { + return () + } + + return ( + <> + {message && (<> + + {(depth === 0 || !depth) ? "Message" : depth === 1 ? "Children" : "Ancestor"} + + + + + + + + + + )} + {children && Array.isArray(children) && children.length > 0 ? + renderRecursive ? + + {children.map((item, idx) => ( + + + ))} + : + ( + <> + + {(depth === 0 || !depth) ? "Children" : "Ancestor"} + + + {children.map((item, idx) => ( + + + + + + ))} + + + ) : <>} + ); + +} + diff --git a/website/src/pages/messages/[id]/index.tsx b/website/src/pages/messages/[id]/index.tsx index f1512d25..d455f256 100644 --- a/website/src/pages/messages/[id]/index.tsx +++ b/website/src/pages/messages/[id]/index.tsx @@ -1,42 +1,22 @@ -import { Box, Container, Text, HStack, useColorModeValue } from "@chakra-ui/react"; +import { Box, Container, Text, useColorModeValue } from "@chakra-ui/react"; import Head from "next/head"; import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; -import useSWRImmutable from "swr/immutable"; +import { useState } from "react"; +import useSWR from "swr"; import fetcher from "src/lib/fetcher"; import { MessageTableEntry } from "src/components/Messages/MessageTableEntry"; -import { colors } from "styles/Theme/colors"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; +import { MessageWithChildren } from "src/components/Messages/MessageWithChildren"; const MessageDetail = () => { - const bg = useColorModeValue("white", colors.dark.bg); + const mainBg = useColorModeValue("bg-slate-300", "bg-slate-900"); const router = useRouter(); const { id } = router.query; - /** State arrays of messages */ - const [message, setMessage] = useState(null); const [parent, setParent] = useState(null); - const [children, setChildren] = useState(null); - /** Fetching functions */ - const { isLoading } = useSWRImmutable(id ? `/api/messages/${id}` : null, fetcher, { - onSuccess: (data) => { - setMessage(data); - }, - onError: (err, key, config) => { - setMessage(null); - }, - }); - const { isLoading: isLoadingChildren } = useSWRImmutable(id ? `/api/messages/${id}/children` : null, fetcher, { - onSuccess: (data) => { - setChildren(data); - }, - onError: (err, key, config) => { - setChildren(null); - }, - }); - const { isLoading: isLoadingParent } = useSWRImmutable(id ? `/api/messages/${id}/parent` : null, fetcher, { + const { isLoading: isLoadingParent } = useSWR(id ? `/api/messages/${id}/parent` : null, fetcher, { onSuccess: (data) => { setParent(data); }, @@ -45,7 +25,7 @@ const MessageDetail = () => { }, }); - if (isLoading || isLoadingChildren || isLoadingParent) { + if (isLoadingParent) { return ; } return ( @@ -57,45 +37,22 @@ const MessageDetail = () => { content="Conversational AI for everyone. An open source project to create a chat enabled GPT LLM run by LAION and contributors around the world." /> -
- +
+ {parent && ( <> - + Parent - + )} - {message && ( - <> - - Message - - - - - - )} - {children && Array.isArray(children) && children.length > 0 && ( - <> - - Children - - - {children.map((item, idx) => ( - - - - - - ))} - - - )} + + +
);