mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: extract auth footer
This commit is contained in:
28
web/src/components/AuthFooter.tsx
Normal file
28
web/src/components/AuthFooter.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { observer } from "mobx-react-lite";
|
||||||
|
import { workspaceStore } from "@/store/v2";
|
||||||
|
import { cn } from "@/utils";
|
||||||
|
import AppearanceSelect from "./AppearanceSelect";
|
||||||
|
import LocaleSelect from "./LocaleSelect";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AuthFooter = observer(({ className }: Props) => {
|
||||||
|
const handleLocaleSelectChange = (locale: Locale) => {
|
||||||
|
workspaceStore.state.setPartial({ locale });
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleAppearanceSelectChange = (appearance: Appearance) => {
|
||||||
|
workspaceStore.state.setPartial({ appearance });
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={cn("mt-4 flex flex-row items-center justify-center w-full gap-2", className)}>
|
||||||
|
<LocaleSelect value={workspaceStore.state.locale} onChange={handleLocaleSelectChange} />
|
||||||
|
<AppearanceSelect value={workspaceStore.state.appearance as Appearance} onChange={handleAppearanceSelectChange} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default AuthFooter;
|
@@ -2,7 +2,7 @@ import { Button, Checkbox, Input } from "@usememos/mui";
|
|||||||
import { LoaderIcon } from "lucide-react";
|
import { LoaderIcon } from "lucide-react";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
import { ClientError } from "nice-grpc-web";
|
import { ClientError } from "nice-grpc-web";
|
||||||
import { useEffect, useState } from "react";
|
import { useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { authServiceClient } from "@/grpcweb";
|
import { authServiceClient } from "@/grpcweb";
|
||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
@@ -15,17 +15,10 @@ const PasswordSignInForm = observer(() => {
|
|||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const actionBtnLoadingState = useLoading(false);
|
const actionBtnLoadingState = useLoading(false);
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState(workspaceStore.state.profile.mode === "demo" ? "yourselfhosted" : "");
|
||||||
const [password, setPassword] = useState("");
|
const [password, setPassword] = useState(workspaceStore.state.profile.mode === "demo" ? "yourselfhosted" : "");
|
||||||
const [remember, setRemember] = useState(true);
|
const [remember, setRemember] = useState(true);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (workspaceStore.state.profile.mode === "demo") {
|
|
||||||
setUsername("yourselfhosted");
|
|
||||||
setPassword("yourselfhosted");
|
|
||||||
}
|
|
||||||
}, [workspaceStore.state.profile.mode]);
|
|
||||||
|
|
||||||
const handleUsernameInputChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
|
const handleUsernameInputChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const text = e.target.value as string;
|
const text = e.target.value as string;
|
||||||
setUsername(text);
|
setUsername(text);
|
||||||
|
@@ -22,7 +22,7 @@ interface State {
|
|||||||
description: string;
|
description: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
|
const UpdateAccountDialog = ({ destroy }: Props) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
|
@@ -14,7 +14,7 @@ import LocaleSelect from "./LocaleSelect";
|
|||||||
|
|
||||||
type Props = DialogProps;
|
type Props = DialogProps;
|
||||||
|
|
||||||
const UpdateCustomizedProfileDialog: React.FC<Props> = ({ destroy }: Props) => {
|
const UpdateCustomizedProfileDialog = ({ destroy }: Props) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const workspaceGeneralSetting = workspaceStore.state.generalSetting;
|
const workspaceGeneralSetting = workspaceStore.state.generalSetting;
|
||||||
const [customProfile, setCustomProfile] = useState<WorkspaceCustomProfile>(
|
const [customProfile, setCustomProfile] = useState<WorkspaceCustomProfile>(
|
||||||
|
@@ -1,20 +1,10 @@
|
|||||||
import { observer } from "mobx-react-lite";
|
import AuthFooter from "@/components/AuthFooter";
|
||||||
import AppearanceSelect from "@/components/AppearanceSelect";
|
|
||||||
import LocaleSelect from "@/components/LocaleSelect";
|
|
||||||
import PasswordSignInForm from "@/components/PasswordSignInForm";
|
import PasswordSignInForm from "@/components/PasswordSignInForm";
|
||||||
import { workspaceStore } from "@/store/v2";
|
import { workspaceStore } from "@/store/v2";
|
||||||
|
|
||||||
const AdminSignIn = observer(() => {
|
const AdminSignIn = () => {
|
||||||
const workspaceGeneralSetting = workspaceStore.state.generalSetting;
|
const workspaceGeneralSetting = workspaceStore.state.generalSetting;
|
||||||
|
|
||||||
const handleLocaleSelectChange = (locale: Locale) => {
|
|
||||||
workspaceStore.state.setPartial({ locale });
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleAppearanceSelectChange = (appearance: Appearance) => {
|
|
||||||
workspaceStore.state.setPartial({ appearance });
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="py-4 sm:py-8 w-80 max-w-full min-h-[100svh] mx-auto flex flex-col justify-start items-center">
|
<div className="py-4 sm:py-8 w-80 max-w-full min-h-[100svh] mx-auto flex flex-col justify-start items-center">
|
||||||
<div className="w-full py-4 grow flex flex-col justify-center items-center">
|
<div className="w-full py-4 grow flex flex-col justify-center items-center">
|
||||||
@@ -27,12 +17,9 @@ const AdminSignIn = observer(() => {
|
|||||||
<p className="w-full text-xl font-medium dark:text-gray-500">Sign in with admin accounts</p>
|
<p className="w-full text-xl font-medium dark:text-gray-500">Sign in with admin accounts</p>
|
||||||
<PasswordSignInForm />
|
<PasswordSignInForm />
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 flex flex-row items-center justify-center w-full gap-2">
|
<AuthFooter />
|
||||||
<LocaleSelect value={workspaceStore.state.locale} onChange={handleLocaleSelectChange} />
|
|
||||||
<AppearanceSelect value={workspaceStore.state.appearance as Appearance} onChange={handleAppearanceSelectChange} />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
export default AdminSignIn;
|
export default AdminSignIn;
|
||||||
|
@@ -1,11 +1,9 @@
|
|||||||
import { Divider } from "@mui/joy";
|
import { Divider } from "@mui/joy";
|
||||||
import { Button } from "@usememos/mui";
|
import { Button } from "@usememos/mui";
|
||||||
import { observer } from "mobx-react-lite";
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import AppearanceSelect from "@/components/AppearanceSelect";
|
import AuthFooter from "@/components/AuthFooter";
|
||||||
import LocaleSelect from "@/components/LocaleSelect";
|
|
||||||
import PasswordSignInForm from "@/components/PasswordSignInForm";
|
import PasswordSignInForm from "@/components/PasswordSignInForm";
|
||||||
import { identityProviderServiceClient } from "@/grpcweb";
|
import { identityProviderServiceClient } from "@/grpcweb";
|
||||||
import { absolutifyLink } from "@/helpers/utils";
|
import { absolutifyLink } from "@/helpers/utils";
|
||||||
@@ -16,7 +14,7 @@ import { workspaceStore } from "@/store/v2";
|
|||||||
import { IdentityProvider, IdentityProvider_Type } from "@/types/proto/api/v1/idp_service";
|
import { IdentityProvider, IdentityProvider_Type } from "@/types/proto/api/v1/idp_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const SignIn = observer(() => {
|
const SignIn = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]);
|
const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]);
|
||||||
@@ -38,14 +36,6 @@ const SignIn = observer(() => {
|
|||||||
fetchIdentityProviderList();
|
fetchIdentityProviderList();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleLocaleSelectChange = (locale: Locale) => {
|
|
||||||
workspaceStore.state.setPartial({ locale });
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleAppearanceSelectChange = (appearance: Appearance) => {
|
|
||||||
workspaceStore.state.setPartial({ appearance });
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSignInWithIdentityProvider = async (identityProvider: IdentityProvider) => {
|
const handleSignInWithIdentityProvider = async (identityProvider: IdentityProvider) => {
|
||||||
const stateQueryParameter = `auth.signin.${identityProvider.title}-${extractIdentityProviderIdFromName(identityProvider.name)}`;
|
const stateQueryParameter = `auth.signin.${identityProvider.title}-${extractIdentityProviderIdFromName(identityProvider.name)}`;
|
||||||
if (identityProvider.type === IdentityProvider_Type.OAUTH2) {
|
if (identityProvider.type === IdentityProvider_Type.OAUTH2) {
|
||||||
@@ -105,12 +95,9 @@ const SignIn = observer(() => {
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 flex flex-row items-center justify-center w-full gap-2">
|
<AuthFooter />
|
||||||
<LocaleSelect value={workspaceStore.state.locale} onChange={handleLocaleSelectChange} />
|
|
||||||
<AppearanceSelect value={workspaceStore.state.appearance as Appearance} onChange={handleAppearanceSelectChange} />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
export default SignIn;
|
export default SignIn;
|
||||||
|
@@ -1,12 +1,10 @@
|
|||||||
import { Button, Input } from "@usememos/mui";
|
import { Button, Input } from "@usememos/mui";
|
||||||
import { LoaderIcon } from "lucide-react";
|
import { LoaderIcon } from "lucide-react";
|
||||||
import { observer } from "mobx-react-lite";
|
|
||||||
import { ClientError } from "nice-grpc-web";
|
import { ClientError } from "nice-grpc-web";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import AppearanceSelect from "@/components/AppearanceSelect";
|
import AuthFooter from "@/components/AuthFooter";
|
||||||
import LocaleSelect from "@/components/LocaleSelect";
|
|
||||||
import { authServiceClient } from "@/grpcweb";
|
import { authServiceClient } from "@/grpcweb";
|
||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
@@ -14,7 +12,7 @@ import { workspaceStore } from "@/store/v2";
|
|||||||
import { initialUserStore } from "@/store/v2/user";
|
import { initialUserStore } from "@/store/v2/user";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const SignUp = observer(() => {
|
const SignUp = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const actionBtnLoadingState = useLoading(false);
|
const actionBtnLoadingState = useLoading(false);
|
||||||
@@ -32,14 +30,6 @@ const SignUp = observer(() => {
|
|||||||
setPassword(text);
|
setPassword(text);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleLocaleSelectChange = (locale: Locale) => {
|
|
||||||
workspaceStore.state.setPartial({ locale });
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleAppearanceSelectChange = (appearance: Appearance) => {
|
|
||||||
workspaceStore.state.setPartial({ appearance });
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
handleSignUpButtonClick();
|
handleSignUpButtonClick();
|
||||||
@@ -142,12 +132,9 @@ const SignUp = observer(() => {
|
|||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 flex flex-row items-center justify-center w-full gap-2">
|
<AuthFooter />
|
||||||
<LocaleSelect value={workspaceStore.state.locale} onChange={handleLocaleSelectChange} />
|
|
||||||
<AppearanceSelect value={workspaceStore.state.appearance as Appearance} onChange={handleAppearanceSelectChange} />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
export default SignUp;
|
export default SignUp;
|
||||||
|
Reference in New Issue
Block a user