"use client"; import { useState, useMemo } from "react"; import dynamic from "next/dynamic"; import { useBeforeUnload, useLocalStorage } from "react-use"; import { ArrowRight } from "lucide-react"; import { useTheme } from "next-themes"; import { amethyst } from "@codesandbox/sandpack-themes"; import { NextStep } from "nextstepjs"; import confetti from "canvas-confetti"; import { AppEditorHeader } from "./header"; import { AppViewer } from "@/components/viewer"; import { ActivityType, DeviceType, File, MobileTabType } from "@/lib/type"; import { useProject } from "@/components/projects/useProject"; import { AskAI } from "@/components/ask-ai/ask-ai"; import { AppEditorChat } from "@/components/chat"; import { cn, defaultHTML } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { AppEditorCode } from "@/components/code"; import { ProjectWithCommits } from "@/actions/projects"; import { HistoryView } from "./history-view"; import { TourCustomCard } from "@/components/tour/card"; import { steps } from "@/lib/onboarding"; const SandpackProvider = dynamic( () => import("@codesandbox/sandpack-react").then((mod) => mod.SandpackProvider), { ssr: false } ); export function AppEditor({ project: initialProject, files: initialFiles, initialPrompt, isNew = false, isHistoryView = false, }: { project?: ProjectWithCommits | null; files?: File[]; initialPrompt?: string; isNew?: boolean; isHistoryView?: boolean; }) { const [currentActivity, setCurrentActivity] = useState("chat"); const [device, setDevice] = useState("desktop"); const [mobileTab, setMobileTab] = useState("left-sidebar"); const { project, files } = useProject(initialProject, initialFiles, isNew); const { resolvedTheme } = useTheme(); const projectName = isNew ? "new" : project?.name ?? "new"; const toggleDevice = () => { setDevice((prev) => (prev === "desktop" ? "mobile" : "desktop")); }; const [tourHasBeenShown, setTourHasBeenShown] = useLocalStorage( "tour-has-been-shown", false ); useBeforeUnload( !project && (files?.length ?? 0) > 0, "You have unsaved changes, are you sure?" ); const sandpackFiles = useMemo(() => { if (files && files.length > 0) { return files.reduce( (acc, file) => ({ ...acc, [file.path]: { code: file.content ?? "" }, }), {} ); } else { return { "/index.html": { code: defaultHTML, }, }; } }, [files]); return ( { setTourHasBeenShown(true); confetti({ particleCount: 100, spread: 70, origin: { y: 1, x: 0.1 }, }); }} >
{currentActivity === "chat" ? (
{ setCurrentActivity("code"); }} />
) : ( )} {isHistoryView && }
); }