"use client"; import styles from "./sharedChat.module.css"; import React, { Suspense, useEffect, useRef, useState } from "react"; import ChatHistory from "../../components/chatHistory/chatHistory"; import Loading from "../../components/loading/loading"; import "katex/dist/katex.min.css"; import { useIsMobileWidth, welcomeConsole } from "../../common/utils"; import { useAuthenticatedData } from "@/app/common/auth"; import { AttachedFileText, ChatInputArea, ChatOptions, } from "@/app/components/chatInputArea/chatInputArea"; import { StreamMessage } from "@/app/components/chatMessage/chatMessage"; import { AgentData } from "@/app/agents/page"; import { SidebarInset, SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"; import { AppSidebar } from "@/app/components/appSidebar/appSidebar"; import { Separator } from "@/components/ui/separator"; import { KhojLogoType } from "@/app/components/logo/khojLogo"; interface ChatBodyDataProps { chatOptionsData: ChatOptions | null; setTitle: (title: string) => void; setUploadedFiles: (files: AttachedFileText[]) => void; isMobileWidth?: boolean; publicConversationSlug: string; streamedMessages: StreamMessage[]; isLoggedIn: boolean; conversationId?: string; setQueryToProcess: (query: string) => void; setImages: (images: string[]) => void; } function ChatBodyData(props: ChatBodyDataProps) { const [message, setMessage] = useState(""); const [images, setImages] = useState([]); const [processingMessage, setProcessingMessage] = useState(false); const [agentMetadata, setAgentMetadata] = useState(null); const chatInputRef = useRef(null); const setQueryToProcess = props.setQueryToProcess; const streamedMessages = props.streamedMessages; const chatHistoryCustomClassName = props.isMobileWidth ? "w-full" : "w-4/6"; useEffect(() => { if (images.length > 0) { const encodedImages = images.map((image) => encodeURIComponent(image)); props.setImages(encodedImages); } }, [images, props.setImages]); useEffect(() => { if (message) { setProcessingMessage(true); setQueryToProcess(message); } }, [message, setQueryToProcess]); useEffect(() => { if ( streamedMessages && streamedMessages.length > 0 && streamedMessages[streamedMessages.length - 1].completed ) { setProcessingMessage(false); } else { setMessage(""); } }, [streamedMessages]); if (!props.publicConversationSlug && !props.conversationId) { return
Whoops, nothing to see here!
; } return ( <>
setMessage(message)} sendImage={(image) => setImages((prevImages) => [...prevImages, image])} sendDisabled={processingMessage} chatOptionsData={props.chatOptionsData} conversationId={props.conversationId} agentColor={agentMetadata?.color} isMobileWidth={props.isMobileWidth} setUploadedFiles={props.setUploadedFiles} setTriggeredAbort={() => {}} ref={chatInputRef} />
); } export default function SharedChat() { const [chatOptionsData, setChatOptionsData] = useState(null); const [isLoading, setLoading] = useState(true); const [title, setTitle] = useState("Khoj AI - Chat"); const [conversationId, setConversationID] = useState(undefined); const [messages, setMessages] = useState([]); const [queryToProcess, setQueryToProcess] = useState(""); const [uploadedFiles, setUploadedFiles] = useState(null); const [paramSlug, setParamSlug] = useState(undefined); const [images, setImages] = useState([]); const { data: authenticatedData, error: authenticationError, isLoading: authenticationLoading, } = useAuthenticatedData(); const isMobileWidth = useIsMobileWidth(); useEffect(() => { fetch("/api/chat/options") .then((response) => response.json()) .then((data: ChatOptions) => { setLoading(false); // Render chat options, if any if (data) { setChatOptionsData(data); } }) .catch((err) => { console.error(err); return; }); welcomeConsole(); setParamSlug(window.location.pathname.split("/").pop() || ""); }, []); useEffect(() => { if (uploadedFiles) { localStorage.setItem("uploadedFiles", JSON.stringify(uploadedFiles)); } }, [uploadedFiles]); useEffect(() => { if (queryToProcess && !conversationId) { // If the user has not yet started conversing in the chat, create a new conversation fetch(`/api/chat/share/fork?public_conversation_slug=${paramSlug}`, { method: "POST", headers: { "Content-Type": "application/json", }, }) .then((response) => response.json()) .then((data) => { setConversationID(data.conversation_id); localStorage.setItem("message", queryToProcess); if (images.length > 0) { localStorage.setItem("images", JSON.stringify(images)); } window.location.href = `/chat?conversationId=${data.conversation_id}`; }) .catch((err) => { console.error(err); return; }); return; } }, [queryToProcess, conversationId, paramSlug]); if (isLoading) { return ; } if (!paramSlug) { return
Whoops, nothing to see here!
; } return (
{paramSlug && (
{isMobileWidth ? ( ) : ( title && ( <>

{title}

) )}
)}
{title}
}>
); }