Skip to content

Commit

Permalink
Merge pull request #4 from Sunny-Master/update-user-data
Browse files Browse the repository at this point in the history
Add link to user profile settings page and render a form to update user data
  • Loading branch information
Sunny-Master authored Jan 23, 2025
2 parents b001347 + 3055fe5 commit a09275f
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 3 deletions.
6 changes: 3 additions & 3 deletions frontend/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export default function RootLayout({
<body>
<Providers>
<Layout
className={`${geistSans.variable} ${geistMono.variable} antialiased p-4 md:px-20 flex flex-col justify-start items-start bg-slate-200 dark:bg-slate-900 lg:h-svh font-medium font-mono`}
className={`${geistSans.variable} ${geistMono.variable} antialiased p-4 flex flex-col justify-start items-start bg-slate-200 dark:bg-slate-900 lg:h-svh font-medium font-mono`}
>
<Header className="flex justify-between text-lg md:text-2xl items-center w-full p-6 md:p-12 rounded-md md:rounded-xl shadow-sm border border-slate-300 dark:border-slate-800 bg-slate-50 dark:bg-slate-800">
<div>BrightPath</div>
Expand All @@ -50,7 +50,7 @@ export default function RootLayout({
Courses
</Link>
<Link
href={"/profile"}
href={"/user/profile"}
className="text-slate-700 dark:text-slate-100 hover:opacity-75 delay-500"
>
<div>
Expand All @@ -60,7 +60,7 @@ export default function RootLayout({
</nav>
</Header>
{/* main contents */}
<main className="flex-1">{children}</main>
<main className="flex-1 w-screen">{children}</main>

<Footer className="flex w-full p-6 md:px-12 rounded-md md:rounded-xl shadow-sm border border-slate-300 dark:border-slate-800 bg-slate-50 dark:bg-slate-800">
{/* footer*/}
Expand Down
15 changes: 15 additions & 0 deletions frontend/src/app/user/profile/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Link from "next/link";
import SettingsOutlinedIcon from "@mui/icons-material/SettingsOutlined";

export default function Profile() {
return (
<Link
href={"/user/settings"}
className="text-slate-700 dark:text-slate-100 hover:opacity-75 delay-500"
>
<div>
<SettingsOutlinedIcon />
</div>
</Link>
);
}
119 changes: 119 additions & 0 deletions frontend/src/app/user/settings/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
"use client";
import React from "react";
import { Form, Input, Button, Upload, message } from "antd";
import { Upload as UploadIcon } from "@mui/icons-material";
import { UploadChangeParam } from "antd/es/upload";

export const dynamic = "force-dynamic";

interface UserData {
name?: string;
username?: string;
email?: string;
image?: string;
bio?: string;
}

export default function UserSettings() {
const [form] = Form.useForm<UserData>();

(async () => {
try {
const response = await fetch("/api/user");
if (!response.ok) {
throw new Error("Failed to fetch user data");
}
const data: UserData = await response.json();
form.setFieldsValue(data);
} catch (error) {
console.log("Failed to load user data.");
}
})();

const onFinish = async (values: UserData) => {
try {
const response = await fetch("/api/user", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(values),
});
if (!response.ok) {
throw new Error("Failed to update user information");
}
message.success("User information updated successfully!");
} catch (error) {
message.error("Failed to update user information.");
}
};

const handleUpload = (info: UploadChangeParam) => {
if (info.file.status === "done") {
// Assuming the server responds with the uploaded image URL
const imageUrl = info.file.response.url;
form.setFieldsValue({ image: imageUrl });
message.success(`${info.file.name} file uploaded successfully.`);
} else if (info.file.status === "error") {
message.error(`${info.file.name} file upload failed.`);
}
};

return (
<div className="flex items-center flex-col w-full p-0">
<h1 className="mt-4">Settings</h1>
<div className="bg-white shadow-md rounded px-8 pt-6 pb-8 mt-4 mb-4 w-auto max-w-lg">
<Form
form={form}
layout="vertical"
onFinish={onFinish}
initialValues={{
name: "",
username: "",
email: "",
image: "",
bio: "",
}}
>
<Form.Item name="name" label="Name">
<Input placeholder="Enter your name" />
</Form.Item>

<Form.Item name="username" label="Username">
<Input placeholder="Enter your username" />
</Form.Item>

<Form.Item name="email" label="Email">
<Input placeholder="Enter your email" />
</Form.Item>

<Form.Item name="bio" label="Bio">
<Input.TextArea
placeholder="Enter a short bio"
rows={4}
/>
</Form.Item>

<Form.Item name="image" label="Profile Image">
<Upload
name="file"
action="/api/upload"
listType="picture"
onChange={handleUpload}
>
<Button icon={<UploadIcon />}>
Click to Upload
</Button>
</Upload>
</Form.Item>

<Form.Item>
<Button type="primary" htmlType="submit">
Update Information
</Button>
</Form.Item>
</Form>
</div>
</div>
);
}

0 comments on commit a09275f

Please sign in to comment.