From f55431def46a484f55b7ead213cb6d13b966942d Mon Sep 17 00:00:00 2001 From: Nasser AlKawari <60303522@udst.edu.qa> Date: Sat, 11 Apr 2026 17:16:42 +0300 Subject: [PATCH 1/3] feat: add input validation to login form --- src/pages/LoginPage.jsx | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx index a8b63b8..6c5d512 100644 --- a/src/pages/LoginPage.jsx +++ b/src/pages/LoginPage.jsx @@ -8,15 +8,47 @@ function LoginPage() { password: "", }); + const [errors, setErrors] = useState({}); + + const validateForm = () => { + const newErrors = {}; + + if (!formData.email.trim()) { + newErrors.email = "Email is required."; + } else if (!/\S+@\S+\.\S+/.test(formData.email)) { + newErrors.email = "Please enter a valid email address."; + } + + if (!formData.password.trim()) { + newErrors.password = "Password is required."; + } else if (formData.password.length < 6) { + newErrors.password = "Password must be at least 6 characters."; + } + + return newErrors; + }; + const handleChange = (e) => { setFormData((prev) => ({ ...prev, [e.target.name]: e.target.value, })); + + setErrors((prev) => ({ + ...prev, + [e.target.name]: "", + })); }; const handleSubmit = (e) => { e.preventDefault(); + + const validationErrors = validateForm(); + if (Object.keys(validationErrors).length > 0) { + setErrors(validationErrors); + return; + } + navigate("/landing"); }; @@ -38,6 +70,7 @@ function LoginPage() { value={formData.email} onChange={handleChange} /> + {errors.email &&

{errors.email}

} + {errors.password &&

{errors.password}

} - )} - +
Upload
+ {errors.difficulty && ( +

{errors.difficulty}

+ )}
@@ -182,19 +169,31 @@ function GenerateQuizPage() { ))}
+ {errors.numQuestions && ( +

{errors.numQuestions}

+ )}
{error &&

{error}

} - @@ -218,15 +217,24 @@ function GenerateQuizPage() {

Instant Synthesis

-

Our AI engine transforms complex raw material into teachable concepts.

+

+ Our AI engine transforms complex raw material into teachable + concepts. +

Adaptive Feedback

-

Receive custom explanations for every answer to strengthen learning.

+

+ Receive custom explanations for every answer to strengthen + learning. +

Smart Repository

-

Every quiz is archived and categorized for future review and analysis.

+

+ Every quiz is archived and categorized for future review and + analysis. +

@@ -247,186 +255,4 @@ function GenerateQuizPage() { ); } -export default GenerateQuizPage; - -// REAL VERSION AFTER AI GENERATION IS IMPLEMENTED -// import { useState } from "react"; -// import { useNavigate } from "react-router-dom"; -// import { generateQuiz } from "../services/api"; - -// function GenerateQuizPage() { -// const navigate = useNavigate(); -// const [topic, setTopic] = useState(""); -// const [numQuestions, setNumQuestions] = useState(10); -// const [difficulty, setDifficulty] = useState("medium"); -// const [loading, setLoading] = useState(false); -// const [error, setError] = useState(""); - -// const handleGenerate = async (e) => { -// e.preventDefault(); - -// if (!topic.trim()) { -// setError("Please enter a topic or paste study material."); -// return; -// } - -// try { -// setLoading(true); -// setError(""); - -// const data = await generateQuiz({ -// topic, -// numQuestions, -// difficulty, -// }); - -// navigate("/quiz", { -// state: { -// topic, -// questions: data.questions || [], -// }, -// }); -// } catch (err) { -// setError(err.message || "Failed to generate quiz."); -// } finally { -// setLoading(false); -// } -// }; - -// return ( -//
-//
-//
Quizey
- -// - -//
Profile
-//
- -//
-//
-//
AI Powered Learning
-//

-// Craft your -//
-// intellectual -//
-// path. -//

-//

-// Input any topic and let AI architect a customized assessment designed -// for deep comprehension and long-term retention. -//

- -//
-//
-//
-//
-// 2.8m+ quizzes generated today -//
-//
- -//
-//
-// -// setTopic(e.target.value)} -// /> - -// -//
Upload
- -//
-//
-// -// -//
- -//
-// -//
-// {[5, 10, 15, 20].map((num) => ( -// -// ))} -//
-//
-//
- -// {error &&

{error}

} - -// - -//
-//
-// QUESTION PREVIEW -// LIVE PREVIEW -//
-//
-//
-//
-//
-//
-//
-//
- -//
-//

Why learn with Quizey?

-//
- -//
-//
-//

Instant Synthesis

-//

Our AI engine transforms complex raw material into teachable concepts.

-//
-//
-//

Adaptive Feedback

-//

Receive custom explanations for every answer to strengthen learning.

-//
-//
-//

Smart Repository

-//

Every quiz is archived and categorized for future review and analysis.

-//
-//
-//
- -// -//
-// ); -// } - -// export default GenerateQuizPage; \ No newline at end of file +export default GenerateQuizPage; \ No newline at end of file