refactor: project configuration

This commit is contained in:
Tristan Yang
2023-05-15 16:46:50 +08:00
parent 187ffd24d1
commit 20b907aae4
293 changed files with 991 additions and 964 deletions
+92
View File
@@ -0,0 +1,92 @@
import { FC, Suspense, useEffect, useState } from "react";
import { GoogleLogin, GoogleOAuthProvider } from "@react-oauth/google";
import toast from "react-hot-toast";
import { KEY_LOCAL_MAGIC_TOKEN } from "@/app/config";
import IconGoogle from "@/assets/icons/google.svg";
import Button from "./styled/Button";
import { useLoginMutation } from "@/app/services/auth";
import { useTranslation } from "react-i18next";
interface Props {
loadError?: boolean;
loaded?: boolean;
clientId?: string;
type?: "login" | "register";
}
const GoogleLoginInner: FC<Props> = ({ type = "login", loaded, loadError }) => {
const { t } = useTranslation("auth");
const { t: ct } = useTranslation();
const [login, { isSuccess, isLoading, error }] = useLoginMutation();
//拿本地存的magic token
const magic_token = localStorage.getItem(KEY_LOCAL_MAGIC_TOKEN);
useEffect(() => {
if (isSuccess) {
toast.success(ct("tip.login"));
// navigateTo("/");
}
}, [isSuccess]);
useEffect(() => {
if (error && "status" in error) {
switch (error.status) {
case 410:
toast.error(
"No associated account found, please contact user admin for an invitation link to join."
);
break;
default:
toast.error("Something Error");
break;
}
}
}, [error]);
return (
<Button className=" group relative w-full !bg-white dark:!bg-gray-700 !text-gray-600 dark:!text-gray-200 overflow-hidden border border-solid border-gray-300 dark:border-gray-500" disabled={!loaded || isLoading}>
<div className="absolute left-0 top-0 w-full h-full flex-center gap-3 z-[998] bg-inherit">
<IconGoogle className="w-6 h-6" />
{loadError
? "Script Load Error!"
: loaded
? `${type === "login" ? t("login.google") : t("reg.google")}`
: `Initializing`}
</div>
<div className="absolute left-0 top-0 w-full h-full group-hover:opacity-0 group-hover:z-[999]">
<GoogleLogin
width="360px"
onSuccess={(res) => {
login({
magic_token,
id_token: res.credential || "",
type: "google"
});
}}
/>
</div>
</Button>
);
};
const GoogleLoginButton: FC<Props> = ({ type = "login", clientId }) => {
const [scriptLoaded, setScriptLoaded] = useState(false);
const [hasError, setHasError] = useState(false);
if (!clientId) return null;
return (
<Suspense fallback={<span>loading...</span>}>
<GoogleOAuthProvider
onScriptLoadError={() => {
setHasError(true);
}}
onScriptLoadSuccess={() => {
setScriptLoaded(true);
}}
clientId={clientId}
>
<GoogleLoginInner type={type} loaded={scriptLoaded} loadError={hasError} />
</GoogleOAuthProvider>
</Suspense>
);
};
export default GoogleLoginButton;