mlabonne's picture
Upload demo files (#1)
4fb0ce9
raw
history blame
1.86 kB
import { useEffect, useState } from "react";
import { LiquidIntro } from "./components/LiquidIntro";
import { LandingPage } from "./components/LandingPage";
import { ChatApp } from "./components/ChatApp";
import { useLLM } from "./hooks/useLLM";
import "katex/dist/katex.min.css";
function App() {
const { status, loadModel } = useLLM();
const [stage, setStage] = useState<"intro" | "app">("intro");
const [hasStarted, setHasStarted] = useState(false);
const [showChat, setShowChat] = useState(false);
const isReady = status.state === "ready";
const isLoading = hasStarted && !isReady && status.state !== "error";
const handleStart = () => {
setHasStarted(true);
loadModel();
};
const handleGoHome = () => {
setShowChat(false);
setTimeout(() => setHasStarted(false), 700);
};
useEffect(() => {
if (isReady && hasStarted) {
setShowChat(true);
}
}, [isReady, hasStarted]);
return (
<div className="relative h-screen w-screen brand-surface">
{stage === "intro" && (
<LiquidIntro onEnter={() => setStage("app")} />
)}
{stage === "app" && (
<>
<div
className={`absolute inset-0 z-10 transition-all duration-700 ${
showChat ? "opacity-0 pointer-events-none" : "opacity-100"
}`}
>
<LandingPage
onStart={handleStart}
status={status}
isLoading={isLoading}
showChat={showChat}
/>
</div>
<div
className={`absolute inset-0 transition-all duration-700 ${
showChat ? "opacity-100" : "opacity-0 pointer-events-none"
}`}
>
{hasStarted && <ChatApp onGoHome={handleGoHome} />}
</div>
</>
)}
</div>
);
}
export default App;