diff --git a/auth.config.mjs b/auth.config.mjs index 8b39b4d..c92e4fd 100644 --- a/auth.config.mjs +++ b/auth.config.mjs @@ -29,6 +29,7 @@ export default defineConfig({ id: profile.sub, username: user.name.toLowerCase(), displayName: profile.preferred_username, + avatar: profile.picture, twitchTier: tier, }) diff --git a/db/config.ts b/db/config.ts index 345754e..7e4869a 100644 --- a/db/config.ts +++ b/db/config.ts @@ -5,6 +5,7 @@ const User = defineTable({ id: column.text({ primaryKey: true, unique: true }), username: column.text({ unique: true }), displayName: column.text(), + avatar: column.text({ optional: true }), twitchTier: column.number({ optional: true }), } }) diff --git a/src/components/SharedMemberCard.tsx b/src/components/SharedMemberCard.tsx new file mode 100644 index 0000000..d20d220 --- /dev/null +++ b/src/components/SharedMemberCard.tsx @@ -0,0 +1,30 @@ +import { useState } from "preact/hooks" +import { Container3D } from "./Container3D" +import { MemberCard } from "./MemberCard" + +export const SharedMemberCard = ({ stickers = [], number, avatar, username }: { stickers: string[], number: number, avatar: string, username: string }) => { + const [selectedStickers, setSelectedStickers] = useState(() => { + const stickersList = new Array(3).fill(null) + stickers.forEach((sticker, index) => { + stickersList[index] = sticker + }) + return { + limit: 3, + list: stickersList, + } + }) + + return ( + + + + ) +} \ No newline at end of file diff --git a/src/pages/member-card.astro b/src/pages/member-card.astro index d76503e..6855330 100644 --- a/src/pages/member-card.astro +++ b/src/pages/member-card.astro @@ -1,19 +1,20 @@ --- import Layout from "@/layouts/Layout.astro"; import type { Session } from "@auth/core/types"; -import { Container3D } from "@components/Container3D"; import { getSession } from "auth-astro/server"; -import { MemberCard as MemberCardComponent } from "@components/MemberCard"; import { MyMemberCard } from "@components/MyMemberCard"; import { getMemberCardData, getUserTier } from "@/utils/users"; +import { SharedMemberCard } from "@components/SharedMemberCard"; + +const { memberId } = Object.fromEntries(Astro.url.searchParams) -const { memberId } = Astro.params const isSharedMemberCard = memberId !== undefined let session: Session | null = null let stickers : string[] = [] let tier: number | null = null +let dbMemberCard: any = null if (!isSharedMemberCard) { session = await getSession(Astro.request) @@ -21,22 +22,30 @@ if (!isSharedMemberCard) { return new Response(null, { status: 404 }) } - let dbMemberCard = await getMemberCardData(parseInt(session?.user?.id as string)) + dbMemberCard = await getMemberCardData(parseInt(session?.user?.id as string)) tier = await getUserTier(session?.user?.id as string) stickers = dbMemberCard?.stickers as string[] +} else { + dbMemberCard = await getMemberCardData(parseInt(memberId as string)) + if (!dbMemberCard) { + return new Response(null, { status: 404 }) + } + tier = await getUserTier(memberId as string) + stickers = dbMemberCard?.stickers as string[] } +const computedTitle = isSharedMemberCard ? `Member card of ${dbMemberCard.User.displayName} - The Tangerine Club` : "Member Card - The Tangerine Club" ---
{ - session && ( + session && !isSharedMemberCard && ( + ) + }
\ No newline at end of file diff --git a/src/utils/users.ts b/src/utils/users.ts index ae2914c..fc42e5e 100644 --- a/src/utils/users.ts +++ b/src/utils/users.ts @@ -8,18 +8,20 @@ export const isAdmin = (username: string) => ADMINS.includes(username) Admins can approve messages on the Tangerine Board */ -export const createOrUpdateUser = async ({ id, username, displayName, twitchTier }: { id: string, username: string, displayName: string, twitchTier: number }) => { +export const createOrUpdateUser = async ({ id, username, displayName, twitchTier, avatar }: { id: string, username: string, displayName: string, twitchTier: number, avatar: string }) => { try { await db.insert(User).values({ id, username, displayName, + avatar, twitchTier }).onConflictDoUpdate({ target: [User.id], set: { username, displayName, + avatar, twitchTier } }) @@ -29,7 +31,11 @@ export const createOrUpdateUser = async ({ id, username, displayName, twitchTier } export const getMemberCardData = async (memberId: number) => { - const card = await db.select().from(MemberCards).where(eq(MemberCards.userId, memberId.toString())).limit(1) + const card = await db.select() + .from(MemberCards) + .where(eq(MemberCards.userId, memberId.toString())) + .innerJoin(User, eq(User.id, MemberCards.userId)) + .limit(1) if (card.length === 0) { return null