UNPKG

create-bz-mern-app

Version:

CLI to scaffold a fullstack React + Node.js app with Google login and JWT auth

111 lines (103 loc) 2.87 kB
import { Card, Center, Stack, Text, } from "@mantine/core"; import "@mantine/core/styles.css"; import { GoogleLogin } from "@react-oauth/google"; import { showNotification } from "@mantine/notifications"; import Service from "../../utils/http"; import { GOOGLE_AUTH_LOGIN } from "../../utils/urls"; import { useDispatch, useSelector } from "react-redux"; import { getIsLoggedIn, setUser } from "../../redux/slices/User"; import { Navigate, useNavigate } from "react-router-dom"; export default function LoginPage() { const service = new Service(); const navigate = useNavigate(); const dispatch = useDispatch(); const isLoggedIn = useSelector(getIsLoggedIn); const googleResponse = async (res) => { try { const token = res.credential; if (!token) { showNotification({ title: "Error", message: "Invalid Response From Google", color: "red", }); return; } const response = await service.post(GOOGLE_AUTH_LOGIN, { token }); const data = response.data; dispatch( setUser({ name: data.name, avatar: data.avatar, token: data.token, email: data.email, isLoggedIn: true, }) ); showNotification({ title: "Success", message: "Welcome! Login Successfully.", color: "green", }); navigate("/"); } catch (error) { showNotification({ title: "Error", message: error.response?.data?.message ?? "Some Error Occurred!", color: "red", }); console.error("Google login error:", error); } }; if (isLoggedIn) { return <Navigate to="/" />; } return ( <div style={{ height: "100vh", width: "100%", background: "linear-gradient(135deg, #d9afd9 0%, #97d9e1 100%)", display: "flex", alignItems: "center", justifyContent: "center", }} > <Center style={{ height: "100%", width: "100%" }}> <Card shadow="lg" padding="xl" radius="lg" style={{ backgroundColor: "rgba(255, 255, 255, 0.1)", backdropFilter: "blur(10px)", border: "1px solid rgba(255, 255, 255, 0.2)", maxWidth: 400, width: "90%", textAlign: "center", }} > <Text c="white" my="sm" size="lg"> Login to{" "} <Text component="span" fw={700} c="white"> Being Zero </Text> </Text> <Stack align="center" spacing="lg"> <GoogleLogin width={250} theme="filled_black" useOneTap={true} onSuccess={googleResponse} /> </Stack> </Card> </Center> </div> ); }