From d8ca92df884c124bd0e9d7a70b3ebdecd8082263 Mon Sep 17 00:00:00 2001 From: Timothy Carambat Date: Thu, 4 Jan 2024 15:54:31 -0800 Subject: [PATCH] Onboarding V2 (#502) * WIP onboarding v2 * Welcome screen for onboarding complete * fix home page and WIP create skeleton for llm preference search/options * render llms as options * add search functionality to llm preference & add survey step * fix openai settings undefined & create custom logo onboarding page * add user setup UI * add data handling & privacy onboarding screen * add create workspace onboarding screen * fix survey width in onboarding * create vector database connection onboarding page * add workspace image & all skeleton ui complete * fix navigation buttons and ui tweaks to fit on screen * WIP LLMPreference * LLM Preference screen fully functional * create components for vector db options and fix styling of azure options * remove unneeded comment * vector db connection onboarding screen complete * minor ui tweak to searchbar * user setup page fully working * create workspace onboarding page fully working * useNavigate for navigation between pages * mobile layout, cleanup old files, survey functionality implemented * fix default logo appearing when should be blank & password setup bug fix * Modify flow of onboarding todo: embedding set up * Add embedder setup screen & insert into flow * update embedding back button auto-dismiss toasts on each step * move page defs under imports fix bg color on mobile styling --------- Co-authored-by: shatfield4 --- frontend/src/App.jsx | 1 + .../AzureAiOptions/index.jsx | 94 ++--- .../LocalAiOptions/index.jsx | 120 +++---- .../OpenAiOptions/index.jsx | 60 ++-- .../LLMSelection/AzureAiOptions/index.jsx | 163 +++++---- .../LLMSelection/OpenAiOptions/index.jsx | 8 +- .../src/components/PrivateRoute/index.jsx | 4 +- .../ChromaDBOptions/index.jsx | 51 +++ .../LanceDBOptions/index.jsx | 9 + .../PineconeDBOptions/index.jsx | 55 +++ .../QDrantDBOptions/index.jsx | 38 ++ .../WeaviateDBOptions/index.jsx | 38 ++ .../media/illustrations/create-workspace.png | Bin 0 -> 18405 bytes .../Steps/AppearanceSetup/index.jsx | 145 -------- .../Steps/CreateFirstWorkspace/index.jsx | 68 ---- .../Steps/EmbeddingSelection/index.jsx | 136 ------- .../Steps/LLMSelection/index.jsx | 183 ---------- .../Steps/MultiUserSetup/index.jsx | 117 ------ .../Steps/PasswordProtection/index.jsx | 103 ------ .../Steps/UserModeSelection/index.jsx | 47 --- .../Steps/UserQuestionnaire/index.jsx | 240 ------------- .../Steps/VectorDatabaseConnection/index.jsx | 310 ---------------- .../OnboardingFlow/OnboardingModal/index.jsx | 136 ------- .../Steps/CreateWorkspace/index.jsx | 99 ++++++ .../OnboardingFlow/Steps/CustomLogo/index.jsx | 136 +++++++ .../Steps/DataHandling/index.jsx | 52 ++- .../EmbeddingPreference/EmbedderItem.jsx | 39 ++ .../Steps/EmbeddingPreference/index.jsx | 180 ++++++++++ .../pages/OnboardingFlow/Steps/Home/index.jsx | 41 +++ .../OnboardingFlow/Steps/Home/l_group.png | Bin 0 -> 74247 bytes .../OnboardingFlow/Steps/Home/r_group.png | Bin 0 -> 81768 bytes .../Steps/LLMPreference/LLMItem.jsx | 39 ++ .../Steps/LLMPreference/index.jsx | 211 +++++++++++ .../OnboardingFlow/Steps/Survey/index.jsx | 297 ++++++++++++++++ .../OnboardingFlow/Steps/UserSetup/index.jsx | 336 ++++++++++++++++++ .../VectorDatabaseItem.jsx | 37 ++ .../Steps/VectorDatabaseConnection/index.jsx | 182 ++++++++++ .../src/pages/OnboardingFlow/Steps/index.jsx | 130 +++++++ frontend/src/pages/OnboardingFlow/index.jsx | 66 +--- frontend/src/utils/paths.js | 30 +- server/prisma/seed.js | 13 +- 41 files changed, 2223 insertions(+), 1791 deletions(-) create mode 100644 frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx create mode 100644 frontend/src/media/illustrations/create-workspace.png delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/AppearanceSetup/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/VectorDatabaseConnection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/CreateWorkspace/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/CustomLogo/index.jsx rename frontend/src/pages/OnboardingFlow/{OnboardingModal => }/Steps/DataHandling/index.jsx (87%) create mode 100644 frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/EmbedderItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/l_group.png create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/r_group.png create mode 100644 frontend/src/pages/OnboardingFlow/Steps/LLMPreference/LLMItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/VectorDatabaseItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/index.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7224f2e9..8007b5ad 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -120,6 +120,7 @@ export default function App() { {/* Onboarding Flow */} } /> + } /> diff --git a/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx index e7767900..c782c51f 100644 --- a/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx @@ -1,53 +1,55 @@ export default function AzureAiOptions({ settings }) { return ( - <> -
- - -
+
+
+
+ + +
-
- - -
+
+ + +
-
- - +
+ + +
- +
); } diff --git a/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx index 2b976e14..6f81712c 100644 --- a/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx @@ -10,72 +10,72 @@ export default function LocalAiOptions({ settings }) { const [apiKey, setApiKey] = useState(settings?.LocalAiApiKey); return ( - <> +
-
- - setBasePathValue(e.target.value)} - onBlur={() => setBasePath(basePathValue)} - required={true} - autoComplete="off" - spellCheck={false} - /> -
- -
- - e.target.blur()} - defaultValue={settings?.EmbeddingModelMaxChunkLength} - required={false} - autoComplete="off" - /> -
-
-
-
-
-
- +
); } diff --git a/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx index f38f7c44..dd00d67a 100644 --- a/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx @@ -1,34 +1,36 @@ export default function OpenAiOptions({ settings }) { return ( - <> -
- - +
+
+
+ + +
+
+ + +
-
- - -
- +
); } diff --git a/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx b/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx index 29786510..ce54d3d6 100644 --- a/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx +++ b/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx @@ -1,87 +1,92 @@ export default function AzureAiOptions({ settings }) { return ( - <> -
- - +
+
+
+ + +
+ +
+ + +
+ +
+ + +
-
- - -
+
+
+ + +
-
- - +
+ + +
+
- -
- - -
- -
- - -
- +
); } diff --git a/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx b/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx index fd2f8766..cbd83edb 100644 --- a/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx +++ b/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx @@ -6,7 +6,7 @@ export default function OpenAiOptions({ settings }) { const [openAIKey, setOpenAIKey] = useState(settings?.OpenAiKey); return ( - <> +
- +
); } @@ -87,7 +87,7 @@ function OpenAIModelSelection({ apiKey, settings }) { @@ -102,7 +102,7 @@ function OpenAIModelSelection({ apiKey, settings }) { diff --git a/frontend/src/components/PrivateRoute/index.jsx b/frontend/src/components/PrivateRoute/index.jsx index 46406463..165141bb 100644 --- a/frontend/src/components/PrivateRoute/index.jsx +++ b/frontend/src/components/PrivateRoute/index.jsx @@ -89,7 +89,7 @@ export function AdminRoute({ Component }) { if (isAuthd === null) return ; if (shouldRedirectToOnboarding) { - return ; + return ; } const user = userFromStorage(); @@ -110,7 +110,7 @@ export function ManagerRoute({ Component }) { if (isAuthd === null) return ; if (shouldRedirectToOnboarding) { - return ; + return ; } const user = userFromStorage(); diff --git a/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx new file mode 100644 index 00000000..ae7af68f --- /dev/null +++ b/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx @@ -0,0 +1,51 @@ +export default function ChromaDBOptions({ settings }) { + return ( +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ ); +} diff --git a/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx new file mode 100644 index 00000000..942a3666 --- /dev/null +++ b/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx @@ -0,0 +1,9 @@ +export default function LanceDBOptions() { + return ( +
+

+ There is no configuration needed for LanceDB. +

+
+ ); +} diff --git a/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx new file mode 100644 index 00000000..5491f758 --- /dev/null +++ b/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx @@ -0,0 +1,55 @@ +export default function PineconeDBOptions({ settings }) { + return ( +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ ); +} diff --git a/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx new file mode 100644 index 00000000..e1e9d90f --- /dev/null +++ b/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx @@ -0,0 +1,38 @@ +export default function QDrantDBOptions({ settings }) { + return ( +
+
+
+ + +
+ +
+ + +
+
+
+ ); +} diff --git a/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx new file mode 100644 index 00000000..5d7494ed --- /dev/null +++ b/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx @@ -0,0 +1,38 @@ +export default function WeaviateDBOptions({ settings }) { + return ( +
+
+
+ + +
+ +
+ + +
+
+
+ ); +} diff --git a/frontend/src/media/illustrations/create-workspace.png b/frontend/src/media/illustrations/create-workspace.png new file mode 100644 index 0000000000000000000000000000000000000000..8e31174e5d1d7543adb75ec1ee7ec1ac6182944e GIT binary patch literal 18405 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 M07*qoM6N<$g0 { - async function logoInit() { - setLogo(_initLogo || ""); - const _isDefaultLogo = await System.isDefaultLogo(); - setIsDefaultLogo(_isDefaultLogo); - } - logoInit(); - }, [_initLogo]); - - const handleFileUpload = async (event) => { - const file = event.target.files[0]; - if (!file) return false; - - const objectURL = URL.createObjectURL(file); - setLogo(objectURL); - - const formData = new FormData(); - formData.append("logo", file); - const { success, error } = await System.uploadLogo(formData); - if (!success) { - showToast(`Failed to upload logo: ${error}`, "error"); - setLogo(_initLogo); - return; - } - - const logoURL = await System.fetchLogo(); - _setLogo(logoURL); - - showToast("Image uploaded successfully.", "success"); - setIsDefaultLogo(false); - }; - - const handleRemoveLogo = async () => { - setLogo(""); - setIsDefaultLogo(true); - - const { success, error } = await System.removeCustomLogo(); - if (!success) { - console.error("Failed to remove logo:", error); - showToast(`Failed to remove logo: ${error}`, "error"); - const logoURL = await System.fetchLogo(); - setLogo(logoURL); - setIsDefaultLogo(false); - return; - } - - const logoURL = await System.fetchLogo(); - _setLogo(logoURL); - - showToast("Image successfully removed.", "success"); - }; - - return ( -
-
-
-

Custom Logo

-

- Upload your custom logo to make your chatbot yours. -

-
-
- (e.target.src = AnythingLLM)} - /> -
- - -
-
-
-
- -
- - -
-
-
- ); -} -export default memo(AppearanceSetup); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx deleted file mode 100644 index d2624ef6..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { memo } from "react"; -import { useNavigate } from "react-router-dom"; -import paths from "@/utils/paths"; -import Workspace from "@/models/workspace"; - -function CreateFirstWorkspace({ prevStep }) { - const navigate = useNavigate(); - - const handleCreate = async (e) => { - e.preventDefault(); - const form = new FormData(e.target); - const { workspace, error } = await Workspace.new({ - name: form.get("name"), - onboardingComplete: true, - }); - if (!!workspace) { - navigate(paths.home()); - } else { - alert(error); - } - }; - - return ( -
-
-
-
-
-
- - -
-
-
-
-
- - -
-
-
- ); -} -export default memo(CreateFirstWorkspace); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx deleted file mode 100644 index 98e1262a..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx +++ /dev/null @@ -1,136 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; -import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; -import OpenAiLogo from "@/media/llmprovider/openai.png"; -import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; -import LocalAiLogo from "@/media/llmprovider/localai.png"; -import System from "@/models/system"; -import PreLoader from "@/components/Preloader"; -import LLMProviderOption from "@/components/LLMSelection/LLMProviderOption"; -import OpenAiOptions from "@/components/EmbeddingSelection/OpenAiOptions"; -import AzureAiOptions from "@/components/EmbeddingSelection/AzureAiOptions"; -import LocalAiOptions from "@/components/EmbeddingSelection/LocalAiOptions"; -import NativeEmbeddingOptions from "@/components/EmbeddingSelection/NativeEmbeddingOptions"; - -function EmbeddingSelection({ nextStep, prevStep, currentStep }) { - const [embeddingChoice, setEmbeddingChoice] = useState("native"); - const [settings, setSettings] = useState(null); - const [loading, setLoading] = useState(true); - const updateChoice = (selection) => { - setEmbeddingChoice(selection); - }; - - useEffect(() => { - async function fetchKeys() { - const _settings = await System.keys(); - setSettings(_settings); - setEmbeddingChoice(_settings?.EmbeddingEngine || "native"); - setLoading(false); - } - fetchKeys(); - }, [currentStep]); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const data = {}; - const formData = new FormData(form); - for (var [key, value] of formData.entries()) data[key] = value; - const { error } = await System.updateSystem(data); - if (error) { - alert(`Failed to save LLM settings: ${error}`, "error"); - return; - } - nextStep("vector_database"); - return; - }; - - if (loading) - return ( -
- -
- ); - - return ( -
-
-
-
- Embedding Provider -
-
- - - - - -
-
- {embeddingChoice === "native" && } - {embeddingChoice === "openai" && ( - - )} - {embeddingChoice === "azure" && ( - - )} - {embeddingChoice === "localai" && ( - - )} -
-
-
- - -
-
-
- ); -} - -export default memo(EmbeddingSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx deleted file mode 100644 index 850dea3c..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx +++ /dev/null @@ -1,183 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; -import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; -import OpenAiLogo from "@/media/llmprovider/openai.png"; -import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; -import AnthropicLogo from "@/media/llmprovider/anthropic.png"; -import GeminiLogo from "@/media/llmprovider/gemini.png"; -import OllamaLogo from "@/media/llmprovider/ollama.png"; -import LMStudioLogo from "@/media/llmprovider/lmstudio.png"; -import LocalAiLogo from "@/media/llmprovider/localai.png"; -import System from "@/models/system"; -import PreLoader from "@/components/Preloader"; -import LLMProviderOption from "@/components/LLMSelection/LLMProviderOption"; -import OpenAiOptions from "@/components/LLMSelection/OpenAiOptions"; -import AzureAiOptions from "@/components/LLMSelection/AzureAiOptions"; -import AnthropicAiOptions from "@/components/LLMSelection/AnthropicAiOptions"; -import LMStudioOptions from "@/components/LLMSelection/LMStudioOptions"; -import LocalAiOptions from "@/components/LLMSelection/LocalAiOptions"; -import NativeLLMOptions from "@/components/LLMSelection/NativeLLMOptions"; -import GeminiLLMOptions from "@/components/LLMSelection/GeminiLLMOptions"; -import OllamaLLMOptions from "@/components/LLMSelection/OllamaLLMOptions"; - -function LLMSelection({ nextStep, prevStep, currentStep }) { - const [llmChoice, setLLMChoice] = useState("openai"); - const [settings, setSettings] = useState(null); - const [loading, setLoading] = useState(true); - - const updateLLMChoice = (selection) => { - setLLMChoice(selection); - }; - - useEffect(() => { - async function fetchKeys() { - const _settings = await System.keys(); - setSettings(_settings); - setLLMChoice(_settings?.LLMProvider || "openai"); - setLoading(false); - } - - if (currentStep === "llm_preference") { - fetchKeys(); - } - }, []); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const data = {}; - const formData = new FormData(form); - for (var [key, value] of formData.entries()) data[key] = value; - const { error } = await System.updateSystem(data); - if (error) { - alert(`Failed to save LLM settings: ${error}`, "error"); - return; - } - nextStep("embedding_preferences"); - }; - - if (loading) - return ( -
- -
- ); - - return ( -
-
-
-
- LLM Providers -
-
- - - - - - - - - {!window.location.hostname.includes("useanything.com") && ( - - )} -
-
- {llmChoice === "openai" && } - {llmChoice === "azure" && } - {llmChoice === "anthropic" && ( - - )} - {llmChoice === "gemini" && } - {llmChoice === "lmstudio" && ( - - )} - {llmChoice === "localai" && } - {llmChoice === "ollama" && } - {llmChoice === "native" && } -
-
-
- - -
-
-
- ); -} - -export default memo(LLMSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx deleted file mode 100644 index 71310abf..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx +++ /dev/null @@ -1,117 +0,0 @@ -import React, { useState, memo } from "react"; -import System from "@/models/system"; -import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; -import debounce from "lodash.debounce"; - -// Multi-user mode step -function MultiUserSetup({ nextStep, prevStep }) { - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - const data = { - username: formData.get("username"), - password: formData.get("password"), - }; - const { success, error } = await System.setupMultiUser(data); - if (!success) { - alert(error); - return; - } - - // Auto-request token with credentials that was just set so they - // are not redirected to login after completion. - const { user, token } = await System.requestToken(data); - window.localStorage.setItem(AUTH_USER, JSON.stringify(user)); - window.localStorage.setItem(AUTH_TOKEN, token); - window.localStorage.removeItem(AUTH_TIMESTAMP); - - nextStep("data_handling"); - }; - - const setNewUsername = (e) => setUsername(e.target.value); - const setNewPassword = (e) => setPassword(e.target.value); - const handleUsernameChange = debounce(setNewUsername, 500); - const handlePasswordChange = debounce(setNewPassword, 500); - return ( -
-
-
-
-
-
- - -
-
- - -
-

- Username must be at least 6 characters long. Password must be at - least 8 characters long. -

-
-
-
-
-
- By default, you will be the only admin. As an admin you will need to - create accounts for all new users or admins. Do not lose your - password as only admins can reset passwords. -
-
- - -
-
-
-
- ); -} -export default memo(MultiUserSetup); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx deleted file mode 100644 index 4504288e..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx +++ /dev/null @@ -1,103 +0,0 @@ -import React, { memo, useState } from "react"; -import System from "@/models/system"; -import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; -import debounce from "lodash.debounce"; - -function PasswordProtection({ nextStep, prevStep }) { - const [password, setPassword] = useState(""); - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - const { error } = await System.updateSystemPassword({ - usePassword: true, - newPassword: formData.get("password"), - }); - - if (error) { - alert(`Failed to set password: ${error}`, "error"); - return; - } - - // Auto-request token with password that was just set so they - // are not redirected to login after completion. - const { token } = await System.requestToken({ - password: formData.get("password"), - }); - window.localStorage.removeItem(AUTH_USER); - window.localStorage.removeItem(AUTH_TIMESTAMP); - window.localStorage.setItem(AUTH_TOKEN, token); - - nextStep("data_handling"); - return; - }; - - const handleSkip = () => { - nextStep("data_handling"); - }; - - const setNewPassword = (e) => setPassword(e.target.value); - const handlePasswordChange = debounce(setNewPassword, 500); - return ( -
-
-
-
-
-
- -

- must be at least 8 characters. -

-
- -
-
-
-
- - -
- - -
-
-
-
- ); -} -export default memo(PasswordProtection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx deleted file mode 100644 index b78c3253..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { memo } from "react"; - -// How many people will be using your instance step -function UserModeSelection({ nextStep, prevStep }) { - const justMeClicked = () => { - nextStep("password_protection"); - }; - - const myTeamClicked = () => { - nextStep("multi_user_mode"); - }; - - return ( -
-
-
- How many people will be using your instance? -
-
- - -
-
-
- -
-
- ); -} - -export default memo(UserModeSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx deleted file mode 100644 index a0cb97fd..00000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx +++ /dev/null @@ -1,240 +0,0 @@ -import { COMPLETE_QUESTIONNAIRE } from "@/utils/constants"; -import paths from "@/utils/paths"; -import { CheckCircle, Circle } from "@phosphor-icons/react"; -import React, { memo } from "react"; - -async function sendQuestionnaire({ email, useCase, comment }) { - if (import.meta.env.DEV) return; - return fetch(`https://onboarding-wxich7363q-uc.a.run.app`, { - method: "POST", - body: JSON.stringify({ - email, - useCase, - comment, - sourceId: "0VRjqHh6Vukqi0x0Vd0n/m8JuT7k8nOz", - }), - }) - .then(() => { - window.localStorage.setItem(COMPLETE_QUESTIONNAIRE, true); - console.log(`✅ Questionnaire responses sent.`); - }) - .catch((error) => { - console.error(`sendQuestionnaire`, error.message); - }); -} - -function UserQuestionnaire({ nextStep, prevStep }) { - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - nextStep("create_workspace"); - - await sendQuestionnaire({ - email: formData.get("email"), - useCase: formData.get("use_case") || "other", - comment: formData.get("comment") || null, - }); - return; - }; - - const handleSkip = () => { - nextStep("create_workspace"); - }; - - if (!!window?.localStorage?.getItem(COMPLETE_QUESTIONNAIRE)) { - return ( -
- - -
- - -
- - -
-
-
- ); - } - - return ( -
-
-
-
-
-
- -
- -
-
- -
-
-
- -
- -
-
- - - -
-
- - - -
-
- - - -
-
-
-
- -
-
-
- -
-