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:
@@ -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>) {
|
||||
|
||||
Reference in New Issue
Block a user