1+ import { useState } from 'react' ;
2+ import { Button } from '@/components/ui/button' ;
3+ import { Input } from '@/components/ui/input' ;
4+ import { Textarea } from '@/components/ui/textarea' ;
5+ import { Label } from '@/components/ui/label' ;
6+ import { Badge } from '@/components/ui/badge' ;
7+ import { X , Plus } from 'lucide-react' ;
8+ import { Card , CardContent , CardHeader , CardTitle } from '@/components/ui/card' ;
9+
10+ export default function ProfileEditForm ( { profile, onSave, onCancel } ) {
11+ const [ formData , setFormData ] = useState ( {
12+ bio : profile ?. bio || '' ,
13+ skills : profile ?. skills || [ ] ,
14+ interests : profile ?. interests || [ ] ,
15+ } ) ;
16+
17+ const [ newSkill , setNewSkill ] = useState ( { skill_name : '' , proficiency : 'intermediate' } ) ;
18+ const [ newInterest , setNewInterest ] = useState ( '' ) ;
19+
20+ const addSkill = ( ) => {
21+ if ( ! newSkill . skill_name . trim ( ) ) return ;
22+ setFormData ( {
23+ ...formData ,
24+ skills : [ ...formData . skills , { ...newSkill } ]
25+ } ) ;
26+ setNewSkill ( { skill_name : '' , proficiency : 'intermediate' } ) ;
27+ } ;
28+
29+ const removeSkill = ( index ) => {
30+ setFormData ( {
31+ ...formData ,
32+ skills : formData . skills . filter ( ( _ , i ) => i !== index )
33+ } ) ;
34+ } ;
35+
36+ const addInterest = ( ) => {
37+ if ( ! newInterest . trim ( ) ) return ;
38+ setFormData ( {
39+ ...formData ,
40+ interests : [ ...formData . interests , newInterest . trim ( ) ]
41+ } ) ;
42+ setNewInterest ( '' ) ;
43+ } ;
44+
45+ const removeInterest = ( index ) => {
46+ setFormData ( {
47+ ...formData ,
48+ interests : formData . interests . filter ( ( _ , i ) => i !== index )
49+ } ) ;
50+ } ;
51+
52+ const handleSubmit = ( e ) => {
53+ e . preventDefault ( ) ;
54+ onSave ( formData ) ;
55+ } ;
56+
57+ return (
58+ < form onSubmit = { handleSubmit } className = "space-y-6" >
59+ { /* Bio */ }
60+ < Card >
61+ < CardHeader >
62+ < CardTitle className = "text-lg" > About Me</ CardTitle >
63+ </ CardHeader >
64+ < CardContent >
65+ < Textarea
66+ placeholder = "Tell us about yourself..."
67+ value = { formData . bio }
68+ onChange = { ( e ) => setFormData ( { ...formData , bio : e . target . value } ) }
69+ rows = { 4 }
70+ className = "resize-none"
71+ />
72+ </ CardContent >
73+ </ Card >
74+
75+ { /* Skills */ }
76+ < Card >
77+ < CardHeader >
78+ < CardTitle className = "text-lg" > Skills</ CardTitle >
79+ </ CardHeader >
80+ < CardContent className = "space-y-4" >
81+ { /* Existing Skills */ }
82+ < div className = "flex flex-wrap gap-2" >
83+ { formData . skills . map ( ( skill , index ) => (
84+ < Badge
85+ key = { index }
86+ variant = "outline"
87+ className = "px-3 py-1.5 text-sm"
88+ >
89+ { skill . skill_name }
90+ < span className = "ml-2 text-xs text-slate-500" > ({ skill . proficiency } )</ span >
91+ < button
92+ type = "button"
93+ onClick = { ( ) => removeSkill ( index ) }
94+ className = "ml-2 hover:text-red-600"
95+ >
96+ < X className = "h-3 w-3" />
97+ </ button >
98+ </ Badge >
99+ ) ) }
100+ </ div >
101+
102+ { /* Add New Skill */ }
103+ < div className = "flex gap-2" >
104+ < Input
105+ placeholder = "Skill name"
106+ value = { newSkill . skill_name }
107+ onChange = { ( e ) => setNewSkill ( { ...newSkill , skill_name : e . target . value } ) }
108+ onKeyDown = { ( e ) => e . key === 'Enter' && ( e . preventDefault ( ) , addSkill ( ) ) }
109+ />
110+ < select
111+ value = { newSkill . proficiency }
112+ onChange = { ( e ) => setNewSkill ( { ...newSkill , proficiency : e . target . value } ) }
113+ className = "px-3 py-2 border border-slate-300 rounded-md text-sm"
114+ >
115+ < option value = "beginner" > Beginner</ option >
116+ < option value = "intermediate" > Intermediate</ option >
117+ < option value = "advanced" > Advanced</ option >
118+ < option value = "expert" > Expert</ option >
119+ </ select >
120+ < Button type = "button" onClick = { addSkill } size = "icon" variant = "outline" >
121+ < Plus className = "h-4 w-4" />
122+ </ Button >
123+ </ div >
124+ </ CardContent >
125+ </ Card >
126+
127+ { /* Interests */ }
128+ < Card >
129+ < CardHeader >
130+ < CardTitle className = "text-lg" > Interests</ CardTitle >
131+ </ CardHeader >
132+ < CardContent className = "space-y-4" >
133+ { /* Existing Interests */ }
134+ < div className = "flex flex-wrap gap-2" >
135+ { formData . interests . map ( ( interest , index ) => (
136+ < Badge
137+ key = { index }
138+ variant = "secondary"
139+ className = "px-3 py-1.5 text-sm"
140+ >
141+ { interest }
142+ < button
143+ type = "button"
144+ onClick = { ( ) => removeInterest ( index ) }
145+ className = "ml-2 hover:text-red-600"
146+ >
147+ < X className = "h-3 w-3" />
148+ </ button >
149+ </ Badge >
150+ ) ) }
151+ </ div >
152+
153+ { /* Add New Interest */ }
154+ < div className = "flex gap-2" >
155+ < Input
156+ placeholder = "Add an interest..."
157+ value = { newInterest }
158+ onChange = { ( e ) => setNewInterest ( e . target . value ) }
159+ onKeyDown = { ( e ) => e . key === 'Enter' && ( e . preventDefault ( ) , addInterest ( ) ) }
160+ />
161+ < Button type = "button" onClick = { addInterest } size = "icon" variant = "outline" >
162+ < Plus className = "h-4 w-4" />
163+ </ Button >
164+ </ div >
165+ </ CardContent >
166+ </ Card >
167+
168+ { /* Actions */ }
169+ < div className = "flex justify-end gap-3" >
170+ < Button type = "button" variant = "outline" onClick = { onCancel } >
171+ Cancel
172+ </ Button >
173+ < Button type = "submit" className = "bg-int-orange hover:bg-int-orange-dark" >
174+ Save Changes
175+ </ Button >
176+ </ div >
177+ </ form >
178+ ) ;
179+ }
0 commit comments