import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { usePathname, useSearchParams } from "next/navigation"; import useSWR from "swr"; import { cn } from "@plane/editor"; import { generateQueryParams } from "@/helpers/router.helper"; import { useUser } from "@/hooks/store"; import { useAppRouter } from "@/hooks/use-app-router"; import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePiChat } from "@/plane-web/hooks/store/use-pi-chat"; import { NewConversation, Messages } from "./conversation"; import { Loading } from "./conversation/loading"; import { Header } from "./header"; import { History } from "./history"; import { InputBox } from "./input"; export const PiChatBase = observer(() => { const [isSidePanelOpen, setIsSidePanelOpen] = useState(false); // store hooks const { initPiChat, activeChatId, isPiTyping, isUserTyping, activeChat, fetchUserThreads, geUserThreads, fetchChatById, fetchModels, setActiveModel, getTemplates, isNewChat, isLoading, models, activeModel, } = usePiChat(); const { isMobile } = usePlatformOS(); const { data: currentUser } = useUser(); // router const router = useAppRouter(); // query params const pathName = usePathname(); const searchParams = useSearchParams(); const chat_id = searchParams.get("chat_id"); // derived states const userThreads = currentUser && geUserThreads(currentUser?.id); const isFullScreen = pathName.includes("pi-chat"); useSWR(currentUser ? `PI_AI_MODELS` : null, currentUser ? () => fetchModels() : null, { revalidateOnFocus: false, revalidateIfStale: false, errorRetryCount: 0, }); useSWR( currentUser ? `PI_USER_THREADS_${currentUser?.id}` : null, currentUser ? () => fetchUserThreads(currentUser?.id) : null, { revalidateOnFocus: false, revalidateIfStale: false, errorRetryCount: 0, } ); useSWR( activeChatId ? `PI_ACTIVE_CHAT_${activeChatId}` : null, activeChatId ? () => fetchChatById(activeChatId) : null, { revalidateOnFocus: false, revalidateIfStale: false, errorRetryCount: 0, } ); const { data: templates } = useSWR("PI_TEMPLATES", () => getTemplates(), { revalidateOnFocus: false, revalidateIfStale: false, errorRetryCount: 0, }); useEffect(() => { initPiChat(chat_id || undefined); }, []); useEffect(() => { if (!chat_id) { const query = generateQueryParams(searchParams, ["chat_id"]); router.push(`${pathName}?${query && `${query}&`}chat_id=${activeChatId}`); } }, [activeChatId]); const toggleSidePanel = (value: boolean) => setIsSidePanelOpen(value); return (
{/* Header */}
{/* Current conversation */} {currentUser && activeChat?.dialogue?.length > 0 && !isLoading && ( )} {/* New conversation */} {isLoading && !isNewChat && currentUser ? ( // loading ) : ( activeChat?.dialogue?.length === 0 && ( ) )} {/* Chat Input */}
{/* History */} {isFullScreen && ( )}
); });