diff --git a/components/members/members-table.tsx b/components/members/members-table.tsx
index c1865a6..6004f91 100644
--- a/components/members/members-table.tsx
+++ b/components/members/members-table.tsx
@@ -31,6 +31,7 @@ import {
} from "@/lib/db_actions/competition-members";
import type { VCompetitionMember } from "@/types/db_types";
import { cn } from "@/lib/utils";
+import Image from "next/image";
interface MembersTableProps {
members: VCompetitionMember[];
@@ -126,9 +127,19 @@ function MemberRow({
)}
>
{/* Avatar / Initial */}
-
- {member.user_name.charAt(0).toUpperCase()}
-
+ {member.user_picture_url ? (
+
+ ) : (
+
+ {member.user_name.charAt(0).toUpperCase()}
+
+ )}
{/* Name and email */}
diff --git a/migrations/1773516227456_add-picture-url-to-competition-members-view.ts b/migrations/1773516227456_add-picture-url-to-competition-members-view.ts
new file mode 100644
index 0000000..32b05ad
--- /dev/null
+++ b/migrations/1773516227456_add-picture-url-to-competition-members-view.ts
@@ -0,0 +1,48 @@
+import { type Kysely, sql } from "kysely";
+
+export async function up(db: Kysely
): Promise {
+ await db.schema.dropView("v_competition_members").execute();
+
+ await sql`
+ CREATE VIEW v_competition_members WITH (security_barrier, security_invoker) AS
+ SELECT
+ cm.id AS membership_id,
+ cm.competition_id,
+ cm.user_id,
+ cm.role,
+ cm.created_at AS membership_created_at,
+ cm.updated_at AS membership_updated_at,
+ c.name AS competition_name,
+ c.is_private AS competition_is_private,
+ u.name AS user_name,
+ u.email AS user_email,
+ u.username AS user_username,
+ u.picture_url AS user_picture_url
+ FROM competition_members cm
+ JOIN competitions c ON cm.competition_id = c.id
+ JOIN users u ON cm.user_id = u.id;
+ `.execute(db);
+}
+
+export async function down(db: Kysely): Promise {
+ await db.schema.dropView("v_competition_members").execute();
+
+ await sql`
+ CREATE VIEW v_competition_members WITH (security_barrier, security_invoker) AS
+ SELECT
+ cm.id AS membership_id,
+ cm.competition_id,
+ cm.user_id,
+ cm.role,
+ cm.created_at AS membership_created_at,
+ cm.updated_at AS membership_updated_at,
+ c.name AS competition_name,
+ c.is_private AS competition_is_private,
+ u.name AS user_name,
+ u.email AS user_email,
+ u.username AS user_username
+ FROM competition_members cm
+ JOIN competitions c ON cm.competition_id = c.id
+ JOIN users u ON cm.user_id = u.id;
+ `.execute(db);
+}
diff --git a/types/db_types.ts b/types/db_types.ts
index 4153120..d81e72a 100644
--- a/types/db_types.ts
+++ b/types/db_types.ts
@@ -245,5 +245,6 @@ export interface VCompetitionMembersView {
user_name: string;
user_email: string;
user_username: string | null;
+ user_picture_url: string | null;
}
export type VCompetitionMember = Selectable;