@@ -21,8 +21,9 @@ const ArchitectsPage = () => {
2121 image_url : "" ,
2222 } ) ;
2323 const [ message , setMessage ] = useState ( "" ) ;
24+ const [ isAlreadyRegistered , setIsAlreadyRegistered ] = useState ( false ) ;
2425
25- // Fetch architects
26+ // ✅ Fetch architects
2627 const fetchArchitects = async ( ) => {
2728 setLoading ( true ) ;
2829 const { data, error } = await supabase . from ( "architects" ) . select ( "*" ) ;
@@ -31,11 +32,31 @@ const ArchitectsPage = () => {
3132 setLoading ( false ) ;
3233 } ;
3334
35+ // ✅ Check if user already registered as architect
36+ const checkIfRegistered = async ( ) => {
37+ if ( ! user ) return ;
38+ const { data, error } = await supabase
39+ . from ( "architects" )
40+ . select ( "id" )
41+ . eq ( "user_id" , user . id )
42+ . maybeSingle ( ) ;
43+
44+ if ( ! error && data ) {
45+ setIsAlreadyRegistered ( true ) ;
46+ } else {
47+ setIsAlreadyRegistered ( false ) ;
48+ }
49+ } ;
50+
3451 useEffect ( ( ) => {
3552 fetchArchitects ( ) ;
3653 } , [ ] ) ;
3754
38- // Handle input
55+ useEffect ( ( ) => {
56+ if ( user ) checkIfRegistered ( ) ;
57+ } , [ user ] ) ;
58+
59+ // ✅ Handle input
3960 const handleChange = (
4061 e : React . ChangeEvent < HTMLInputElement | HTMLTextAreaElement >
4162 ) => {
@@ -85,7 +106,7 @@ const ArchitectsPage = () => {
85106 }
86107 } ;
87108
88- // Handle form submit
109+ // ✅ Handle form submit with duplicate prevention
89110 const handleRegister = async ( e : React . FormEvent ) => {
90111 e . preventDefault ( ) ;
91112
@@ -103,22 +124,36 @@ const ArchitectsPage = () => {
103124 setLoading ( true ) ;
104125 setMessage ( "" ) ;
105126
106- const { error } = await supabase . from ( "architects" ) . insert ( [
107- {
108- name,
109- specialization,
110- description,
111- image_url,
112- user_id : user . id ,
113- } ,
114- ] ) ;
127+ try {
128+ // ✅ Step 1: Check if already registered
129+ const { data : existingArchitect , error : checkError } = await supabase
130+ . from ( "architects" )
131+ . select ( "id" )
132+ . eq ( "user_id" , user . id )
133+ . maybeSingle ( ) ;
134+
135+ if ( checkError ) throw checkError ;
136+
137+ if ( existingArchitect ) {
138+ setMessage ( "You are already registered as an architect." ) ;
139+ setLoading ( false ) ;
140+ setIsAlreadyRegistered ( true ) ;
141+ return ;
142+ }
115143
116- setLoading ( false ) ;
144+ // ✅ Step 2: Register new architect
145+ const { error } = await supabase . from ( "architects" ) . insert ( [
146+ {
147+ name,
148+ specialization,
149+ description,
150+ image_url,
151+ user_id : user . id ,
152+ } ,
153+ ] ) ;
154+
155+ if ( error ) throw error ;
117156
118- if ( error ) {
119- console . error ( error ) ;
120- setMessage ( `Failed to register: ${ error . message } ` ) ;
121- } else {
122157 setMessage ( "Successfully registered as architect!" ) ;
123158 setFormData ( {
124159 name : "" ,
@@ -127,18 +162,28 @@ const ArchitectsPage = () => {
127162 image_url : "" ,
128163 } ) ;
129164 setShowForm ( false ) ;
165+ setIsAlreadyRegistered ( true ) ;
130166 fetchArchitects ( ) ;
167+ } catch ( err : any ) {
168+ console . error ( err ) ;
169+ setMessage ( `Failed to register: ${ err . message } ` ) ;
170+ } finally {
171+ setLoading ( false ) ;
131172 }
132173 } ;
133174
175+ // ✅ Handle Register button click
134176 const handleRegisterClick = ( ) => {
135177 if ( ! user ) {
136178 navigate ( "/auth/login" ) ;
179+ } else if ( isAlreadyRegistered ) {
180+ setMessage ( "You are already registered as an architect." ) ;
137181 } else {
138182 setShowForm ( true ) ;
139183 }
140184 } ;
141185
186+ // ✅ Filter Architects for Search
142187 const filteredArchitects = architects . filter (
143188 ( arch ) =>
144189 arch . name ?. toLowerCase ( ) . includes ( search . toLowerCase ( ) ) ||
@@ -173,11 +218,17 @@ const ArchitectsPage = () => {
173218 Search →
174219 </ button >
175220 </ div >
221+
176222 < button
177223 onClick = { handleRegisterClick }
178- className = "bg-blue-600 text-white px-6 py-2 rounded-lg font-semibold hover:bg-blue-700 transition"
224+ className = { `${
225+ isAlreadyRegistered
226+ ? "bg-gray-400 cursor-not-allowed"
227+ : "bg-blue-600 hover:bg-blue-700"
228+ } text-white px-6 py-2 rounded-lg font-semibold transition`}
229+ disabled = { isAlreadyRegistered }
179230 >
180- Register as Architect
231+ { isAlreadyRegistered ? "Already Registered" : " Register as Architect" }
181232 </ button >
182233 </ div >
183234
@@ -212,10 +263,9 @@ const ArchitectsPage = () => {
212263 </ div >
213264 </ section >
214265
215- { /* ✅ Registration Form with Close Button */ }
216- { showForm && user && (
266+ { /* Registration Form */ }
267+ { showForm && user && ! isAlreadyRegistered && (
217268 < section className = "max-w-4xl mx-auto mt-10 bg-gray-50 p-6 rounded-2xl shadow-md border border-gray-200 relative" >
218- { /* ❌ Close Button */ }
219269 < button
220270 onClick = { ( ) => setShowForm ( false ) }
221271 className = "absolute top-4 right-4 text-gray-600 hover:text-gray-800 text-3xl font-bold"
@@ -358,3 +408,4 @@ const ArchitectsPage = () => {
358408} ;
359409
360410export default ArchitectsPage ;
411+
0 commit comments