Skip to content

Commit 1c103f2

Browse files
committed
added a button so that any user can book a service as an Architect
1 parent 15d6789 commit 1c103f2

2 files changed

Lines changed: 107 additions & 3 deletions

File tree

src/pages/categories/ArchitectDetail.tsx

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useParams, useNavigate } from "react-router-dom";
33
import { supabase } from "@/integrations/supabase/client";
44
import Navbar from "@/components/Navbar";
55
import Footer from "@/components/Footer";
6-
import { Loader2, Upload } from "lucide-react";
6+
import { Loader2, Upload, X } from "lucide-react";
77
import { motion } from "framer-motion";
88

99
export default function ArchitectDetail() {
@@ -17,6 +17,13 @@ export default function ArchitectDetail() {
1717
const [currentUser, setCurrentUser] = useState<any>(null);
1818
const [canUpload, setCanUpload] = useState(false);
1919

20+
// Request state
21+
const [requesting, setRequesting] = useState(false);
22+
const [showForm, setShowForm] = useState(false);
23+
const [clientName, setClientName] = useState("");
24+
const [projectName, setProjectName] = useState("");
25+
const [price, setPrice] = useState("");
26+
2027
// ✅ Get current logged-in user
2128
useEffect(() => {
2229
const getUser = async () => {
@@ -105,6 +112,42 @@ export default function ArchitectDetail() {
105112
}
106113
};
107114

115+
// ✅ Handle service request submission
116+
const handleSubmitRequest = async () => {
117+
if (!clientName.trim() || !projectName.trim() || !price.trim()) {
118+
alert("Please fill in all details.");
119+
return;
120+
}
121+
122+
setRequesting(true);
123+
124+
try {
125+
const { error } = await supabase.from("ArchitectRequest").insert([
126+
{
127+
arcID: Number(id),
128+
project_Name: projectName,
129+
client_name: clientName,
130+
price: Number(price),
131+
status: "pending",
132+
created_at: new Date().toISOString(),
133+
},
134+
]);
135+
136+
if (error) throw error;
137+
setShowForm(false);
138+
alert("Service request sent successfully!");
139+
setClientName("");
140+
setProjectName("");
141+
setPrice("");
142+
} catch (err) {
143+
console.error("Error creating request:", err);
144+
alert("Failed to send request. Please try again.");
145+
} finally {
146+
setRequesting(false);
147+
}
148+
};
149+
150+
// ✅ Loading screen
108151
if (loading) {
109152
return (
110153
<div className="flex items-center justify-center h-screen">
@@ -113,6 +156,7 @@ export default function ArchitectDetail() {
113156
);
114157
}
115158

159+
// ✅ Architect not found
116160
if (!architect) {
117161
return (
118162
<div className="min-h-screen flex flex-col items-center justify-center text-center">
@@ -127,6 +171,7 @@ export default function ArchitectDetail() {
127171
);
128172
}
129173

174+
// ✅ Main return
130175
return (
131176
<div className="bg-white min-h-screen font-sans">
132177
<Navbar />
@@ -172,13 +217,72 @@ export default function ArchitectDetail() {
172217
/>
173218
</label>
174219
)}
220+
221+
{/* ===== Request Button ===== */}
222+
{!canUpload && (
223+
<button
224+
onClick={() => setShowForm(true)}
225+
disabled={requesting}
226+
className="mt-6 px-6 py-2 bg-purple-600 text-white rounded-xl hover:bg-purple-700 transition"
227+
>
228+
{requesting ? "Requesting..." : "Request Service"}
229+
</button>
230+
)}
231+
175232
{photoError && (
176233
<p className="text-red-500 text-sm mt-2">{photoError}</p>
177234
)}
178235
</div>
179236
</div>
180237
</div>
181238

239+
{/* ======= Request Form Modal ======= */}
240+
{showForm && (
241+
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
242+
<div className="bg-white rounded-2xl shadow-lg p-6 w-full max-w-md relative">
243+
<button
244+
onClick={() => setShowForm(false)}
245+
className="absolute top-3 right-3 text-gray-600 hover:text-gray-800"
246+
>
247+
<X size={20} />
248+
</button>
249+
<h2 className="text-xl font-semibold text-center mb-4 text-purple-700">
250+
Request Service
251+
</h2>
252+
<div className="space-y-3">
253+
<input
254+
type="text"
255+
placeholder="Enter Your Name"
256+
value={clientName}
257+
onChange={(e) => setClientName(e.target.value)}
258+
className="border rounded-lg px-4 py-2 w-full"
259+
/>
260+
<input
261+
type="text"
262+
placeholder="Enter Project Name"
263+
value={projectName}
264+
onChange={(e) => setProjectName(e.target.value)}
265+
className="border rounded-lg px-4 py-2 w-full"
266+
/>
267+
<input
268+
type="text"
269+
placeholder="Enter Expected Price"
270+
value={price}
271+
onChange={(e) => setPrice(e.target.value)}
272+
className="border rounded-lg px-4 py-2 w-full"
273+
/>
274+
<button
275+
onClick={handleSubmitRequest}
276+
disabled={requesting}
277+
className="w-full bg-purple-600 text-white py-2 rounded-lg hover:bg-purple-700 transition"
278+
>
279+
{requesting ? "Submitting..." : "Submit Request"}
280+
</button>
281+
</div>
282+
</div>
283+
</div>
284+
)}
285+
182286
{/* ======= Gallery Section ======= */}
183287
<div className="max-w-6xl mx-auto p-6">
184288
<h2 className="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">
@@ -206,4 +310,4 @@ export default function ArchitectDetail() {
206310
<Footer />
207311
</div>
208312
);
209-
}
313+
}

supabase/.temp/cli-latest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v2.51.0
1+
v2.54.11

0 commit comments

Comments
 (0)