From 751f428adcd0c4e28fd2aef37c78b62e2fe5f6ef Mon Sep 17 00:00:00 2001 From: Bryan1029384756 <23323626+Bryan1029384756@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:20:23 -0600 Subject: [PATCH] feat: Add base UI styling, ChatArea and VoiceStage components, and a screenshare sound asset. --- .../assets/sounds/screenshare_viewer_join.mp3 | Bin 0 -> 67537 bytes Frontend/Electron/src/components/ChatArea.jsx | 83 ++++++++++++++++-- .../Electron/src/components/VoiceStage.jsx | 2 - Frontend/Electron/src/index.css | 1 + TODO.md | 2 +- 5 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 Frontend/Electron/src/assets/sounds/screenshare_viewer_join.mp3 diff --git a/Frontend/Electron/src/assets/sounds/screenshare_viewer_join.mp3 b/Frontend/Electron/src/assets/sounds/screenshare_viewer_join.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fd51c45ce6e352b099199a3eafd54559db0b858f GIT binary patch literal 67537 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 literal 0 HcmV?d00001 diff --git a/Frontend/Electron/src/components/ChatArea.jsx b/Frontend/Electron/src/components/ChatArea.jsx index c639728..6f0846b 100644 --- a/Frontend/Electron/src/components/ChatArea.jsx +++ b/Frontend/Electron/src/components/ChatArea.jsx @@ -498,6 +498,9 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u const isLoadingMoreRef = useRef(false); const userSentMessageRef = useRef(false); const topSentinelRef = useRef(null); + const notifiedMessageIdsRef = useRef(new Set()); + const pendingNotificationIdsRef = useRef(new Set()); + const lastPingTimeRef = useRef(0); const convex = useConvex(); @@ -688,6 +691,8 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u // Don't clear messageDecryptionCache — it persists across channel switches setDecryptedMessages([]); isInitialLoadRef.current = true; + notifiedMessageIdsRef.current = new Set(); + pendingNotificationIdsRef.current = new Set(); setReplyingTo(null); setEditingMessage(null); setMentionQuery(null); @@ -695,6 +700,58 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u onTogglePinned(); }, [channelId, channelKey]); + // Play ping sound when a new message mentions us (by username or role) + useEffect(() => { + if (!decryptedMessages.length) return; + + // Initial load: seed all IDs, no sound + if (isInitialLoadRef.current) { + for (const msg of decryptedMessages) { + if (msg.id) notifiedMessageIdsRef.current.add(msg.id); + } + return; + } + + let shouldPing = false; + + // Check newest messages (end of array) backwards — stop at first known ID + for (let i = decryptedMessages.length - 1; i >= 0; i--) { + const msg = decryptedMessages[i]; + if (!msg.id) continue; + if (notifiedMessageIdsRef.current.has(msg.id)) break; + + // Skip own messages + if (msg.sender_id === currentUserId) { + notifiedMessageIdsRef.current.add(msg.id); + continue; + } + + // Still decrypting — mark pending + if (msg.content === '[Decrypting...]') { + pendingNotificationIdsRef.current.add(msg.id); + continue; + } + + notifiedMessageIdsRef.current.add(msg.id); + pendingNotificationIdsRef.current.delete(msg.id); + + if (isMentionedInContent(msg.content)) shouldPing = true; + } + + // Re-check previously pending messages now decrypted + if (!shouldPing && pendingNotificationIdsRef.current.size > 0) { + for (const msg of decryptedMessages) { + if (!pendingNotificationIdsRef.current.has(msg.id)) continue; + if (msg.content === '[Decrypting...]') continue; + pendingNotificationIdsRef.current.delete(msg.id); + notifiedMessageIdsRef.current.add(msg.id); + if (isMentionedInContent(msg.content)) shouldPing = true; + } + } + + if (shouldPing) playPingSound(); + }, [decryptedMessages, currentUserId, isMentionedInContent, playPingSound]); + // Capture the unread divider position when read state loads for a channel const unreadDividerCapturedRef = useRef(null); useEffect(() => { @@ -740,6 +797,23 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u ]; const myRoleNames = members?.find(m => m.username === username)?.roles?.map(r => r.name) || []; + const isMentionedInContent = useCallback((content) => { + if (!content) return false; + return content.includes(`@${username}`) || + myRoleNames.some(rn => + rn.startsWith('@') ? content.includes(rn) : content.includes(`@role:${rn}`) + ); + }, [username, myRoleNames]); + + const playPingSound = useCallback(() => { + const now = Date.now(); + if (now - lastPingTimeRef.current < 1000) return; + lastPingTimeRef.current = now; + const audio = new Audio(PingSound); + audio.volume = 0.5; + audio.play().catch(() => {}); + }, []); + const scrollToBottom = useCallback((force = false) => { const container = messagesContainerRef.current; if (!container) return; @@ -1194,14 +1268,7 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u {decryptedMessages.map((msg, idx) => { const currentDate = new Date(msg.created_at); const previousDate = idx > 0 ? new Date(decryptedMessages[idx - 1].created_at) : null; - const isMentioned = msg.content && ( - msg.content.includes(`@${username}`) || - myRoleNames.some(rn => - rn.startsWith('@') - ? msg.content.includes(rn) - : msg.content.includes(`@role:${rn}`) - ) - ); + const isMentioned = isMentionedInContent(msg.content); const isOwner = msg.username === username; const canDelete = isOwner || !!myPermissions?.manage_messages; diff --git a/Frontend/Electron/src/components/VoiceStage.jsx b/Frontend/Electron/src/components/VoiceStage.jsx index 430b18a..d9cf76a 100644 --- a/Frontend/Electron/src/components/VoiceStage.jsx +++ b/Frontend/Electron/src/components/VoiceStage.jsx @@ -526,8 +526,6 @@ const FocusedStreamView = ({ height: participantsCollapsed ? 0 : BOTTOM_BAR_HEIGHT, overflow: 'hidden', transition: 'height 0.25s ease', - backgroundColor: '#1e1f22', - borderTop: participantsCollapsed ? 'none' : '1px solid #2f3136', }}>
-- We should play a sound when a user mentions you also in the main server. +- We should play a sound (the ping sound) when a user mentions you or you recieve a private message.