1
1
'use client' ;
2
2
3
3
import React , { useState , useEffect } from 'react' ;
4
- import { onAuthStateChanged , signOut } from 'firebase/auth' ;
4
+ import { onAuthStateChanged , signInWithEmailAndPassword , createUserWithEmailAndPassword } from 'firebase/auth' ;
5
5
import { useRouter } from 'next/navigation' ;
6
6
import { auth } from '../../../shared/firebase' ;
7
- import Login from './login/login' ;
8
- import Signup from './signup/signup' ;
9
- import Logout from './logout/logout' ;
10
7
import styles from './auth.module.css' ;
8
+ import { NEXT_PUBLIC_API_URL } from '../../../shared/api' ;
11
9
12
10
const Auth = ( ) => {
13
11
const [ user , setUser ] = useState ( null ) ;
@@ -28,33 +26,135 @@ const Auth = () => {
28
26
return ( ) => unsubscribe ( ) ;
29
27
} , [ router ] ) ;
30
28
31
- const handleLogout = async ( ) => {
32
- try {
33
- await signOut ( auth ) ;
34
- setUser ( null ) ;
35
- setShowLogin ( true ) ; // Reset to Login view
36
- router . push ( '/auth' ) ; // Redirect to auth page
37
- } catch ( error ) {
38
- console . error ( 'Logout failed:' , error . message ) ;
39
- }
29
+ const Login = ( ) => {
30
+ const [ email , setEmail ] = useState ( '' ) ;
31
+ const [ password , setPassword ] = useState ( '' ) ;
32
+ const [ error , setError ] = useState ( '' ) ;
33
+ const [ success , setSuccess ] = useState ( false ) ;
34
+
35
+ const handleLogin = async ( e ) => {
36
+ e . preventDefault ( ) ;
37
+ setError ( '' ) ;
38
+ setSuccess ( false ) ;
39
+
40
+ try {
41
+ const userCredential = await signInWithEmailAndPassword ( auth , email , password ) ;
42
+ console . log ( 'User logged in:' , userCredential . user ) ;
43
+ setSuccess ( true ) ;
44
+ } catch ( err ) {
45
+ console . error ( 'Error logging in:' , err ) ;
46
+ setError ( err . message ) ;
47
+ }
48
+ } ;
49
+
50
+ return (
51
+ < div >
52
+ < form className = { styles . authForm } onSubmit = { handleLogin } >
53
+ < label > Email:</ label >
54
+ < input
55
+ type = "email"
56
+ value = { email }
57
+ onChange = { ( e ) => setEmail ( e . target . value ) }
58
+ required
59
+ />
60
+ < label > Password:</ label >
61
+ < input
62
+ type = "password"
63
+ value = { password }
64
+ onChange = { ( e ) => setPassword ( e . target . value ) }
65
+ required
66
+ />
67
+ < button type = "submit" > Login</ button >
68
+ </ form >
69
+ { success && < p className = { `${ styles . authMessage } ${ styles . success } ` } > Login successful!</ p > }
70
+ { error && < p className = { `${ styles . authMessage } ${ styles . error } ` } > { error } </ p > }
71
+ </ div >
72
+ ) ;
73
+ } ;
74
+
75
+ const Signup = ( ) => {
76
+ const [ email , setEmail ] = useState ( '' ) ;
77
+ const [ password , setPassword ] = useState ( '' ) ;
78
+ const [ error , setError ] = useState ( '' ) ;
79
+ const [ success , setSuccess ] = useState ( false ) ;
80
+
81
+ const handleSignup = async ( e ) => {
82
+ e . preventDefault ( ) ;
83
+ setError ( '' ) ;
84
+ setSuccess ( false ) ;
85
+
86
+ try {
87
+ // Step 1: Send request to the API to sign up
88
+ const response = await fetch ( `${ NEXT_PUBLIC_API_URL } /auth/signup` , {
89
+ method : 'POST' ,
90
+ headers : {
91
+ 'Content-Type' : 'application/json' ,
92
+ } ,
93
+ body : JSON . stringify ( {
94
+ email : email ,
95
+ password : password ,
96
+ } ) ,
97
+ } ) ;
98
+
99
+ const data = await response . json ( ) ;
100
+ console . log ( 'API Response:' , data ) ;
101
+
102
+ if ( ! response . ok ) {
103
+ setError ( data . error || 'Failed to sign up in API' ) ;
104
+ return ; // Exit if API call fails
105
+ }
106
+
107
+ // Step 2: If API call is successful, proceed with Firebase Authentication
108
+ const userCredential = await createUserWithEmailAndPassword ( auth , email , password ) ;
109
+ console . log ( 'User signed up with Firebase:' , userCredential . user ) ;
110
+
111
+ setSuccess ( true ) ;
112
+ console . log ( 'User created successfully:' , userCredential . user ) ;
113
+
114
+ // Only redirect after the user is signed up successfully
115
+ router . push ( '/dashboard' ) ; // Redirect to dashboard after signup
116
+ } catch ( err ) {
117
+ console . error ( 'Error signing up:' , err ) ;
118
+ setError ( err . message || 'Something went wrong' ) ;
119
+ }
120
+ } ;
121
+
122
+ return (
123
+ < div >
124
+ < form className = { styles . authForm } onSubmit = { handleSignup } >
125
+ < label > Email:</ label >
126
+ < input
127
+ type = "email"
128
+ value = { email }
129
+ onChange = { ( e ) => setEmail ( e . target . value ) }
130
+ required
131
+ />
132
+ < label > Password:</ label >
133
+ < input
134
+ type = "password"
135
+ value = { password }
136
+ onChange = { ( e ) => setPassword ( e . target . value ) }
137
+ required
138
+ />
139
+ < button type = "submit" > Sign Up</ button >
140
+ </ form >
141
+ { success && < p className = { `${ styles . authMessage } ${ styles . success } ` } > Sign up successful!</ p > }
142
+ { error && < p className = { `${ styles . authMessage } ${ styles . error } ` } > { error } </ p > }
143
+ </ div >
144
+ ) ;
40
145
} ;
41
146
42
147
return (
43
148
< div className = { styles . authContainer } >
44
149
{ user ? (
45
150
< div >
46
151
< h2 className = { styles . authHeader } > Welcome, { user . email } </ h2 >
47
- < p className = { styles . authMessage } >
48
- You are already signed in.
49
- </ p >
152
+ < p className = { styles . authMessage } > You are already signed in.</ p >
50
153
< br />
51
- < Logout onLogout = { handleLogout } />
52
154
</ div >
53
155
) : (
54
156
< div >
55
- < h2 className = { styles . authHeader } >
56
- { showLogin ? 'Login' : 'Signup' }
57
- </ h2 >
157
+ < h2 className = { styles . authHeader } > { showLogin ? 'Login' : 'Signup' } </ h2 >
58
158
< div className = { styles . toggleContainer } >
59
159
< button
60
160
className = { `${ styles . button } ${ showLogin ? styles . active : '' } ` }
0 commit comments