From befe35f3d6355a12546865de42d3a5ab18c1ab90 Mon Sep 17 00:00:00 2001 From: Liyang Zhu <1184997399@qq.com> Date: Mon, 6 Jun 2022 15:07:17 +0800 Subject: [PATCH] fix: get onboarding working --- src/app/services/base.query.js | 3 +- src/app/services/server.js | 2 +- src/common/component/RequireInitialized.js | 2 +- src/routes/onboarding/index.js | 36 +++++++------ src/routes/onboarding/steps/1-welcome.js | 4 +- .../steps/{2-spaceName.js => 2-serverName.js} | 10 ++-- .../onboarding/steps/3-adminCredentials.js | 52 ++++++++++++++----- src/routes/onboarding/steps/4-inviteRule.js | 12 ++--- src/routes/onboarding/steps/5-inviteLink.js | 4 +- src/routes/onboarding/steps/6-completed.js | 6 +-- 10 files changed, 82 insertions(+), 49 deletions(-) rename src/routes/onboarding/steps/{2-spaceName.js => 2-serverName.js} (84%) diff --git a/src/app/services/base.query.js b/src/app/services/base.query.js index 457fe2b5..66f12e8a 100644 --- a/src/app/services/base.query.js +++ b/src/app/services/base.query.js @@ -18,8 +18,7 @@ const whiteList = [ "getMetamaskNonce", "renew", "getInitialized", - "createAdmin", - "updateLoginConfig" + "createAdmin" ]; const baseQuery = fetchBaseQuery({ baseUrl: BASE_URL, diff --git a/src/app/services/server.js b/src/app/services/server.js index 6cbe4831..7ab67a55 100644 --- a/src/app/services/server.js +++ b/src/app/services/server.js @@ -178,7 +178,7 @@ export const serverApi = createApi({ }), createAdmin: builder.mutation({ query: (data) => ({ - url: `/admin/system/createAdmin`, + url: `/admin/system/create_admin`, method: "POST", body: data }) diff --git a/src/common/component/RequireInitialized.js b/src/common/component/RequireInitialized.js index 035b2d16..275a3796 100644 --- a/src/common/component/RequireInitialized.js +++ b/src/common/component/RequireInitialized.js @@ -1,7 +1,7 @@ import { Navigate } from "react-router-dom"; import { useGetInitializedQuery } from "../../app/services/server"; -export default function RequireInitialized({ children, redirectTo = "/" }) { +export default function RequireInitialized({ children, redirectTo = "/onboarding" }) { const { data } = useGetInitializedQuery(); console.log("initialized?", data); return data === false ? : children; diff --git a/src/routes/onboarding/index.js b/src/routes/onboarding/index.js index e588b09b..72f83606 100644 --- a/src/routes/onboarding/index.js +++ b/src/routes/onboarding/index.js @@ -1,7 +1,8 @@ import { useState } from "react"; import { Navigate } from "react-router-dom"; +import { Helmet } from "react-helmet"; import WelcomeStep from "./steps/1-welcome"; -import SpaceNameStep from "./steps/2-spaceName"; +import ServerNameStep from "./steps/2-serverName"; import AdminCredentialsStep from "./steps/3-adminCredentials"; import InviteRuleStep from "./steps/4-inviteRule"; import InviteLinkStep from "./steps/5-inviteLink"; @@ -11,23 +12,28 @@ import StyledOnboardingPage from "./styled"; export default function OnboardingPage() { const [step, setStep] = useState(0); const [data, setData] = useState({ - spaceName: "" + serverName: "" }); - const props = { step, setStep, data, setData }; + const props = { setStep, data, setData }; return ( - -
-
- {step === 0 && } - {step === 1 && } - {step === 2 && } - {step === 3 && } - {step === 4 && } - {step === 5 && } - {step === 6 && } + <> + + Rustchat Setup + + +
+
+ {step === 0 && } + {step === 1 && } + {step === 2 && } + {step === 3 && } + {step === 4 && } + {step === 5 && } + {step === 6 && } +
-
- + + ); } diff --git a/src/routes/onboarding/steps/1-welcome.js b/src/routes/onboarding/steps/1-welcome.js index a9debbfb..6d274acc 100644 --- a/src/routes/onboarding/steps/1-welcome.js +++ b/src/routes/onboarding/steps/1-welcome.js @@ -10,14 +10,14 @@ const StyledFirstStep = styled.div` align-items: center; `; -export default function WelcomeStep({ step, setStep }) { +export default function WelcomeStep({ setStep }) { return ( Welcome to your Rustchat! Everything in this space is owned by you. Let’s set up your space! - setStep(step + 1)}> + setStep((prev) => prev + 1)}> play icon Start diff --git a/src/routes/onboarding/steps/2-spaceName.js b/src/routes/onboarding/steps/2-serverName.js similarity index 84% rename from src/routes/onboarding/steps/2-spaceName.js rename to src/routes/onboarding/steps/2-serverName.js index e31a938d..8fe3d849 100644 --- a/src/routes/onboarding/steps/2-spaceName.js +++ b/src/routes/onboarding/steps/2-serverName.js @@ -19,7 +19,7 @@ const StyledSpaceNameStep = styled.div` } `; -export default function SpaceNameStep({ step, setStep, data, setData }) { +export default function ServerNameStep({ setStep, data, setData }) { return ( Create a new server @@ -29,11 +29,11 @@ export default function SpaceNameStep({ step, setStep, data, setData }) { setData({ ...data, - spaceName: e.target.value + serverName: e.target.value }) } /> @@ -41,11 +41,11 @@ export default function SpaceNameStep({ step, setStep, data, setData }) { className="button" onClick={() => { // Verification for space name - if (data.spaceName === "") { + if (data.serverName === "") { toast.error("Please enter server name!"); return; } - setStep(step + 1); + setStep((prev) => prev + 1); }} > Create Server diff --git a/src/routes/onboarding/steps/3-adminCredentials.js b/src/routes/onboarding/steps/3-adminCredentials.js index cadb2c20..88b8fca4 100644 --- a/src/routes/onboarding/steps/3-adminCredentials.js +++ b/src/routes/onboarding/steps/3-adminCredentials.js @@ -1,10 +1,17 @@ import { useEffect, useState } from "react"; import styled from "styled-components"; import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; import StyledInput from "../../../common/component/styled/Input"; import StyledButton from "../../../common/component/styled/Button"; -import { useCreateAdminMutation } from "../../../app/services/server"; +import { + useCreateAdminMutation, + useGetInitializedQuery, + useGetServerQuery, + useUpdateServerMutation +} from "../../../app/services/server"; import { useLoginMutation } from "../../../app/services/auth"; +import { setAuthData } from "../../../app/slices/auth.data"; const StyledAdminCredentialsStep = styled.div` height: 100%; @@ -22,13 +29,18 @@ const StyledAdminCredentialsStep = styled.div` } `; -export default function AdminCredentialsStep({ step, setStep }) { +export default function AdminCredentialsStep({ data, setStep }) { + const dispatch = useDispatch(); + + const [createAdmin, { isLoading: isSigningUp, error: signUpError }] = useCreateAdminMutation(); const [ - createAdmin, - { isLoading: isSignUpLoading, isSuccess: isSignUpSuccess, error: signUpError } - ] = useCreateAdminMutation(); - const [login, { isLoading: isLoginLoading, isSuccess: isLoginSuccess, error: loginError }] = - useLoginMutation(); + login, + { isLoading: isLoggingIn, isSuccess: isLoggedIn, error: loginError, data: loginData } + ] = useLoginMutation(); + const { refetch: refetchInitialized } = useGetInitializedQuery(); + const { data: serverData } = useGetServerQuery(); + const [updateServer, { isLoading: isUpdatingServer, isSuccess: isUpdatedServer }] = + useUpdateServerMutation(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -39,16 +51,32 @@ export default function AdminCredentialsStep({ step, setStep }) { if (signUpError === undefined) return; toast.error(`Failed to sign up: ${signUpError.data}`); }, [signUpError]); - useEffect(() => { if (loginError === undefined) return; toast.error(`Login failed: ${loginError.data}`); }, [loginError]); - // Increment `step` when both signing up and logging in have completed + // After logged in useEffect(() => { - if (isSignUpSuccess && isLoginSuccess) setStep(step + 1); - }, [isSignUpSuccess, isLoginSuccess]); + if (isLoggedIn && loginData) { + // Update local auth data + dispatch(setAuthData(loginData)); + // Update initialized state + refetchInitialized(); + // Set server name + updateServer({ + ...serverData, + name: data.serverName + }); + } + }, [isLoggedIn, loginData]); + + // After updated server + useEffect(() => { + if (isUpdatedServer) { + setStep((prev) => prev + 1); + } + }, [isUpdatedServer]); return ( @@ -101,7 +129,7 @@ export default function AdminCredentialsStep({ step, setStep }) { }); }} > - {!(isSignUpLoading || isLoginLoading) ? "Sign Up" : "..."} + {!(isSigningUp || isLoggingIn || isUpdatingServer) ? "Sign Up" : "..."} ); diff --git a/src/routes/onboarding/steps/4-inviteRule.js b/src/routes/onboarding/steps/4-inviteRule.js index 9b1aa36f..0945e9a0 100644 --- a/src/routes/onboarding/steps/4-inviteRule.js +++ b/src/routes/onboarding/steps/4-inviteRule.js @@ -17,11 +17,11 @@ const StyledInviteRuleStep = styled.div` } `; -export default function InviteRuleStep({ step, setStep }) { +export default function InviteRuleStep({ setStep }) { const { data: loginConfig } = useGetLoginConfigQuery(); const [updateLoginConfig, { isSuccess, error }] = useUpdateLoginConfigMutation(); - const [value, setValue] = useState(null); + const [value, setValue] = useState(0); // Display error useEffect(() => { @@ -31,7 +31,7 @@ export default function InviteRuleStep({ step, setStep }) { // Increment `step` when updating has completed useEffect(() => { - if (isSuccess) setStep(step + 1); + if (isSuccess) setStep((prev) => prev + 1); }, [isSuccess]); return ( @@ -41,18 +41,18 @@ export default function InviteRuleStep({ step, setStep }) { { + onChange={async (v) => { setValue(v); if (loginConfig !== undefined) { const whoCanSignUp = ["EveryOne", "InvitationOnly"][v]; - updateLoginConfig({ + await updateLoginConfig({ ...loginConfig, who_can_sign_up: whoCanSignUp }); } }} /> - setStep(step + 1)}> + setStep((prev) => prev + 1)}> Skip diff --git a/src/routes/onboarding/steps/5-inviteLink.js b/src/routes/onboarding/steps/5-inviteLink.js index 72bd6d1d..14e79c85 100644 --- a/src/routes/onboarding/steps/5-inviteLink.js +++ b/src/routes/onboarding/steps/5-inviteLink.js @@ -51,7 +51,7 @@ const StyledInviteLinkStep = styled.div` } `; -export default function InviteLinkStep({ step, setStep }) { +export default function InviteLinkStep({ setStep }) { const { link, linkCopied, copyLink } = useInviteLink(); return ( @@ -65,7 +65,7 @@ export default function InviteLinkStep({ step, setStep }) { {linkCopied ? "Copied" : `Copy`}
- setStep(step + 1)}> + setStep((prev) => prev + 1)}> Skip diff --git a/src/routes/onboarding/steps/6-completed.js b/src/routes/onboarding/steps/6-completed.js index 9aebf237..c31cb764 100644 --- a/src/routes/onboarding/steps/6-completed.js +++ b/src/routes/onboarding/steps/6-completed.js @@ -26,16 +26,16 @@ const StyledLastStep = styled.div` } `; -export default function CompletedStep({ data, step, setStep }) { +export default function CompletedStep({ data, setStep }) { return ( - Welcome to {data.spaceName} + Welcome to {data.serverName} Proudly presented by Rustchat More settings, including domain resolution, privileges, securities, and invites are available in{" "} Settings - setStep(step + 1)}> + setStep((prev) => prev + 1)}> play icon Start