About
diff --git a/apps/hackathon/src/app/profile/page.tsx b/apps/hackathon/src/app/profile/page.tsx
index 7e07f3b..0163665 100644
--- a/apps/hackathon/src/app/profile/page.tsx
+++ b/apps/hackathon/src/app/profile/page.tsx
@@ -1,8 +1,8 @@
import { FC, ReactElement, useState, useEffect } from 'react';
import { ControlledInputField } from '@imphnen-frontend-service/ui/organisms';
-import { Button } from '@imphnen-frontend-service/ui/atoms';
+import { Button, Textarea } from '@imphnen-frontend-service/ui/atoms';
import { useNavigate, Link } from 'react-router';
-import { useForm } from 'react-hook-form';
+import { useForm, Controller } from 'react-hook-form';
import {
userEditProfileSchema,
TUserEditProfileForm,
@@ -12,6 +12,18 @@ import {
} from '@imphnen-frontend-service/service';
import { zodResolver } from '@hookform/resolvers/zod';
import { toast } from 'sonner';
+import { CitySelect } from '../../components/city-select';
+
+const ROLE_OPTIONS = [
+ 'Frontend Developer',
+ 'Backend Developer',
+ 'Full Stack Developer',
+ 'DevOps Engineer',
+ 'UI/UX Designer',
+ 'Product Manager',
+ 'Data Scientist',
+ 'Mobile Developer',
+];
const ProfilePage: FC = (): ReactElement => {
const navigate = useNavigate();
@@ -28,6 +40,9 @@ const ProfilePage: FC = (): ReactElement => {
defaultValues: {
fullname: session?.user?.fullname || '',
avatar: session?.user?.avatar || null,
+ location: session?.user?.location || '',
+ bio: session?.user?.bio || '',
+ skills: session?.user?.skills || [],
},
});
@@ -39,7 +54,16 @@ const ProfilePage: FC = (): ReactElement => {
if (session?.user?.fullname) {
form.setValue('fullname', session.user.fullname);
}
- }, [session?.user?.avatar, session?.user?.fullname, avatarPreview, form]);
+ if (session?.user?.location) {
+ form.setValue('location', session.user.location);
+ }
+ if (session?.user?.bio) {
+ form.setValue('bio', session.user.bio);
+ }
+ if (session?.user?.skills) {
+ form.setValue('skills', session.user.skills);
+ }
+ }, [session?.user?.avatar, session?.user?.fullname, session?.user?.location, session?.user?.bio, session?.user?.skills, avatarPreview, form]);
const handleAvatarChange = (e: React.ChangeEvent
) => {
const file = e.target.files?.[0];
@@ -79,6 +103,9 @@ const ProfilePage: FC = (): ReactElement => {
await updateUser({
fullname: data.fullname,
avatar: avatarUrl,
+ location: data.location,
+ bio: data.bio,
+ skills: data.skills,
});
toast.success('Profile updated successfully!');
@@ -192,6 +219,87 @@ const ProfilePage: FC = (): ReactElement => {
name="fullname"
/>
+ {/* City */}
+
+
+ (
+
+ )}
+ />
+
+
+ {/* Role/Skills */}
+
+
+
(
+
+
+ {ROLE_OPTIONS.map((role) => (
+
+ ))}
+
+
+ )}
+ />
+
+
+ {/* Bio */}
+
+
+
(
+
+
+ {fieldState.error && (
+
+ {fieldState.error.message}
+
+ )}
+
+ )}
+ />
+
+
{/* Action Buttons */}