Skip to content

Commit 985d75a

Browse files
feat: add name editing functionality to profile
Co-Authored-By: Harkirat Singh <[email protected]>
1 parent f885800 commit 985d75a

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { getServerSession } from "next-auth";
2+
import { NextResponse } from "next/server";
3+
import db from "@repo/db/client";
4+
import { authOptions } from "../../../../lib/auth";
5+
6+
export async function PUT(req: Request) {
7+
const session = await getServerSession(authOptions);
8+
if (!session?.user?.email) {
9+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
10+
}
11+
12+
const { name } = await req.json();
13+
if (!name) {
14+
return NextResponse.json({ error: "Name is required" }, { status: 400 });
15+
}
16+
17+
const user = await db.user.update({
18+
where: { email: session.user.email },
19+
data: { name }
20+
});
21+
22+
return NextResponse.json(user);
23+
}

apps/web/components/UserDetailForm.tsx

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
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";
35
import UserImage from "./UserImage";
46
import { User } from "@prisma/client";
57

68
export 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

Comments
 (0)