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