v0.11.10 ui changes
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-backend",
|
"name": "jama-backend",
|
||||||
"version": "0.11.9",
|
"version": "0.11.10",
|
||||||
"description": "TeamChat backend server",
|
"description": "TeamChat backend server",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -13,7 +13,7 @@
|
|||||||
# ─────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION="${1:-0.11.9}"
|
VERSION="${1:-0.11.10}"
|
||||||
ACTION="${2:-}"
|
ACTION="${2:-}"
|
||||||
REGISTRY="${REGISTRY:-}"
|
REGISTRY="${REGISTRY:-}"
|
||||||
IMAGE_NAME="jama"
|
IMAGE_NAME="jama"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-frontend",
|
"name": "jama-frontend",
|
||||||
"version": "0.11.9",
|
"version": "0.11.10",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { useSocket } from '../contexts/SocketContext.jsx';
|
|||||||
import './ChatWindow.css';
|
import './ChatWindow.css';
|
||||||
import GroupInfoModal from './GroupInfoModal.jsx';
|
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 { user: currentUser } = useAuth();
|
||||||
const { socket } = useSocket();
|
const { socket } = useSocket();
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
@@ -82,10 +82,17 @@ export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMess
|
|||||||
setTimeout(() => scrollToBottom(true), 50);
|
setTimeout(() => scrollToBottom(true), 50);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDeleted = ({ messageId }) => {
|
const handleDeleted = ({ messageId, groupId }) => {
|
||||||
setMessages(prev => prev.map(m =>
|
setMessages(prev => {
|
||||||
m.id === messageId ? { ...m, is_deleted: 1, content: null, image_url: null } : m
|
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 }) => {
|
const handleReaction = ({ messageId, reactions }) => {
|
||||||
|
|||||||
@@ -146,6 +146,30 @@ export default function Chat() {
|
|||||||
return () => document.removeEventListener('visibilitychange', handleVisibility);
|
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
|
// Socket message events to update group previews
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!socket) return;
|
if (!socket) return;
|
||||||
@@ -490,6 +514,7 @@ export default function Chat() {
|
|||||||
onBack={isMobile ? () => { setShowSidebar(true); setActiveGroupId(null); } : null}
|
onBack={isMobile ? () => { setShowSidebar(true); setActiveGroupId(null); } : null}
|
||||||
onGroupUpdated={loadGroups}
|
onGroupUpdated={loadGroups}
|
||||||
onDirectMessage={(g) => { loadGroups(); selectGroup(g.id); }}
|
onDirectMessage={(g) => { loadGroups(); selectGroup(g.id); }}
|
||||||
|
onMessageDeleted={handleMessageDeleted}
|
||||||
onlineUserIds={onlineUserIds} />
|
onlineUserIds={onlineUserIds} />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user