"use client"; import type React from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { signUpSchema } from "@/schemas/auth.schema"; import Link from "next/link"; import Image from "next/image"; import { useContext, useState } from "react"; import type { z } from "zod"; import { useRouter } from "next/navigation"; import { registerUser } from "@/api/authentication"; import { SessionContext } from "@/context/SessionContext"; import { Eye, EyeOff, Leaf, ArrowRight, AlertCircle, Loader2, Check } from "lucide-react"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Progress } from "@/components/ui/progress"; export default function SignupPage() { const [serverError, setServerError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const [isLoading, setIsLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [passwordStrength, setPasswordStrength] = useState(0); const router = useRouter(); const session = useContext(SessionContext); const { register, handleSubmit, watch, formState: { errors, isSubmitting }, } = useForm>({ resolver: zodResolver(signUpSchema), defaultValues: { email: "", password: "", confirmPassword: "", }, }); const password = watch("password"); // Calculate password strength based on several criteria const calculatePasswordStrength = (password: string) => { if (!password) return 0; let strength = 0; // Length check if (password.length >= 8) strength += 25; // Contains lowercase if (/[a-z]/.test(password)) strength += 25; // Contains uppercase if (/[A-Z]/.test(password)) strength += 25; // Contains number or special char if (/[0-9!@#$%^&*(),.?":{}|<>]/.test(password)) strength += 25; return strength; }; const onPasswordChange = (e: React.ChangeEvent) => { const newStrength = calculatePasswordStrength(e.target.value); setPasswordStrength(newStrength); }; const onSubmit = async (values: z.infer) => { setServerError(null); setSuccessMessage(null); setIsLoading(true); try { const data = await registerUser(values.email, values.password); if (!data) { setServerError("An error occurred while registering. Please try again."); throw new Error("No data received from the server."); } session!.setToken(data.token); session!.setUser(values.email); setSuccessMessage("Registration successful! You can now sign in."); router.push("/setup"); } catch (error: any) { console.error("Error during registration:", error); setServerError(error.message || "Registration failed. Please try again."); } finally { setIsLoading(false); } }; const getPasswordStrengthText = () => { if (passwordStrength === 0) return ""; if (passwordStrength <= 25) return "Weak"; if (passwordStrength <= 50) return "Fair"; if (passwordStrength <= 75) return "Good"; return "Strong"; }; const getPasswordStrengthColor = () => { if (passwordStrength <= 25) return "bg-red-500"; if (passwordStrength <= 50) return "bg-yellow-500"; if (passwordStrength <= 75) return "bg-blue-500"; return "bg-green-500"; }; return (
{/* Left Side - Image */}
ForFarm

Join the farming revolution

Create your account today and discover how ForFarm can help you optimize your agricultural operations.

{[ "Real-time monitoring of your crops", "Smart resource management", "Data-driven insights for better yields", "Connect with other farmers in your area", ].map((feature, index) => (
{feature}
))}
{/* Right Side - Form */}
{/* Theme Selector Placeholder */}
Theme Selector Placeholder
Forfarm

Create your account

Already have an account?{" "} Sign in

{serverError && ( {serverError} )} {successMessage && ( {successMessage} )} {/* Sign Up Form */}
{/* Email */}
{errors.email && (

{errors.email.message}

)}
{/* Password */}
{/* Password Strength Indicator */} {password && (
Password strength {getPasswordStrengthText()}
)} {errors.password && (

{errors.password.message}

)}
{/* Confirm Password */}
{errors.confirmPassword && (

{errors.confirmPassword.message}

)}
Or sign up with

By signing up, you agree to our{" "} Terms of Service {" "} and{" "} Privacy Policy

); }