"use client"; import { motion } from "framer-motion"; import { usePathname } from "next/navigation"; import { useEffect, useState } from "react"; import { type ChatConversation, useGetConversationsQuery, } from "@/app/api/queries/useGetConversationsQuery"; import type { Settings } from "@/app/api/queries/useGetSettingsQuery"; import { OnboardingContent } from "@/app/onboarding/_components/onboarding-content"; import { ProgressBar } from "@/app/onboarding/_components/progress-bar"; import { AnimatedConditional } from "@/components/animated-conditional"; import { Header } from "@/components/header"; import { Navigation } from "@/components/navigation"; import { useAuth } from "@/contexts/auth-context"; import { useChat } from "@/contexts/chat-context"; import { ANIMATION_DURATION, HEADER_HEIGHT, ONBOARDING_ASSISTANT_MESSAGE_KEY, ONBOARDING_CARD_STEPS_KEY, ONBOARDING_SELECTED_NUDGE_KEY, ONBOARDING_STEP_KEY, ONBOARDING_UPLOAD_STEPS_KEY, SIDEBAR_WIDTH, TOTAL_ONBOARDING_STEPS, } from "@/lib/constants"; import { cn } from "@/lib/utils"; export function ChatRenderer({ settings, children, }: { settings: Settings | undefined; children: React.ReactNode; }) { const pathname = usePathname(); const { isAuthenticated, isNoAuthMode } = useAuth(); const { endpoint, refreshTrigger, refreshConversations, startNewConversation, } = useChat(); // Initialize onboarding state based on local storage and settings const [currentStep, setCurrentStep] = useState(() => { if (typeof window === "undefined") return 0; const savedStep = localStorage.getItem(ONBOARDING_STEP_KEY); return savedStep !== null ? parseInt(savedStep, 10) : 0; }); const [showLayout, setShowLayout] = useState(() => { if (typeof window === "undefined") return false; const savedStep = localStorage.getItem(ONBOARDING_STEP_KEY); // Show layout if settings.edited is true and if no onboarding step is saved const isEdited = settings?.edited ?? true; return isEdited ? savedStep === null : false; }); // Only fetch conversations on chat page const isOnChatPage = pathname === "/" || pathname === "/chat"; const { data: conversations = [], isLoading: isConversationsLoading } = useGetConversationsQuery(endpoint, refreshTrigger, { enabled: isOnChatPage && (isAuthenticated || isNoAuthMode), }) as { data: ChatConversation[]; isLoading: boolean }; const handleNewConversation = () => { refreshConversations(); startNewConversation(); }; // Save current step to local storage whenever it changes useEffect(() => { if (typeof window !== "undefined" && !showLayout) { localStorage.setItem(ONBOARDING_STEP_KEY, currentStep.toString()); } }, [currentStep, showLayout]); const handleStepComplete = () => { if (currentStep < TOTAL_ONBOARDING_STEPS - 1) { setCurrentStep(currentStep + 1); } else { // Onboarding is complete - remove from local storage and show layout if (typeof window !== "undefined") { localStorage.removeItem(ONBOARDING_STEP_KEY); localStorage.removeItem(ONBOARDING_ASSISTANT_MESSAGE_KEY); localStorage.removeItem(ONBOARDING_SELECTED_NUDGE_KEY); localStorage.removeItem(ONBOARDING_CARD_STEPS_KEY); localStorage.removeItem(ONBOARDING_UPLOAD_STEPS_KEY); } setShowLayout(true); } }; const handleStepBack = () => { if (currentStep > 0) { setCurrentStep(currentStep - 1); } }; const handleSkipOnboarding = () => { // Skip onboarding by marking it as complete if (typeof window !== "undefined") { localStorage.removeItem(ONBOARDING_STEP_KEY); localStorage.removeItem(ONBOARDING_ASSISTANT_MESSAGE_KEY); localStorage.removeItem(ONBOARDING_SELECTED_NUDGE_KEY); localStorage.removeItem(ONBOARDING_CARD_STEPS_KEY); localStorage.removeItem(ONBOARDING_UPLOAD_STEPS_KEY); } setShowLayout(true); }; // List of paths with smaller max-width const smallWidthPaths = ["/settings", "/upload"]; const isSmallWidthPath = smallWidthPaths.some((path) => pathname.startsWith(path), ); const x = showLayout ? "0px" : `calc(-${SIDEBAR_WIDTH / 2}px + 50vw)`; const y = showLayout ? "0px" : `calc(-${HEADER_HEIGHT / 2}px + 50vh)`; const translateY = showLayout ? "0px" : `-50vh`; const translateX = showLayout ? "0px" : `-50vw`; // For all other pages, render with Langflow-styled navigation and task menu return ( <>
{/* Sidebar Navigation */} {showLayout && ( )} {/* Main Content */}
{showLayout && (
{children}
)} {!showLayout && ( )}
); }