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 = () => {