180 lines
5.7 KiB
TypeScript
180 lines
5.7 KiB
TypeScript
import React, { useState, FormEvent } from "react";
|
||
import { useNavigate } from "react-router-dom";
|
||
import { LogoIconLarge } from "../components/icons/Logo";
|
||
import { EyeIcon } from "../components/icons/ExportCommonIcons";
|
||
import { useOrganization, useUserName } from "../store/store";
|
||
import { signInApi } from "../services/factoryBuilder/signInSignUp/signInApi";
|
||
import { signUpApi } from "../services/factoryBuilder/signInSignUp/signUpApi";
|
||
// import LoadingPage from "../components/templates/LoadingPage";
|
||
|
||
const UserAuth: React.FC = () => {
|
||
const [email, setEmail] = useState("");
|
||
const [password, setPassword] = useState("");
|
||
const [showPassword, setShowPassword] = useState(false);
|
||
const [error, setError] = useState("");
|
||
const [isSignIn, setIsSignIn] = useState(true);
|
||
const { userName, setUserName } = useUserName();
|
||
const { organization, setOrganization } = useOrganization();
|
||
|
||
const navigate = useNavigate();
|
||
|
||
const handleLogin = async (e: FormEvent<HTMLFormElement>) => {
|
||
e.preventDefault();
|
||
|
||
const organization = (email.split("@")[1]).split(".")[0];
|
||
try {
|
||
const res = await signInApi(email, password, organization);
|
||
|
||
if (res.message === "login successfull") {
|
||
setError("");
|
||
setOrganization(organization);
|
||
setUserName(res.name);
|
||
localStorage.setItem("userId", res.userId);
|
||
localStorage.setItem("email", res.email);
|
||
localStorage.setItem("userName", res.name);
|
||
if (res.isShare) {
|
||
navigate("/Project");
|
||
}
|
||
} else if (res.message === "User Not Found!!! Kindly signup...") {
|
||
setError("Account not found");
|
||
}
|
||
} catch (error) { }
|
||
};
|
||
|
||
const handleRegister = async (e: FormEvent) => {
|
||
e.preventDefault();
|
||
if (email && password && userName) {
|
||
setError("");
|
||
try {
|
||
const organization = (email.split("@")[1]).split(".")[0];
|
||
const res = await signUpApi(userName, email, password, organization);
|
||
|
||
if (res.message === "New User created") {
|
||
setIsSignIn(true);
|
||
}
|
||
if (res.message === "User already exists") {
|
||
setError("User already exists");
|
||
}
|
||
} catch (error) { }
|
||
} else {
|
||
setError("Please fill all the fields!");
|
||
}
|
||
};
|
||
|
||
return (
|
||
<>
|
||
{/* <LoadingPage progress={20} /> */}
|
||
<div className="auth-container">
|
||
<div className="logo-icon">
|
||
<LogoIconLarge />
|
||
</div>
|
||
<h1>Welcome to Dwinzo</h1>
|
||
<p>
|
||
{isSignIn ? (
|
||
<>
|
||
Don’t have an account?{" "}
|
||
<span
|
||
className="link"
|
||
onClick={() => setIsSignIn(false)}
|
||
style={{ cursor: "pointer" }}
|
||
>
|
||
Register here!
|
||
</span>
|
||
</>
|
||
) : (
|
||
<>
|
||
Already have an account?{" "}
|
||
<span
|
||
className="link"
|
||
onClick={() => setIsSignIn(true)}
|
||
style={{ cursor: "pointer" }}
|
||
>
|
||
Login here!
|
||
</span>
|
||
</>
|
||
)}
|
||
</p>
|
||
|
||
<button className="google-login">
|
||
<span className="google-icon">G</span> Continue with Google
|
||
</button>
|
||
|
||
{error && <div className="error-message">🛈 {error}</div>}
|
||
|
||
<form
|
||
onSubmit={isSignIn ? handleLogin : handleRegister}
|
||
className="auth-form"
|
||
>
|
||
{!isSignIn && (
|
||
<input
|
||
type="text"
|
||
value={userName}
|
||
placeholder="Username"
|
||
onChange={(e) => setUserName(e.target.value)}
|
||
required
|
||
/>
|
||
)}
|
||
<input
|
||
type="email"
|
||
name="email"
|
||
value={email}
|
||
placeholder="Email"
|
||
onChange={(e) => setEmail(e.target.value)}
|
||
required
|
||
/>
|
||
<div className="password-container">
|
||
<input
|
||
name="password"
|
||
type={showPassword ? "text" : "password"}
|
||
value={password}
|
||
placeholder="Password"
|
||
onChange={(e) => setPassword(e.target.value)}
|
||
required
|
||
/>
|
||
<button
|
||
type="button"
|
||
className="toggle-password"
|
||
onClick={() => setShowPassword(!showPassword)}
|
||
>
|
||
<EyeIcon isClosed={showPassword} />
|
||
</button>
|
||
</div>
|
||
{!isSignIn && (
|
||
<div className="policy-checkbox">
|
||
<input type="checkbox" name="" id="" required/>
|
||
<div className="label">
|
||
I have read and agree to the terms of service
|
||
</div>
|
||
</div>
|
||
)}
|
||
<button type="submit" className="continue-button">
|
||
{isSignIn ? "Continue" : "Register"}
|
||
</button>
|
||
</form>
|
||
<p className="policy">
|
||
By signing up for, or logging into, an account, you agree to our{" "}
|
||
<span
|
||
className="link"
|
||
onClick={() => navigate("/privacy")}
|
||
style={{ cursor: "pointer" }}
|
||
>
|
||
privacy policy
|
||
</span>{" "}
|
||
&{" "}
|
||
<span
|
||
className="link"
|
||
onClick={() => navigate("/terms")}
|
||
style={{ cursor: "pointer" }}
|
||
>
|
||
terms of service
|
||
</span>{" "}
|
||
whether you read them or not. You can also find these terms on our
|
||
website.
|
||
</p>
|
||
</div>
|
||
</>
|
||
);
|
||
};
|
||
|
||
export default UserAuth;
|