3 Commits
Author SHA1 Message Date
d 4aa8d7e0b5 feat: chat interactivity overhaul — read receipts, polling, sound, unread, icons
- Read receipts: MarkSenderMessagesReadCrossConv matches by body across conversations
- Anti-fraud: cross-domain read receipts require SHA-256 body proof
- Real-time polling: 5s interval refreshes threads + active thread messages
- Notification sound: Web Audio API beep on new unread messages
- Unread indicator: conv.Unread=true on inbound message delivery
- Double-check icon: custom SVG in web_src/svg/ (survives make svg)
- SMTP icon: octicon-mail for email-delivered messages
- Delivery status: same-domain=M8SH check, external=SMTP mail icon, failed=cross
- Plain mode: global toggle for mobile text selection
- Desktop email layout: no width stripping, mobile-only shrinking
- Registration allowlist: domestic users require admin approval

Assisted-By: Cline:anthropic-claude-sonnet-4-20250514
2026-07-25 09:03:27 +03:00
d 1e343a6e24 feat(mail): windowed rendering, backend search, and UX polish (#13)
- Add content-visibility:auto for native browser rendering optimization
  on message bubbles and HTML cards
- Implement backend-powered in-thread search with Unicode-aware
  case-insensitive matching (Go strings.ToLower handles Cyrillic/CJK)
- Add ListMessagesAroundID model + /around/{msgid} API endpoint for
  windowed message loading around search matches
- Add message caching for instant thread switching without API calls
- Fix scroll position restoration on pagination using anchor element
  tracking with double requestAnimationFrame
- Fix client-side thread list sorting by last message timestamp
- Remove FromName display from DM message bubbles (only in groups)
- Add Copy button to message context menu with toast feedback
- Replace JSON-based forwarding with plain text (RFC 5322 compatible)
- Strip Gmail/Outlook reply quotes from incoming messages
- Fix audio player sync: loadedTrackId vs playingTrackId separation
- Add viewport meta override to disable mobile zoom on all inputs
- Add user-select:none to prevent native text selection on long-press
- Resolve participant display names from message history for thread list

<!--
Before submitting:
- Target the `main` branch; release branches are for backports only.
- Use a Conventional Commits title, e.g. `fix(repo): handle empty branch names`.
- Read the contributing guidelines: https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md
- Documentation changes go to https://gitea.com/gitea/docs

Describe your change below and link any issue it fixes.
-->Reviewed-on: #13
2026-07-19 17:30:25 +00:00
d e516d007c8 Integrated email server (#12)
## messenger-style email with full backend integration

Implements M8SH Mail — a complete messenger UI for email built on top of the Gitea fork's integrated email server.

Features:

- All 17 endpoints (`/api/v1/mail/*`) — thread list with cursor pagination, message send/forward/delete, pin/unread, block list, group rename/members, attachment serving with Range support
- RFC 5322 parsing with multipart support, HTML detection/correction, reply quote stripping (Gmail/Outlook patterns), plain-text preview extraction via `golang.org/x/net/html`
- M8SH HTTP fast-path for same-domain, SMTP MX fallback for external recipients, DKIM signing, `From:` display name from Gitea Full Name
- Internal-domain users (`@m8sh.su`) auto-activated and get Chats tab; external users get activation email via integrated mail server (MX → SMTP)
- Vue 3 SPA with ThreadList (infinite scroll, context menu, delete confirmation), ChatPane (message bubbles, HTML cards, audio player, in-thread search, scroll-up pagination), avatar resolution pipeline (Gitea → Gravatar → favicon.ico → favicon.png → default)
- Plain text only — no JSON/ForwardedContent trees, fully RFC 5322 compatible
- Music player, video player, image viewer are integrated into chat UI and they make content easily downloadable
 ![img](https://m8sh.su/attachments/cfdd773e-b1c3-4207-a66f-36360ca6f8e6)Reviewed-on: #12
2026-07-18 19:36:17 +00:00