@@ -30,6 +30,7 @@ export default function FooterLayout({
3030 const [ email , setEmail ] = useState ( '' ) ;
3131 const [ isSubscribed , setIsSubscribed ] = useState ( false ) ;
3232 const [ showToast , setShowToast ] = useState ( false ) ;
33+ const [ error , setError ] = useState ( "" ) ;
3334
3435 useEffect ( ( ) => {
3536 // Simulate real-time stats updates
@@ -59,21 +60,32 @@ export default function FooterLayout({
5960
6061 const handleSubscribe = ( e : React . FormEvent ) => {
6162 e . preventDefault ( ) ;
62- if ( email ) {
63- setIsSubscribed ( true ) ;
64- setShowToast ( true ) ;
65-
66- // Hide toast after 3 seconds
67- setTimeout ( ( ) => {
68- setShowToast ( false ) ;
69- } , 3000 ) ;
70-
71- // Reset form after 3 seconds
72- setTimeout ( ( ) => {
73- setIsSubscribed ( false ) ;
74- setEmail ( '' ) ;
75- } , 3000 ) ;
63+ const emailRegex = / ^ [ ^ \s @ ] + @ [ ^ \s @ ] + \. [ ^ \s @ ] + $ / ;
64+
65+ if ( ! email ) {
66+ setError ( "Email is required" ) ;
67+ return ;
68+ }
69+
70+ if ( ! emailRegex . test ( email ) ) {
71+ setError ( "Please enter a valid email address" ) ;
72+ return ;
7673 }
74+
75+ setError ( "" ) ;
76+ setIsSubscribed ( true ) ;
77+ setShowToast ( true ) ;
78+
79+ // Hide toast after 3 seconds
80+ setTimeout ( ( ) => {
81+ setShowToast ( false ) ;
82+ } , 3000 ) ;
83+
84+ // Reset form after 3 seconds
85+ setTimeout ( ( ) => {
86+ setIsSubscribed ( false ) ;
87+ setEmail ( '' ) ;
88+ } , 3000 ) ;
7789 } ;
7890
7991 return (
@@ -355,6 +367,7 @@ export default function FooterLayout({
355367 >
356368 { isSubscribed ? "✓ Subscribed!" : "Subscribe Now →" }
357369 </ button >
370+ { error && < p className = "error-text" > { error } </ p > }
358371 </ form >
359372 < div className = "newsletter-stats" >
360373 < span className = "newsletter-stat" >
0 commit comments