From 253bc1f96396626872cbe48bec3ea5ef12d84d12 Mon Sep 17 00:00:00 2001 From: Ricky Stretch Date: Sat, 21 Mar 2026 18:50:34 -0400 Subject: [PATCH] v0.11.10 ui changes --- backend/package.json | 2 +- build.sh | 2 +- frontend/package.json | 2 +- frontend/src/components/ChatWindow.jsx | 17 ++++++++++++----- frontend/src/pages/Chat.jsx | 25 +++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/backend/package.json b/backend/package.json index 729ebc8..b099092 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "jama-backend", - "version": "0.11.9", + "version": "0.11.10", "description": "TeamChat backend server", "main": "src/index.js", "scripts": { diff --git a/build.sh b/build.sh index 03b7d90..d6c04e2 100644 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # ───────────────────────────────────────────────────────────── set -euo pipefail -VERSION="${1:-0.11.9}" +VERSION="${1:-0.11.10}" ACTION="${2:-}" REGISTRY="${REGISTRY:-}" IMAGE_NAME="jama" diff --git a/frontend/package.json b/frontend/package.json index 4b0c562..d2db17a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "jama-frontend", - "version": "0.11.9", + "version": "0.11.10", "private": true, "scripts": { "dev": "vite", diff --git a/frontend/src/components/ChatWindow.jsx b/frontend/src/components/ChatWindow.jsx index d5c3f20..372d7d1 100644 --- a/frontend/src/components/ChatWindow.jsx +++ b/frontend/src/components/ChatWindow.jsx @@ -8,7 +8,7 @@ import { useSocket } from '../contexts/SocketContext.jsx'; import './ChatWindow.css'; import GroupInfoModal from './GroupInfoModal.jsx'; -export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMessage, onlineUserIds = new Set() }) { +export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMessage, onMessageDeleted, onlineUserIds = new Set() }) { const { user: currentUser } = useAuth(); const { socket } = useSocket(); const { toast } = useToast(); @@ -82,10 +82,17 @@ export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMess setTimeout(() => scrollToBottom(true), 50); }; - const handleDeleted = ({ messageId }) => { - setMessages(prev => prev.map(m => - m.id === messageId ? { ...m, is_deleted: 1, content: null, image_url: null } : m - )); + const handleDeleted = ({ messageId, groupId }) => { + setMessages(prev => { + const updated = prev.map(m => + m.id === messageId ? { ...m, is_deleted: 1, content: null, image_url: null } : m + ); + // Notify Chat.jsx so the sidebar preview updates immediately — pass the + // post-delete messages so it can derive the new last non-deleted message + // without an extra API call. + onMessageDeleted?.({ groupId, messages: updated }); + return updated; + }); }; const handleReaction = ({ messageId, reactions }) => { diff --git a/frontend/src/pages/Chat.jsx b/frontend/src/pages/Chat.jsx index 134aa12..5c21524 100644 --- a/frontend/src/pages/Chat.jsx +++ b/frontend/src/pages/Chat.jsx @@ -146,6 +146,30 @@ export default function Chat() { return () => document.removeEventListener('visibilitychange', handleVisibility); }, []); + // When a message is deleted, update the sidebar preview immediately. + // ChatWindow passes back the full post-delete messages array so we can derive + // the new latest non-deleted message without an extra API call. + const handleMessageDeleted = useCallback(({ groupId, messages: updatedMessages }) => { + const latest = [...updatedMessages] + .reverse() + .find(m => !m.is_deleted); + setGroups(prev => { + const updateGroup = (g) => { + if (g.id !== groupId) return g; + return { + ...g, + last_message: latest ? (latest.content || (latest.image_url ? '📷 Image' : '')) : null, + last_message_at: latest ? latest.created_at : null, + last_message_user_id: latest ? latest.user_id : null, + }; + }; + return { + publicGroups: prev.publicGroups.map(updateGroup), + privateGroups: prev.privateGroups.map(updateGroup), + }; + }); + }, []); + // Socket message events to update group previews useEffect(() => { if (!socket) return; @@ -490,6 +514,7 @@ export default function Chat() { onBack={isMobile ? () => { setShowSidebar(true); setActiveGroupId(null); } : null} onGroupUpdated={loadGroups} onDirectMessage={(g) => { loadGroups(); selectGroup(g.id); }} + onMessageDeleted={handleMessageDeleted} onlineUserIds={onlineUserIds} /> )}