@@ -11,6 +11,7 @@ import {
1111} from "@/components/ui/field" ;
1212import { Input } from "@/components/ui/input" ;
1313import { createClient } from "@/lib/supabase/client" ;
14+ import { useUserStore } from "@/store/userStore" ;
1415import type { Provider } from "@supabase/auth-js" ;
1516import Image from "next/image" ;
1617import Link from "next/link" ;
@@ -21,54 +22,68 @@ const Signup = () => {
2122 const [ email , setEmail ] = useState ( "" ) ;
2223 const [ password , setPassword ] = useState ( "" ) ;
2324 const [ confirmPassword , setConfirmPassword ] = useState ( "" ) ;
24- const [ error , setError ] = useState < string | null > ( null ) ;
25- const [ isLoading , setIsLoading ] = useState ( false ) ;
2625 const router = useRouter ( ) ;
2726
27+ const { setUser, setLoading, setError, isLoading, error } = useUserStore ( ) ;
2828 const supabase = createClient ( ) ;
2929
3030 const handleSignup = async ( e : React . FormEvent ) => {
3131 e . preventDefault ( ) ;
32- setIsLoading ( true ) ;
32+ setLoading ( true ) ;
3333 setError ( null ) ;
3434
3535 if ( password !== confirmPassword ) {
3636 setError ( "Passwords do not match" ) ;
37- setIsLoading ( false ) ;
37+ setLoading ( false ) ;
3838 return ;
3939 }
4040
4141 try {
42- const { error } = await supabase . auth . signUp ( {
42+ const { data , error : authError } = await supabase . auth . signUp ( {
4343 email,
4444 password,
4545 } ) ;
46- if ( error ) throw error ;
46+
47+ if ( authError ) throw authError ;
48+
49+ if ( data . user ) {
50+ setUser ( {
51+ id : data . user . id ,
52+ email : data . user . email ! ,
53+ name :
54+ data . user . user_metadata ?. name || data . user . user_metadata ?. full_name ,
55+ avatar_url : data . user . user_metadata ?. avatar_url ,
56+ provider : "email" ,
57+ created_at : data . user . created_at ,
58+ updated_at : data . user . updated_at || data . user . created_at ,
59+ } ) ;
60+ }
61+
4762 router . push ( "/" ) ;
4863 } catch ( error : unknown ) {
4964 console . log ( error ) ;
5065 setError ( error instanceof Error ? error . message : "An error occurred" ) ;
5166 } finally {
52- setIsLoading ( false ) ;
67+ setLoading ( false ) ;
5368 }
5469 } ;
5570
5671 const handleOAuthLogin = async ( provider : Provider ) => {
57- setIsLoading ( true ) ;
72+ setLoading ( true ) ;
5873 setError ( null ) ;
5974
6075 try {
61- const { error } = await supabase . auth . signInWithOAuth ( {
76+ const { error : authError } = await supabase . auth . signInWithOAuth ( {
6277 provider,
6378 options : {
64- redirectTo : `${ window . location . origin } ` ,
79+ redirectTo : `${ window . location . origin } /auth/callback ` ,
6580 } ,
6681 } ) ;
67- if ( error ) throw error ;
82+ if ( authError ) throw authError ;
6883 } catch ( error : unknown ) {
6984 setError ( error instanceof Error ? error . message : "An error occurred" ) ;
7085 } finally {
71- setIsLoading ( false ) ;
86+ setLoading ( false ) ;
7287 }
7388 } ;
7489
@@ -102,6 +117,7 @@ const Signup = () => {
102117 required
103118 value = { email }
104119 onChange = { ( e ) => setEmail ( e . target . value ) }
120+ disabled = { isLoading }
105121 />
106122 </ Field >
107123 < Field >
@@ -114,6 +130,7 @@ const Signup = () => {
114130 required
115131 value = { password }
116132 onChange = { ( e ) => setPassword ( e . target . value ) }
133+ disabled = { isLoading }
117134 />
118135 </ Field >
119136 < Field >
@@ -126,6 +143,7 @@ const Signup = () => {
126143 required
127144 value = { confirmPassword }
128145 onChange = { ( e ) => setConfirmPassword ( e . target . value ) }
146+ disabled = { isLoading }
129147 />
130148 </ Field >
131149 </ Field >
@@ -151,6 +169,7 @@ const Signup = () => {
151169 variant = "outline"
152170 type = "button"
153171 onClick = { ( ) => handleOAuthLogin ( "github" ) }
172+ disabled = { isLoading }
154173 className = "border-emerald-200 text-slate-700 hover:bg-emerald-50 hover:border-emerald-300 dark:border-violet-400/40 dark:text-neutral-300 dark:hover:bg-violet-500/10 dark:hover:border-violet-400"
155174 >
156175 < Image
@@ -165,6 +184,7 @@ const Signup = () => {
165184 variant = "outline"
166185 type = "button"
167186 onClick = { ( ) => handleOAuthLogin ( "google" ) }
187+ disabled = { isLoading }
168188 className = "border-emerald-200 text-slate-700 hover:bg-emerald-50 hover:border-emerald-300 dark:border-violet-400/40 dark:text-neutral-300 dark:hover:bg-violet-500/10 dark:hover:border-violet-400"
169189 >
170190 < GoogleIcon className = "size-8" />
0 commit comments