@@ -3,7 +3,7 @@ import { useParams, useNavigate } from "react-router-dom";
33import { supabase } from "@/integrations/supabase/client" ;
44import Navbar from "@/components/Navbar" ;
55import Footer from "@/components/Footer" ;
6- import { Loader2 , Upload } from "lucide-react" ;
6+ import { Loader2 , Upload , X } from "lucide-react" ;
77import { motion } from "framer-motion" ;
88
99export 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+ }
0 commit comments