1- import { Input , Label } from "@repo/ui" ;
2- import React from "react" ;
1+ import { Input , Label , Button } from "@repo/ui" ;
2+ import { Pencil , Check , X } from "lucide-react" ;
3+ import React , { useState } from "react" ;
4+ import { useRouter } from "next/navigation" ;
35import UserImage from "./UserImage" ;
46import { User } from "@prisma/client" ;
57
68export default function UserDetailForm ( { user } : { user : User } ) {
9+ const [ isEditing , setIsEditing ] = useState ( false ) ;
10+ const [ name , setName ] = useState ( user ?. name || "" ) ;
11+ const router = useRouter ( ) ;
12+
13+ const handleSubmit = async ( ) => {
14+ try {
15+ const res = await fetch ( "/api/user/update" , {
16+ method : "PUT" ,
17+ headers : { "Content-Type" : "application/json" } ,
18+ body : JSON . stringify ( { name } )
19+ } ) ;
20+ if ( ! res . ok ) throw new Error ( "Failed to update name" ) ;
21+ setIsEditing ( false ) ;
22+ router . refresh ( ) ; // Refresh the page to update session data
23+ } catch ( error ) {
24+ console . error ( "Error updating name:" , error ) ;
25+ }
26+ } ;
27+
728 return (
829 < form className = "flex flex-col gap-4" >
930 < Label className = "mb-2" > Profile Picture</ Label >
@@ -15,7 +36,46 @@ export default function UserDetailForm({ user }: { user: User }) {
1536
1637 < div >
1738 < Label className = "" > Your name</ Label >
18- < Input disabled placeholder = "Enter your name" value = { user ?. name ? user ?. name : "" } className = "p-2 mt-2" />
39+ < div className = "flex items-center gap-2 mt-2" >
40+ < Input
41+ disabled = { ! isEditing }
42+ value = { isEditing ? name : ( user ?. name || "" ) }
43+ onChange = { ( e ) => setName ( e . target . value ) }
44+ className = "p-2"
45+ />
46+ { ! isEditing ? (
47+ < Button
48+ variant = "ghost"
49+ size = "icon"
50+ onClick = { ( ) => setIsEditing ( true ) }
51+ type = "button"
52+ >
53+ < Pencil className = "h-4 w-4" />
54+ </ Button >
55+ ) : (
56+ < >
57+ < Button
58+ variant = "ghost"
59+ size = "icon"
60+ onClick = { handleSubmit }
61+ type = "button"
62+ >
63+ < Check className = "h-4 w-4 text-green-500" />
64+ </ Button >
65+ < Button
66+ variant = "ghost"
67+ size = "icon"
68+ onClick = { ( ) => {
69+ setIsEditing ( false ) ;
70+ setName ( user ?. name || "" ) ;
71+ } }
72+ type = "button"
73+ >
74+ < X className = "h-4 w-4 text-red-500" />
75+ </ Button >
76+ </ >
77+ ) }
78+ </ div >
1979 </ div >
2080 < div >
2181 < Label className = "" > Your Email</ Label >
0 commit comments