"use client" import { useAppStore } from "@/lib/store"; import { useEffect, useState } from "react"; import { redirect, useRouter } from "next/navigation"; import { XCircleIcon, CheckCircleIcon, EyeIcon, EyeSlashIcon } from "@heroicons/react/24/outline" import axios from "axios"; import { LOGIN_ROUTE, REGISTER_ROUTE, USER_INFO_ROUTE, EVENT_GET, TICKET_GET, TTYPE_GET } from "@/routes/routes"; import { Ticket } from "@prisma/client"; export default function Main(){ const { setEvents, setTickets, setTTypes, setUser, user } = useAppStore() const router = useRouter(); const [email, setEmail] = useState("") const [username, setUsername] = useState("") const [password, setPassword] = useState("") const [rPassword, setRPassword] = useState("") const [showPassword, setShowPassword] = useState(false) const [showRPassword, setShowRPassword] = useState(false) const [registring, setRegistring] = useState(false) const [errors, setErrors] = useState({ email: "", username: "", password: "", rPassword: ""}) const handleSubmit = async(e: React.FormEvent) => { // funkcijas kas palaižas pēc submit e.preventDefault() setErrors({ email: "", username: "", password: "", rPassword: ""}) const newErrors = { email: validateEmail(email), username: !username ? "Username is required" : "", password: !password ? "Password is required" : "", rPassword: password !== rPassword ? "Passwords do not match" : "", } const passwordMCriteria = passwordCriteria.every((c) => c.test(password)) if(!passwordMCriteria && password && registring){ newErrors.password = "Password does not meet all requirements" } setErrors(newErrors) if(!registring){ await axios.post(LOGIN_ROUTE, {username, password}, { withCredentials: true }) .then(async (res) => { await axios.get(USER_INFO_ROUTE, { withCredentials: true }) .then((res) => { appInit() setUser(res.data) redirect("/events") }) }) return }else{ const hasErrors = Object.values(errors).some(error => error !== ""); if(hasErrors) return await axios.post(REGISTER_ROUTE, {name, email, username, password}, { withCredentials: true }) .then(async (res) => { await axios.get(USER_INFO_ROUTE, { withCredentials: true }) .then((res) => { setUser(res.data) redirect("/") }) }) return } } const passwordCriteria = [// paroles kritēriji { id: "length", label: "At least 12 characters long", test: (pass: string) => pass.length >= 12 }, { id: "lowercase", label: "Contains lowercase letters", test: (pass: string) => /[a-z]/.test(pass) }, { id: "uppercase", label: "Contains uppercase letters", test: (pass: string) => /[A-Z]/.test(pass) }, { id: "numbers", label: "Contains numbers", test: (pass: string) => /[0-9]/.test(pass) }, { id: "symbols", label: "Contains symbols", test: (pass: string) => /[^a-zA-Z0-9]/.test(pass) }, ] const validateEmail = (email: string) => { // epasta parbaude const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!email) return "Email is required" if (!emailRegex.test(email)) return "Invalid email format" return "" } const appInit = async () => { // datu ievākšana try { const [ eventRes, ticketRes, ttypeRes ] = await Promise.all([ axios.get(EVENT_GET, { withCredentials: true }), axios.get(TICKET_GET, { withCredentials: true }), axios.get(TTYPE_GET, { withCredentials: true }) ]) let filteredTickets = ticketRes.data if(user?.role === 0){ filteredTickets = ticketRes.data.filter((t: Ticket) => t.userId === user.id) } setEvents(eventRes.data) setTickets(filteredTickets) setTTypes(ttypeRes.data) }catch(err){ console.error('Error fetching data:', err); } } return(
{registring ? "Have an account?" : "Don't you have an account"} setRegistring(!registring)}>{registring ? " Sign in" : " Sign Up"}