import { Box, CircularProgress, Flex, HStack, StackDivider, StackProps, Text, TextProps } from "@chakra-ui/react"; import { boolean } from "boolean"; import { useState } from "react"; import { MessageTableEntry } from "src/components/Messages/MessageTableEntry"; import fetcher from "src/lib/fetcher"; import useSWR from "swr"; const MessageHeaderProps: TextProps = { align: "center", fontSize: "xl", py: "2", }; const MessageStackProps: StackProps = { spacing: "2", alignItems: "start", justifyContent: "center", divider: , }; interface MessageWithChildrenProps { id: string; depth?: number; maxDepth?: number; isOnlyChild?: boolean; } export function MessageWithChildren(props: MessageWithChildrenProps) { const { id, depth, maxDepth, isOnlyChild = true } = 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: () => { setMessage(null); }, }); const { isLoading: isLoadingChildren } = useSWR(id ? `/api/messages/${id}/children` : null, fetcher, { onSuccess: (data) => { setChildren(data); }, onError: () => { setChildren(null); }, }); const renderRecursive = maxDepth && ((depth && depth < maxDepth) || !depth); const isFirst = depth === 0 || !depth; const isFirstOrOnly = isFirst || boolean(isOnlyChild); if (isLoading || isLoadingChildren) { return ; } return ( <> {message && ( <> {isFirst ? "Message" : depth === 1 ? "Children" : "Ancestor"} )} {children && Array.isArray(children) && children.length > 0 ? ( renderRecursive ? ( {children.map((item, idx) => ( ))} ) : ( <> {isFirstOrOnly ? "Children" : "Ancestor"} {children.map((item, idx) => ( ))} ) ) : ( <> )} ); }