Skip to content

Commit 15d6789

Browse files
committed
Register as Architect button becomes disabled with Already Registered label.
1 parent b85583e commit 15d6789

1 file changed

Lines changed: 73 additions & 22 deletions

File tree

src/pages/categories/Architects.tsx

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

360410
export default ArchitectsPage;
411+

0 commit comments

Comments
 (0)