- Track when others read messages via messages_read WS event
- Show Check (single) for sent, CheckCheck (double) only when read
- Send push to all recipients, SW suppresses if app is focused
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@fastify/websocket v8 passes Duplex stream as first arg, not ws.WebSocket directly.
socket.on('message') never fired because Duplex streams don't emit 'message' events.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- openOrCreatePrivate: load chat by ID directly (skip stale list lookup)
- GET /api/chats/🆔 resolve title/avatar/privateUserId for private chats
(was returning null title, causing chat area to behave unexpectedly)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix: onOpen now async, MainLayout fetches fresh chats before opening
(was using stale closure, chat wasn't found after creation)
- Fix: search null-safety in user list filter (displayName/username could be undefined)
- Fix: search also matches by phone number
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Login: by phone number instead of username
- Position field: shown as badge next to name in members list, search, admin panel
- Logout: moved from sidebar to profile modal settings
- Sidebar search: global — shows matching users with one-click private chat
- Admin panel: new Чаты tab showing all chats with delete, position/phone in user form
- Backend: /api/admin/chats endpoint, position column migration, phone login support
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New diamond gem icon (blue gradient background, white faceted gem)
- Replaces all PWA icons: icon-192.png, icon-512.png, apple-touch-icon.png
- Login page uses icon-192.png as logo
- Fix vertical centering with 100dvh to account for mobile browser chrome
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>