Spaces:
Running
Running
animation tour
Browse files- components/ask-ai/ask-ai.tsx +25 -24
- components/editor/index.tsx +7 -1
components/ask-ai/ask-ai.tsx
CHANGED
|
@@ -3,7 +3,7 @@ import { ArrowUp, Paintbrush, X } from "lucide-react";
|
|
| 3 |
import { FaHand } from "react-icons/fa6";
|
| 4 |
import { useRef, useState } from "react";
|
| 5 |
import { HiStop } from "react-icons/hi2";
|
| 6 |
-
import { useLocalStorage, useMount } from "react-use";
|
| 7 |
import { useRouter } from "next/navigation";
|
| 8 |
import { useNextStep } from "nextstepjs";
|
| 9 |
|
|
@@ -23,6 +23,7 @@ export function AskAI({
|
|
| 23 |
onToggleMobileTab,
|
| 24 |
files,
|
| 25 |
medias,
|
|
|
|
| 26 |
isNew = false,
|
| 27 |
isHistoryView,
|
| 28 |
projectName = "new",
|
|
@@ -31,44 +32,35 @@ export function AskAI({
|
|
| 31 |
className?: string;
|
| 32 |
files?: File[] | null;
|
| 33 |
medias?: string[] | null;
|
|
|
|
| 34 |
onToggleMobileTab?: (tab: MobileTabType) => void;
|
| 35 |
isNew?: boolean;
|
| 36 |
isHistoryView?: boolean;
|
| 37 |
projectName?: string;
|
| 38 |
}) {
|
| 39 |
const contentEditableRef = useRef<HTMLDivElement | null>(null);
|
| 40 |
-
const [prompt, setPrompt] = useState(initialPrompt ?? "");
|
| 41 |
const [model = MODELS[0].value, setModel] = useLocalStorage<string>(
|
| 42 |
"model",
|
| 43 |
MODELS[0].value
|
| 44 |
);
|
| 45 |
-
const [tourHasBeenShown, setTourHasBeenShown] = useLocalStorage<boolean>(
|
| 46 |
-
"tour-has-been-shown",
|
| 47 |
-
false
|
| 48 |
-
);
|
| 49 |
const [provider, setProvider] = useLocalStorage<ProviderType>(
|
| 50 |
"provider",
|
| 51 |
"auto" as ProviderType
|
| 52 |
);
|
|
|
|
|
|
|
| 53 |
const [redesignMd, setRedesignMd] = useState<{
|
| 54 |
md: string;
|
| 55 |
url: string;
|
| 56 |
} | null>(null);
|
| 57 |
const [selectedMedias, setSelectedMedias] = useState<string[]>([]);
|
|
|
|
| 58 |
|
| 59 |
const router = useRouter();
|
| 60 |
const { callAi, isLoading, stopGeneration, audio } =
|
| 61 |
useGeneration(projectName);
|
| 62 |
const { startNextStep } = useNextStep();
|
| 63 |
|
| 64 |
-
// const messages =
|
| 65 |
-
// queryClient.getQueryData<Message[]>(MESSAGES_QUERY_KEY(projectName)) ?? [];
|
| 66 |
-
|
| 67 |
-
// const clearMessages = () => {
|
| 68 |
-
// queryClient.setQueryData<Message[]>(MESSAGES_QUERY_KEY(projectName), []);
|
| 69 |
-
// localStorage.removeItem(`messages-${projectName}`);
|
| 70 |
-
// };
|
| 71 |
-
|
| 72 |
const onComplete = () => {
|
| 73 |
onToggleMobileTab?.("right-sidebar");
|
| 74 |
};
|
|
@@ -123,21 +115,30 @@ export function AskAI({
|
|
| 123 |
/>
|
| 124 |
<footer className="flex items-center justify-between mt-0">
|
| 125 |
<div className="flex items-center gap-1.5">
|
| 126 |
-
{!isNew
|
| 127 |
<Uploader
|
| 128 |
medias={medias}
|
| 129 |
selected={selectedMedias}
|
| 130 |
setSelected={setSelectedMedias}
|
| 131 |
/>
|
| 132 |
-
)
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
)}
|
| 142 |
<Models
|
| 143 |
model={model}
|
|
|
|
| 3 |
import { FaHand } from "react-icons/fa6";
|
| 4 |
import { useRef, useState } from "react";
|
| 5 |
import { HiStop } from "react-icons/hi2";
|
| 6 |
+
import { useLocalStorage, useMount, useUpdateEffect } from "react-use";
|
| 7 |
import { useRouter } from "next/navigation";
|
| 8 |
import { useNextStep } from "nextstepjs";
|
| 9 |
|
|
|
|
| 23 |
onToggleMobileTab,
|
| 24 |
files,
|
| 25 |
medias,
|
| 26 |
+
tourHasBeenShown,
|
| 27 |
isNew = false,
|
| 28 |
isHistoryView,
|
| 29 |
projectName = "new",
|
|
|
|
| 32 |
className?: string;
|
| 33 |
files?: File[] | null;
|
| 34 |
medias?: string[] | null;
|
| 35 |
+
tourHasBeenShown?: boolean;
|
| 36 |
onToggleMobileTab?: (tab: MobileTabType) => void;
|
| 37 |
isNew?: boolean;
|
| 38 |
isHistoryView?: boolean;
|
| 39 |
projectName?: string;
|
| 40 |
}) {
|
| 41 |
const contentEditableRef = useRef<HTMLDivElement | null>(null);
|
|
|
|
| 42 |
const [model = MODELS[0].value, setModel] = useLocalStorage<string>(
|
| 43 |
"model",
|
| 44 |
MODELS[0].value
|
| 45 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
const [provider, setProvider] = useLocalStorage<ProviderType>(
|
| 47 |
"provider",
|
| 48 |
"auto" as ProviderType
|
| 49 |
);
|
| 50 |
+
|
| 51 |
+
const [prompt, setPrompt] = useState(initialPrompt ?? "");
|
| 52 |
const [redesignMd, setRedesignMd] = useState<{
|
| 53 |
md: string;
|
| 54 |
url: string;
|
| 55 |
} | null>(null);
|
| 56 |
const [selectedMedias, setSelectedMedias] = useState<string[]>([]);
|
| 57 |
+
const [startTour, setStartTour] = useState<boolean>(false);
|
| 58 |
|
| 59 |
const router = useRouter();
|
| 60 |
const { callAi, isLoading, stopGeneration, audio } =
|
| 61 |
useGeneration(projectName);
|
| 62 |
const { startNextStep } = useNextStep();
|
| 63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
const onComplete = () => {
|
| 65 |
onToggleMobileTab?.("right-sidebar");
|
| 66 |
};
|
|
|
|
| 115 |
/>
|
| 116 |
<footer className="flex items-center justify-between mt-0">
|
| 117 |
<div className="flex items-center gap-1.5">
|
| 118 |
+
{!isNew && (
|
| 119 |
<Uploader
|
| 120 |
medias={medias}
|
| 121 |
selected={selectedMedias}
|
| 122 |
setSelected={setSelectedMedias}
|
| 123 |
/>
|
| 124 |
+
)}
|
| 125 |
+
{!tourHasBeenShown && (
|
| 126 |
+
<div className="relative z-1">
|
| 127 |
+
<Button
|
| 128 |
+
variant="indigo"
|
| 129 |
+
size="icon-xs"
|
| 130 |
+
className="rounded-full!"
|
| 131 |
+
onClick={() => {
|
| 132 |
+
setStartTour(true);
|
| 133 |
+
startNextStep("onboarding");
|
| 134 |
+
}}
|
| 135 |
+
>
|
| 136 |
+
<FaHand className="size-3" />
|
| 137 |
+
</Button>
|
| 138 |
+
{!startTour && (
|
| 139 |
+
<div className="animate-ping h-full rounded-full bg-indigo-500 w-full top-0 left-0 absolute -z-1" />
|
| 140 |
+
)}
|
| 141 |
+
</div>
|
| 142 |
)}
|
| 143 |
<Models
|
| 144 |
model={model}
|
components/editor/index.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
"use client";
|
| 2 |
import { useState, useMemo } from "react";
|
| 3 |
import dynamic from "next/dynamic";
|
| 4 |
-
import { useBeforeUnload } from "react-use";
|
| 5 |
import { ArrowRight } from "lucide-react";
|
| 6 |
import { useTheme } from "next-themes";
|
| 7 |
import { amethyst } from "@codesandbox/sandpack-themes";
|
|
@@ -51,6 +51,10 @@ export function AppEditor({
|
|
| 51 |
const toggleDevice = () => {
|
| 52 |
setDevice((prev) => (prev === "desktop" ? "mobile" : "desktop"));
|
| 53 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
useBeforeUnload(
|
| 56 |
!project && (files?.length ?? 0) > 0,
|
|
@@ -83,6 +87,7 @@ export function AppEditor({
|
|
| 83 |
shadowOpacity="0.6"
|
| 84 |
steps={steps}
|
| 85 |
onComplete={() => {
|
|
|
|
| 86 |
confetti({
|
| 87 |
particleCount: 100,
|
| 88 |
spread: 70,
|
|
@@ -145,6 +150,7 @@ export function AppEditor({
|
|
| 145 |
isNew={isNew}
|
| 146 |
projectName={projectName}
|
| 147 |
initialPrompt={initialPrompt}
|
|
|
|
| 148 |
files={files}
|
| 149 |
medias={project?.medias ?? []}
|
| 150 |
onToggleMobileTab={setMobileTab}
|
|
|
|
| 1 |
"use client";
|
| 2 |
import { useState, useMemo } from "react";
|
| 3 |
import dynamic from "next/dynamic";
|
| 4 |
+
import { useBeforeUnload, useLocalStorage } from "react-use";
|
| 5 |
import { ArrowRight } from "lucide-react";
|
| 6 |
import { useTheme } from "next-themes";
|
| 7 |
import { amethyst } from "@codesandbox/sandpack-themes";
|
|
|
|
| 51 |
const toggleDevice = () => {
|
| 52 |
setDevice((prev) => (prev === "desktop" ? "mobile" : "desktop"));
|
| 53 |
};
|
| 54 |
+
const [tourHasBeenShown, setTourHasBeenShown] = useLocalStorage<boolean>(
|
| 55 |
+
"tour-has-been-shown",
|
| 56 |
+
false
|
| 57 |
+
);
|
| 58 |
|
| 59 |
useBeforeUnload(
|
| 60 |
!project && (files?.length ?? 0) > 0,
|
|
|
|
| 87 |
shadowOpacity="0.6"
|
| 88 |
steps={steps}
|
| 89 |
onComplete={() => {
|
| 90 |
+
setTourHasBeenShown(true);
|
| 91 |
confetti({
|
| 92 |
particleCount: 100,
|
| 93 |
spread: 70,
|
|
|
|
| 150 |
isNew={isNew}
|
| 151 |
projectName={projectName}
|
| 152 |
initialPrompt={initialPrompt}
|
| 153 |
+
tourHasBeenShown={tourHasBeenShown}
|
| 154 |
files={files}
|
| 155 |
medias={project?.medias ?? []}
|
| 156 |
onToggleMobileTab={setMobileTab}
|