import { Button, Paper, PasswordInput, TextInput, Title, Text, Divider, Grid, } from "@mantine/core"; import { useForm, zodResolver } from "@mantine/form"; import { notifications } from "@mantine/notifications"; import { useMutation } from "@tanstack/react-query"; import axios from "axios"; import { z } from "zod"; import { useUserContext } from "../context/user-context"; import { Navigate } from "react-router"; import { Layout } from "../components/layouts/layout"; import { GoogleIcon } from "../icons/google"; import { GithubIcon } from "../icons/github"; import { OAuthIcon } from "../icons/oauth"; import { TailscaleIcon } from "../icons/tailscale"; import { isQueryValid } from "../utils/utils"; export const LoginPage = () => { const queryString = window.location.search; const params = new URLSearchParams(queryString); const redirectUri = params.get("redirect_uri") ?? ""; const { isLoggedIn, configuredProviders } = useUserContext(); const oauthProviders = configuredProviders.filter( (value) => value !== "username", ); if (isLoggedIn) { return ; } const schema = z.object({ username: z.string(), password: z.string(), }); type FormValues = z.infer; const form = useForm({ mode: "uncontrolled", initialValues: { username: "", password: "", }, validate: zodResolver(schema), }); const loginMutation = useMutation({ mutationFn: (login: FormValues) => { return axios.post("/api/login", login); }, onError: () => { notifications.show({ title: "Failed to login", message: "Check your username and password", color: "red", }); }, onSuccess: () => { notifications.show({ title: "Logged in", message: "Welcome back!", color: "green", }); setTimeout(() => { if (!isQueryValid(redirectUri)) { window.location.replace("/"); } else { window.location.replace(`/continue?redirect_uri=${redirectUri}`); } }, 500); }, }); const loginOAuthMutation = useMutation({ mutationFn: (provider: string) => { return axios.get( `/api/oauth/url/${provider}?redirect_uri=${redirectUri}`, ); }, onError: () => { notifications.show({ title: "Internal error", message: "Failed to get OAuth URL", color: "red", }); }, onSuccess: (data) => { notifications.show({ title: "Redirecting", message: "Redirecting to your OAuth provider", color: "blue", }); setTimeout(() => { window.location.href = data.data.url; }, 500); }, }); const handleSubmit = (values: FormValues) => { loginMutation.mutate(values); }; return ( Tinyauth {oauthProviders.length > 0 && ( <> Welcome back, login with {oauthProviders.includes("google") && ( )} {oauthProviders.includes("github") && ( )} {oauthProviders.includes("tailscale") && ( )} {oauthProviders.includes("generic") && ( )} {configuredProviders.includes("username") && ( )} )} {configuredProviders.includes("username") && (
)}
); };