enzostvs HF Staff commited on
Commit
9379f91
·
1 Parent(s): b41f5a5

animation tour

Browse files
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
- <Button
134
- variant={tourHasBeenShown ? "bordered" : "indigo"}
135
- size="icon-xs"
136
- className="rounded-full!"
137
- onClick={() => startNextStep("onboarding")}
138
- >
139
- <FaHand className="size-3" />
140
- </Button>
 
 
 
 
 
 
 
 
 
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}