1+ // 'use client';
2+
3+ // import { useState } from 'react';
4+
5+ // export default function Form() {
6+ // const [name, setName] = useState('');
7+ // const [email, setEmail] = useState('');
8+ // const [message, setMessage] = useState('');
9+ // const [loading, setLoading] = useState(false);
10+ // const [error, setError] = useState('');
11+
12+ // const handleSubmit = async (e: React.FormEvent) => {
13+ // e.preventDefault();
14+ // setLoading(true);
15+ // setMessage('');
16+ // setError('');
17+
18+ // try {
19+ // const res = await fetch('/api/submit', {
20+ // method: 'POST',
21+ // headers: { 'Content-Type': 'application/json' },
22+ // body: JSON.stringify({ name, email }),
23+ // });
24+
25+ // if (!res.ok) throw new Error('Failed to submit');
26+ // const data = await res.json();
27+ // setMessage(data.message);
28+ // } catch {
29+ // setError('Submission failed. Please try again.');
30+ // } finally {
31+ // setLoading(false);
32+ // }
33+ // };
34+
35+ // const handleReset = () => {
36+ // setName('');
37+ // setEmail('');
38+ // setMessage('');
39+ // setError('');
40+ // };
41+
42+ // return (
43+ // <div>
44+ // <h1>Form Page</h1>
45+ // <form onSubmit={handleSubmit}>
46+ // <input
47+ // type="text"
48+ // placeholder="Enter your name"
49+ // value={name}
50+ // onChange={(e) => setName(e.target.value)}
51+ // />
52+ // <input
53+ // type="email"
54+ // placeholder="Enter your email"
55+ // value={email}
56+ // onChange={(e) => setEmail(e.target.value)}
57+ // />
58+ // <button type="submit" disabled={loading}>
59+ // {loading ? 'Submitting...' : 'Submit'}
60+ // </button>
61+ // <button type="button" onClick={handleReset}>Reset</button>
62+ // </form>
63+ // {message && <p style={{ color: 'green' }}>{message}</p> }
64+ // {error && <p style={{ color: 'red' }}>{error}</p> }
65+ // </div>
66+ // );
67+ // }
68+
69+
170'use client' ;
271
372import { useState } from 'react' ;
473
574export default function Form ( ) {
6- const [ name , setName ] = useState ( '' ) ;
7- const [ email , setEmail ] = useState ( '' ) ;
75+ const [ formData , setFormData ] = useState ( { name : '' , email : '' } ) ;
876 const [ message , setMessage ] = useState ( '' ) ;
977 const [ loading , setLoading ] = useState ( false ) ;
1078 const [ error , setError ] = useState ( '' ) ;
1179
80+ const validateInputs = ( ) => {
81+ if ( ! formData . name . trim ( ) || ! formData . email . trim ( ) ) {
82+ setError ( 'Both Name and Email are required' ) ;
83+ return false ;
84+ }
85+ if ( formData . name . length > 50 ) {
86+ setError ( 'Name must be 50 characters or less' ) ;
87+ return false ;
88+ }
89+ if ( ! / \S + @ \S + \. \S + / . test ( formData . email ) ) {
90+ setError ( 'Invalid email format' ) ;
91+ return false ;
92+ }
93+ return true ;
94+ } ;
95+
96+ const handleChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
97+ setFormData ( { ...formData , [ e . target . name ] : e . target . value } ) ;
98+ } ;
99+
12100 const handleSubmit = async ( e : React . FormEvent ) => {
13101 e . preventDefault ( ) ;
14102 setLoading ( true ) ;
15103 setMessage ( '' ) ;
16104 setError ( '' ) ;
17-
105+
106+ if ( ! validateInputs ( ) ) {
107+ setLoading ( false ) ;
108+ return ;
109+ }
110+
18111 try {
19112 const res = await fetch ( '/api/submit' , {
20113 method : 'POST' ,
21114 headers : { 'Content-Type' : 'application/json' } ,
22- body : JSON . stringify ( { name , email } ) ,
115+ body : JSON . stringify ( formData ) ,
23116 } ) ;
24117
25118 if ( ! res . ok ) throw new Error ( 'Failed to submit' ) ;
@@ -33,35 +126,34 @@ export default function Form() {
33126 } ;
34127
35128 const handleReset = ( ) => {
36- setName ( '' ) ;
37- setEmail ( '' ) ;
129+ setFormData ( { name : '' , email : '' } ) ;
38130 setMessage ( '' ) ;
39131 setError ( '' ) ;
40132 } ;
41133
42134 return (
43- < div >
135+ < div style = { { maxWidth : '400px' , margin : 'auto' , padding : '20px' , border : '1px solid #ccc' , borderRadius : '8px' } } >
44136 < h1 > Form Page</ h1 >
45- < form onSubmit = { handleSubmit } >
137+ < form onSubmit = { handleSubmit } noValidate >
46138 < input
47139 type = "text"
140+ name = "name"
48141 placeholder = "Enter your name"
49- value = { name }
50- onChange = { ( e ) => setName ( e . target . value ) }
142+ value = { formData . name }
143+ onChange = { handleChange }
51144 />
52145 < input
53146 type = "email"
147+ name = "email"
54148 placeholder = "Enter your email"
55- value = { email }
56- onChange = { ( e ) => setEmail ( e . target . value ) }
149+ value = { formData . email }
150+ onChange = { handleChange }
57151 />
58- < button type = "submit" disabled = { loading } >
59- { loading ? 'Submitting...' : 'Submit' }
60- </ button >
152+ < button type = "submit" > { loading ? 'Submitting...' : 'Submit' } </ button >
61153 < button type = "button" onClick = { handleReset } > Reset</ button >
62154 </ form >
63- { message && < p style = { { color : 'green' } } > { message } </ p > }
64- { error && < p style = { { color : 'red' } } > { error } </ p > }
155+ < p id = "error" style = { { color : 'red' , visibility : error ? 'visible' : 'hidden' } } > { error } </ p >
156+ < p id = "message" style = { { color : 'green' , visibility : message ? 'visible' : 'hidden' } } > { message } </ p >
65157 </ div >
66158 ) ;
67159}
0 commit comments