import { Button, Divider, Input } from "@mui/joy"; import React, { FormEvent, useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import Logo from "@/components/Logo"; import { authServiceClient } from "@/grpcweb"; import { absolutifyLink } from "@/helpers/utils"; import useLoading from "@/hooks/useLoading"; import useNavigateTo from "@/hooks/useNavigateTo"; import { useUserStore, useWorkspaceStore } from "@/stores"; import { IdentityProvider, IdentityProvider_Type } from "@/types/proto/api/v1/workspace_service"; const SignIn: React.FC = () => { const { t } = useTranslation(); const navigateTo = useNavigateTo(); const workspaceStore = useWorkspaceStore(); const userStore = useUserStore(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const actionBtnLoadingState = useLoading(false); const allowConfirm = email.length > 0 && password.length > 0; useEffect(() => { if (workspaceStore.profile.mode === "demo") { setEmail("slash@yourselfhosted.com"); setPassword("secret"); } }, []); const handleEmailInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setEmail(text); }; const handlePasswordInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setPassword(text); }; const handleSigninBtnClick = async (e: FormEvent) => { e.preventDefault(); if (actionBtnLoadingState.isLoading) { return; } try { actionBtnLoadingState.setLoading(); const user = await authServiceClient.signIn({ email, password }); if (user) { userStore.setCurrentUserId(user.id); await userStore.fetchCurrentUser(); navigateTo("/"); } else { toast.error("Signin failed"); } } catch (error: any) { console.error(error); toast.error(error.details); } actionBtnLoadingState.setFinish(); }; const handleSignInWithIdentityProvider = async (identityProvider: IdentityProvider) => { const stateQueryParameter = identityProvider.id; if (identityProvider.type === IdentityProvider_Type.OAUTH2) { const redirectUri = absolutifyLink("/auth/callback"); const oauth2Config = identityProvider.config?.oauth2; if (!oauth2Config) { toast.error("Identity provider configuration is invalid."); return; } const authUrl = `${oauth2Config.authUrl}?client_id=${ oauth2Config.clientId }&redirect_uri=${redirectUri}&state=${stateQueryParameter}&response_type=code&scope=${encodeURIComponent( oauth2Config.scopes.join(" "), )}`; window.location.href = authUrl; } }; return (
Slash
{t("common.email")}
{t("common.password")}
{workspaceStore.profile.enableSignup && (

{"Don't have an account yet?"} {t("auth.sign-up")}

)} {workspaceStore.setting.identityProviders.length > 0 && ( <> {t("common.or")}
{workspaceStore.setting.identityProviders.map((identityProvider) => ( ))}
)}
); }; export default SignIn;