+ );
+}
diff --git a/app/(app)/member/[id]/page.tsx b/app/(app)/member/[id]/page.tsx
new file mode 100644
index 0000000..8746a58
--- /dev/null
+++ b/app/(app)/member/[id]/page.tsx
@@ -0,0 +1,43 @@
+/**
+ * @file member/[id]/page.tsx
+ * @description Server component rendering the detailed profile page for a specific member by fetching their user profile data.
+ */
+
+import { UserService } from "@/services/user.service";
+import { notFound } from "next/navigation";
+import MemberHeader from "../MemberHeader";
+import MemberProfileCard from "./MemberProfileCard";
+
+/**
+ * Properties for the MemberDetailPage component.
+ *
+ * @interface MemberDetailPageProps
+ * @property {Promise<{ id: string }>} params - Promise containing route context parameters with the target member ID.
+ */
+interface MemberDetailPageProps {
+ params: Promise<{ id: string }>;
+}
+
+/**
+ * Renders the member detail page by resolving the route parameter, fetching the user profile by ID,
+ * and displaying their header and profile card or triggering a 404 page if the member is not found.
+ *
+ * @async
+ * @param {MemberDetailPageProps} props - The component props.
+ * @returns {Promise} The rendered member detail page component.
+ */
+export default async function MemberDetailPage({
+ params,
+}: MemberDetailPageProps) {
+ const { id } = await params;
+ const user = await UserService.findProfileById(id);
+
+ if (!user) notFound();
+
+ return (
+
+
+
+
+ );
+}
diff --git a/app/(app)/member/list/MemberItem.tsx b/app/(app)/member/list/MemberItem.tsx
index d4680c8..c7903ca 100644
--- a/app/(app)/member/list/MemberItem.tsx
+++ b/app/(app)/member/list/MemberItem.tsx
@@ -13,6 +13,7 @@ import {
} from "@/utils/user";
import { Mail } from "lucide-react";
import { UserListItem } from "@/types/user";
+import Link from "next/link";
/**
* Properties for the MemberItem component.
@@ -32,7 +33,10 @@ interface MemberItemProps {
*/
export default function MemberItem({ member }: MemberItemProps) {
return (
-
+
{/* Dynamic colored accent stripe */}
-
+
);
}
diff --git a/services/user.service.ts b/services/user.service.ts
index 3bc0f29..427badc 100644
--- a/services/user.service.ts
+++ b/services/user.service.ts
@@ -5,24 +5,26 @@
import { db } from "@/db";
import { usersTable } from "@/db/schema";
-import { eq, desc, sql } from "drizzle-orm";
+import { eq, sql } from "drizzle-orm";
/**
* Service class for handling user operations and database interactions.
*/
export class UserService {
/**
- * Retrieves specific profile information (firstName, lastName, color, online status, last login) for a user by ID.
+ * Retrieves specific profile information for a user by ID.
*
* @async
* @param {string} userId - The unique identifier of the user.
- * @returns {Promise<{ firstName: string; lastName: string; color: string; isOnline: boolean; lastLogin: Date } | null>} The user profile data or null if not found.
+ * @returns {Promise<{ id: string; firstName: string; lastName: string; email: string; color: string; isOnline: boolean; lastLogin: Date } | null>} The user profile data or null if not found.
*/
static async findProfileById(userId: string) {
const [user] = await db
.select({
+ id: usersTable.id,
firstName: usersTable.firstName,
lastName: usersTable.lastName,
+ email: usersTable.email,
color: usersTable.color,
isOnline: usersTable.isOnline,
lastLogin: usersTable.lastLogin,
@@ -34,7 +36,7 @@ export class UserService {
}
/**
- * Retrieves a list of all users sorted by their last login date in descending order, putting null values last.
+ * Retrieves a list of all users sorted by their last login date in descending order, placing null values last.
*
* @async
* @returns {Promise>} An array of user list items.