diff --git a/src/app/(admin)/admin/members/[id]/page.tsx b/src/app/(admin)/admin/members/[id]/page.tsx
index 0d855eb..b1dc794 100644
--- a/src/app/(admin)/admin/members/[id]/page.tsx
+++ b/src/app/(admin)/admin/members/[id]/page.tsx
@@ -50,7 +50,7 @@ export default function MemberDetailPage() {
const router = useRouter()
const userId = params.id as string
- const { data: user, isLoading, refetch } = trpc.user.get.useQuery({ id: userId })
+ const { data: user, isLoading, error, refetch } = trpc.user.get.useQuery({ id: userId })
const updateUser = trpc.user.update.useMutation()
const sendInvitation = trpc.user.sendInvitation.useMutation()
@@ -121,14 +121,19 @@ export default function MemberDetailPage() {
)
}
- if (!user) {
+ if (error || !user) {
return (
- Member not found
+ Error Loading Member
- The member you're looking for does not exist.
+ {error?.message || 'The member you\'re looking for does not exist.'}
+ {process.env.NODE_ENV === 'development' && (
+
+ User ID: {userId}
+
+ )}
diff --git a/src/app/(settings)/settings/profile/page.tsx b/src/app/(settings)/settings/profile/page.tsx
index 8cd4ef2..85ce4d5 100644
--- a/src/app/(settings)/settings/profile/page.tsx
+++ b/src/app/(settings)/settings/profile/page.tsx
@@ -35,6 +35,7 @@ import {
import { Skeleton } from '@/components/ui/skeleton'
import { AvatarUpload } from '@/components/shared/avatar-upload'
import { UserAvatar } from '@/components/shared/user-avatar'
+import { TagInput } from '@/components/shared/tag-input'
import {
Loader2,
Save,
@@ -43,6 +44,7 @@ import {
Bell,
Trash2,
User,
+ Tags,
} from 'lucide-react'
export default function ProfileSettingsPage() {
@@ -58,6 +60,7 @@ export default function ProfileSettingsPage() {
const [bio, setBio] = useState('')
const [phoneNumber, setPhoneNumber] = useState('')
const [notificationPreference, setNotificationPreference] = useState('EMAIL')
+ const [expertiseTags, setExpertiseTags] = useState([])
const [profileLoaded, setProfileLoaded] = useState(false)
// Password form state
@@ -76,6 +79,7 @@ export default function ProfileSettingsPage() {
setBio((meta.bio as string) || '')
setPhoneNumber(user.phoneNumber || '')
setNotificationPreference(user.notificationPreference || 'EMAIL')
+ setExpertiseTags(user.expertiseTags || [])
setProfileLoaded(true)
}
@@ -86,6 +90,7 @@ export default function ProfileSettingsPage() {
bio,
phoneNumber: phoneNumber || null,
notificationPreference: notificationPreference as 'EMAIL' | 'WHATSAPP' | 'BOTH' | 'NONE',
+ expertiseTags,
})
toast.success('Profile updated successfully')
refetch()
@@ -294,6 +299,41 @@ export default function ProfileSettingsPage() {
+ {/* Expertise Tags */}
+
+
+
+
+ Expertise Tags
+
+
+ Select your areas of expertise to help with project matching
+
+
+
+
+
+
+
+ {updateProfile.isPending ? (
+
+ ) : (
+
+ )}
+ Save Expertise
+
+
+
+
+
{/* Change Password */}
diff --git a/src/server/routers/user.ts b/src/server/routers/user.ts
index e3f0da4..51a37d4 100644
--- a/src/server/routers/user.ts
+++ b/src/server/routers/user.ts
@@ -78,10 +78,11 @@ export const userRouter = router({
bio: z.string().max(1000).optional(),
phoneNumber: z.string().max(20).optional().nullable(),
notificationPreference: z.enum(['EMAIL', 'WHATSAPP', 'BOTH', 'NONE']).optional(),
+ expertiseTags: z.array(z.string()).max(15).optional(),
})
)
.mutation(async ({ ctx, input }) => {
- const { bio, ...directFields } = input
+ const { bio, expertiseTags, ...directFields } = input
// If bio is provided, merge it into metadataJson
let metadataJson: Prisma.InputJsonValue | undefined
@@ -99,6 +100,7 @@ export const userRouter = router({
data: {
...directFields,
...(metadataJson !== undefined && { metadataJson }),
+ ...(expertiseTags !== undefined && { expertiseTags }),
},
})
}),
@@ -241,14 +243,22 @@ export const userRouter = router({
get: adminProcedure
.input(z.object({ id: z.string() }))
.query(async ({ ctx, input }) => {
- return ctx.prisma.user.findUniqueOrThrow({
- where: { id: input.id },
- include: {
- _count: {
- select: { assignments: true, mentorAssignments: true },
+ console.log('[user.get] Fetching user:', input.id)
+ try {
+ const user = await ctx.prisma.user.findUniqueOrThrow({
+ where: { id: input.id },
+ include: {
+ _count: {
+ select: { assignments: true, mentorAssignments: true },
+ },
},
- },
- })
+ })
+ console.log('[user.get] Found user:', user.email)
+ return user
+ } catch (error) {
+ console.error('[user.get] Error fetching user:', input.id, error)
+ throw error
+ }
}),
/**