"use client"; import * as React from "react"; import Link from "next/link"; import Image from "next/image"; import { useRouter } from "next/navigation"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod" import { Controller, useForm } from "react-hook-form" import { toast } from "sonner"; import { Card, CardHeader, CardTitle, CardContent, CardDescription } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import UseAnimations from "react-useanimations"; import checkAnimation from "react-useanimations/lib/checkmark"; import { Field, FieldError, FieldGroup, FieldLabel, } from "@/components/ui/field"; import { SocialLoginButton } from "@/components/core/social-login-button"; import { login } from "@/components/server/login"; import { IconBrandGithub, IconBrandGoogle, IconHomeFilled, IconUserCircle, IconLogout, IconChevronRight } from "@tabler/icons-react"; import { Spinner } from "@/components/ui/spinner"; const loginSchema = z.object({ username: z.string().min(3, "Username must be at least 3 characters long"), password: z.string().min(8, "Password must be at least 8 characters long"), }); export interface LoginFormProps { applicationName: string; applicationLogo?: string; } export const LoginForm = () => { const form = useForm>({ resolver: zodResolver(loginSchema), defaultValues: { username: "", password: "", }, }); const onSubmit = async (data: z.infer) => { const response = await login(data.username, data.password); if (response.success) { toast.success(response.message); } else { toast.error(response.message); } }; return (
( Username )} /> ( Password )} />
); }; export const LoginContainer = (props: LoginFormProps) => { const { applicationName, applicationLogo } = props; return (
{applicationLogo && {applicationName}} {!applicationLogo && ( )}

Login to your account

Welcome back! Please sign in to continue.

} label="GitHub" onClick={() => {}} /> } label="Google" onClick={() => {}} />

Don't have an account? Sign up

); }; export const LoginLoading = (props: LoginFormProps) => { const { applicationName, applicationLogo } = props; return (
{applicationLogo && {applicationName}} {!applicationLogo && ( )}
); }; export const LoginSuccessContainer = (props: LoginFormProps) => { const [isLoading, setIsLoading] = React.useState(true); const [sessionInfo, setSessionInfo] = React.useState<{ username: string, email: string, role: string } | null>(null); const router = useRouter(); const { applicationName, applicationLogo } = props; const handleLogout = async () => { const response = await fetch("/api/logout"); const data = await response.json(); if (data.success) { toast.success(data.message); router.refresh(); } else { toast.error(data.message); } setIsLoading(false); }; React.useEffect(() => { const checkSession = async () => { const response = await fetch("/api/session"); const data = await response.json(); if (data.success) { setSessionInfo(data.sessionInfo); setIsLoading(false); } else { router.refresh(); } }; checkSession(); }, [router]); if (isLoading) { return ; } return (
{applicationLogo && {applicationName}} {!applicationLogo && ( )}

Welcome back, {sessionInfo?.username}!

{sessionInfo?.email}

); };