fix: message sending fallback + iOS zoom on input + openOrCreatePrivate

- MessageInput: HTTP fallback when WebSocket not OPEN (prevents silent failures)
- WsClient: add trySend() returning bool to detect WS availability
- Backend: POST /api/messages/chat/:chatId endpoint for HTTP message send
- openOrCreatePrivate: use openChat() for consistency after refreshing chat list
- iOS fix: inputs get font-size:16px on mobile to prevent Safari auto-zoom

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ai
2026-05-22 12:44:42 +03:00
parent 2a4b7d5abc
commit 87c6d7f82f
5 changed files with 99 additions and 23 deletions

View File

@@ -77,20 +77,29 @@ export default function MessageInput({ chatId, replyTo, editMsg, onCancelReply,
if (textareaRef.current) textareaRef.current.style.height = 'auto';
wsClient.send('typing', { chatId, typing: false });
if (editMsg) {
wsClient.send('edit_message', { messageId: editMsg.id, content });
onEditDone({ ...editMsg, content, isEdited: true });
} else {
wsClient.send('send_message', {
chatId,
content,
type: 'text',
replyToId: replyTo?.id || null,
});
onCancelReply();
try {
if (editMsg) {
wsClient.send('edit_message', { messageId: editMsg.id, content });
onEditDone({ ...editMsg, content, isEdited: true });
} else {
const sent = wsClient.trySend('send_message', {
chatId, content, type: 'text', replyToId: replyTo?.id || null,
});
if (!sent) {
// WS not available — use HTTP fallback
const { data } = await api.post(`/api/messages/chat/${chatId}`, {
content, type: 'text', replyToId: replyTo?.id || null,
});
addMessage(data);
}
onCancelReply();
}
} catch {
// restore text so user doesn't lose it
setText(content);
} finally {
setSending(false);
}
setSending(false);
}
async function handleFile(e: React.ChangeEvent<HTMLInputElement>) {