diff --git a/apps/web/app/profile/page.tsx b/apps/web/app/profile/page.tsx
index 9396f750..ba296e12 100644
--- a/apps/web/app/profile/page.tsx
+++ b/apps/web/app/profile/page.tsx
@@ -4,6 +4,7 @@ import { authOptions } from "../../lib/auth";
import { redirect } from "next/navigation";
import { UserRound } from "lucide-react";
import UserDetailForm from "../../components/UserDetailForm";
+import { getUserDetail } from "../../components/utils";
export default async function Profile() {
const session = await getServerSession(authOptions);
@@ -11,6 +12,17 @@ export default async function Profile() {
if (!session || !session?.user) {
redirect("/auth");
}
+
+ const user = await getUserDetail(session?.user?.id)
+
+ if (!user) {
+ return (
+
+
User not found. Please contact support or try again later.
+
+ )
+ }
+
return (
@@ -24,7 +36,7 @@ export default async function Profile() {
-
+
);
diff --git a/apps/web/components/EditUserName.tsx b/apps/web/components/EditUserName.tsx
new file mode 100644
index 00000000..0036e3ca
--- /dev/null
+++ b/apps/web/components/EditUserName.tsx
@@ -0,0 +1,58 @@
+'use client'
+
+import { CheckIcon, Cross1Icon, Pencil1Icon } from '@radix-ui/react-icons'
+import { Button, Input, Label, useToast } from '@repo/ui'
+import React, { FormEvent, useState } from 'react'
+import { updateUserName } from './utils'
+import { useRouter } from 'next/navigation'
+
+export const EditUserName = ({ userName, userId }: { userName: string, userId: string }) => {
+ const router = useRouter();
+ const {toast} = useToast();
+ const [isDisable, setIsDisable] = useState(true);
+ const [nameInput, setNameInput] = useState('');
+ const clickHandler = (e: FormEvent) => {
+ e.preventDefault();
+ setIsDisable(!isDisable)
+ }
+ const updateHandler = async(e: FormEvent)=>{
+ e.preventDefault();
+ try {
+ const res = await updateUserName(userId, nameInput);
+ if(res.id){
+ toast({
+ description: 'Your name has been updated'
+ })
+ }
+ router.refresh();
+ } catch (error) {
+ toast({
+ description: 'Failed to update name, try again'
+ })
+ }
+ setIsDisable(!isDisable)
+ }
+
+ return (
+ <>
+
+
+
+ {isDisable ? (
) : (
+
+
+
+
+ )}
+
+
{setNameInput(e.target.value)}} />
+
+ >
+ )
+}
diff --git a/apps/web/components/UserDetailForm.tsx b/apps/web/components/UserDetailForm.tsx
index aad4a2a9..fa74bf20 100644
--- a/apps/web/components/UserDetailForm.tsx
+++ b/apps/web/components/UserDetailForm.tsx
@@ -2,6 +2,7 @@ import { Input, Label } from "@repo/ui";
import React from "react";
import UserImage from "./UserImage";
import { User } from "@prisma/client";
+import { EditUserName } from "./EditUserName";
export default function UserDetailForm({ user }: { user: User }) {
return (
@@ -12,11 +13,7 @@ export default function UserDetailForm({ user }: { user: User }) {
-
-
-
-
-
+
diff --git a/apps/web/components/utils.tsx b/apps/web/components/utils.tsx
index f55a567f..d8a1318e 100644
--- a/apps/web/components/utils.tsx
+++ b/apps/web/components/utils.tsx
@@ -486,3 +486,26 @@ export async function deleteCategory(categoryId: string) {
},
});
}
+
+export async function getUserDetail(userId: string){
+ const user = await db.user.findUnique({
+ where: {
+ id: userId,
+ }
+ })
+
+ return user;
+}
+
+export async function updateUserName(userId: string, name: string){
+ const user = await db.user.update({
+ where: {
+ id: userId,
+ },
+ data: {
+ name,
+ }
+ })
+ return user;
+}
+
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index e69de29b..00000000