feat: extract and display membership gift counts in chat messages

This commit is contained in:
Yusuf İpek
2025-10-05 19:13:06 +03:00
parent d2a99639b7
commit f1dd130bc0
4 changed files with 29 additions and 8 deletions
+16 -2
View File
@@ -257,6 +257,19 @@ function normalizeAction(action: any): ChatMessage | null {
(isPaid ? undefined : 'New member'); (isPaid ? undefined : 'New member');
} }
// Extract gift count for gift purchases
let giftCount: number | undefined;
if (isGiftPurchase) {
const text = resolveMessageText(item);
const headerText = item.header_primary_text?.toString() || item.header_subtext?.toString() || '';
const combinedText = text + ' ' + headerText;
// Try to extract number from text like "Gifted 5 memberships" or "5 memberships"
const countMatch = combinedText.match(/(\d+)\s*(?:membership|memberships|member|members)/i);
if (countMatch) {
giftCount = parseInt(countMatch[1], 10);
}
}
return { return {
id: String(item.id ?? item.timestamp_usec ?? Date.now()), id: String(item.id ?? item.timestamp_usec ?? Date.now()),
author: String(item.author?.name ?? 'Unknown'), author: String(item.author?.name ?? 'Unknown'),
@@ -268,9 +281,10 @@ function normalizeAction(action: any): ChatMessage | null {
isMember, isMember,
isVerified, isVerified,
superChat: extractSuperChatInfo(item), superChat: extractSuperChatInfo(item),
membershipGift: isMembership || isGiftReceived, membershipGift: isMembership,
membershipGiftPurchase: isGiftPurchase, membershipGiftPurchase: isGiftPurchase,
membershipLevel membershipLevel,
giftCount
}; };
} }
+5 -3
View File
@@ -54,8 +54,8 @@ export default function DashboardPage() {
}, [pollError, overlayStatus]); }, [pollError, overlayStatus]);
const superChats = useMemo(() => messages.filter(m => m.superChat), [messages]); const superChats = useMemo(() => messages.filter(m => m.superChat), [messages]);
const newMembers = useMemo(() => messages.filter(m => m.membershipGiftPurchase), [messages]); const newMembers = useMemo(() => messages.filter(m => m.membershipGift || m.membershipGiftPurchase), [messages]);
const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift), [messages]); const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift && !m.membershipGiftPurchase), [messages]);
return ( return (
<main className="dashboard"> <main className="dashboard">
@@ -462,7 +462,9 @@ function MemberItem({ message, isSelected, onSelect }: ChatItemProps) {
<div className="memberItem__info"> <div className="memberItem__info">
<span className="memberItem__author">{message.author}</span> <span className="memberItem__author">{message.author}</span>
<span className="memberItem__level"> <span className="memberItem__level">
{message.membershipLevel || 'New member'} {message.membershipGiftPurchase && message.giftCount
? `Gifted ${message.giftCount} membership${message.giftCount > 1 ? 's' : ''}`
: message.membershipLevel || 'New member'}
</span> </span>
<time className="memberItem__time">{new Date(message.publishedAt).toLocaleTimeString()}</time> <time className="memberItem__time">{new Date(message.publishedAt).toLocaleTimeString()}</time>
</div> </div>
+7 -3
View File
@@ -89,12 +89,16 @@ export default function OverlayPage() {
💰 {message.superChat.currency}{message.superChat.amount} 💰 {message.superChat.currency}{message.superChat.amount}
</div> </div>
)} )}
{message.membershipGift && ( {(message.membershipGift || message.membershipGiftPurchase) && (
<div className="overlay__membership"> <div className="overlay__membership">
🎁 New Member! {message.membershipGiftPurchase && message.giftCount
? `🎁 Gifted ${message.giftCount} Membership${message.giftCount > 1 ? 's' : ''}!`
: message.membershipGiftPurchase
? '🎁 Gift Purchase'
: '🎁 New Member!'}
</div> </div>
)} )}
{(!message.superChat && !message.membershipGift) && message.text && ( {(!message.superChat && !message.membershipGift && !message.membershipGiftPurchase) && message.text && (
<p className="overlay__text">{message.text}</p> <p className="overlay__text">{message.text}</p>
)} )}
</div> </div>
+1
View File
@@ -24,4 +24,5 @@ export type ChatMessage = {
membershipGift?: boolean; membershipGift?: boolean;
membershipGiftPurchase?: boolean; membershipGiftPurchase?: boolean;
membershipLevel?: string; // e.g., "New member", "Member (6 months)", etc. membershipLevel?: string; // e.g., "New member", "Member (6 months)", etc.
giftCount?: number; // Number of memberships gifted
}; };