From ee1bc30912785275b1041feee69fc4e35d18abfb Mon Sep 17 00:00:00 2001 From: Silvano Cerza Date: Tue, 21 Jan 2025 23:39:05 +0100 Subject: [PATCH] Change state handling on onboarding --- src/views/onboarding/component.tsx | 244 +++++++++++++++++------------ 1 file changed, 145 insertions(+), 99 deletions(-) diff --git a/src/views/onboarding/component.tsx b/src/views/onboarding/component.tsx index 9f8f157..8300b05 100644 --- a/src/views/onboarding/component.tsx +++ b/src/views/onboarding/component.tsx @@ -1,14 +1,28 @@ import { useState, useEffect } from "react"; -type Step = - | "welcome" - | "repo" - | "token" - | "folders" - | "sync" - | "interface" - | "first_sync" - | "done"; +const STEPS = [ + "welcome", + "repo", + "token", + "folders", + "sync", + "interface", + "first_sync", + "done", +] as const; + +type Step = (typeof STEPS)[number]; + +type StepData = { + repo?: { owner: string; repo: string; branch: string }; + token?: { token: string }; + folders?: { repoFolder: string; vaultFolder: string }; + sync?: { + mode: "manual" | "interval"; + syncOnStart: boolean; + onConflict: "ignore" | "ask" | "overwrite"; + }; +}; const WelcomeStepComponent = () => { return ( @@ -34,20 +48,12 @@ const WelcomeStepComponent = () => { }; const RepoStepComponent = ({ - setIsValid, + values = { owner: "", repo: "", branch: "" }, + onChange, }: { - setIsValid: (valid: boolean) => void; + values?: { owner: string; repo: string; branch: string }; + onChange: (values: { owner: string; repo: string; branch: string }) => void; }) => { - const [owner, setOwner] = useState(""); - const [repo, setRepo] = useState(""); - const [branch, setBranch] = useState(""); - - useEffect(() => { - setIsValid( - owner.trim() !== "" && repo.trim() !== "" && branch.trim() !== "", - ); - }, [owner, repo, branch]); - return (
setOwner(e.target.value)} + value={values.owner} + onChange={(e) => onChange({ ...values, owner: e.target.value })} /> setRepo(e.target.value)} + value={values.repo} + onChange={(e) => onChange({ ...values, repo: e.target.value })} /> setBranch(e.target.value)} + value={values.branch} + onChange={(e) => onChange({ ...values, branch: e.target.value })} />
@@ -111,16 +117,12 @@ const RepoStepComponent = ({ }; const TokenStepComponent = ({ - setIsValid, + values = { token: "" }, + onChange, }: { - setIsValid: (valid: boolean) => void; + values?: { token: string }; + onChange: (values: { token: string }) => void; }) => { - const [token, setToken] = useState(""); - - useEffect(() => { - setIsValid(token.trim() !== ""); - }, [token]); - return (
setToken(e.target.value)} + value={values.token} + onChange={(e) => onChange({ token: e.target.value })} />
); }; -const FoldersStepComponent = () => { +const FoldersStepComponent = ({ + values = { repoFolder: "", vaultFolder: "" }, + onChange, +}: { + values?: { repoFolder: string; vaultFolder: string }; + onChange: (values: { repoFolder: string; vaultFolder: string }) => void; +}) => { return (
{ type="text" spellCheck="false" placeholder="Repository folder" + value={values.repoFolder} + onChange={(e) => onChange({ ...values, repoFolder: e.target.value })} style={{ width: "100%" }} /> onChange({ ...values, vaultFolder: e.target.value })} style={{ width: "100%" }} />
@@ -213,13 +225,21 @@ const FoldersStepComponent = () => { ); }; -const SyncSettingsStepComponent = () => { - const [syncMode, setSyncMode] = useState<"manual" | "interval">("manual"); - const [syncOnStart, setSyncOnStart] = useState(false); - const [onConflict, setOnConflict] = useState<"ignore" | "ask" | "overwrite">( - "overwrite", - ); - +const SyncSettingsStepComponent = ({ + values = { mode: "manual", syncOnStart: false, onConflict: "overwrite" }, + onChange, +}: { + values?: { + mode: "manual" | "interval"; + syncOnStart: boolean; + onConflict: "ignore" | "ask" | "overwrite"; + }; + onChange: (values: { + mode: "manual" | "interval"; + syncOnStart: boolean; + onConflict: "ignore" | "ask" | "overwrite"; + }) => void; +}) => { return (
{

Optionally you can sync every time you open Obsidian.

setSyncOnStart(!syncOnStart)} + className={`checkbox-container ${values.syncOnStart ? "is-enabled" : ""}`} + onClick={() => + onChange({ ...values, syncOnStart: !values.syncOnStart }) + } > - +

In case of conflicts you can choose how to handle them.

@@ -257,8 +284,13 @@ const SyncSettingsStepComponent = () => {