detach() reported the item removed even when another downloaded entry
still held it, so the downloads list dropped a row that was still backed
by a file until the view was rebuilt.
The interval was computed from two int32 timestamps, so a wrapped or
stale unixtime::now() - which is what the OS correcting a badly wrong
clock produces - overflowed it negative, and base::Timer aborts on that.
deleteFiles() is addressed by item, but removed only the first matching
download and then fired loadedRemoved anyway, so the rest kept their
files while the row was already hidden. changed() likewise re-checked
only the first entry.
Just to be in line with Telegram Android, Telegram iOS, Telegram Web A
and Telegram Web K, none of which check anonymity before showing
reactions.
Related commit: 3f24627f54.
- Send-restriction UI now has a single owner: ComposeControls' write
restriction bar, matching Replies/Sublist modes. BottomControls'
duplicate (overlapping, wrongly sized) bar is removed and the
monoforum-admin "choose a message to reply" state is ported into the
section's write restriction producer.
- History load failures with CHANNEL_PRIVATE / CHANNEL_PUBLIC_GROUP_NA /
USER_BANNED_IN_CHANNEL close the chat with the not-accessible toast
(and handle expired invite peeks), like the legacy view, via a new
Data::Session::historyAccessLost signal fired from
ApiWrap::requestHistory.
- SparseIdsList::Slice::merge inserts single ids instead of re-sorting
the whole accumulated set, so the every-message full-history index
updates in O(log n) instead of O(n log n).
- Unread counting queries the index in place through the new
SparseIdsList::countAfter instead of copying up to 10000 ids on every
read-marking tick.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Parity fixes for the new Mode::History path, plus regression fixes for
the pre-existing Replies/Sublist/topic flows and the shared list/compose
widgets, found via a feature-by-feature comparison against the legacy
HistoryWidget/HistoryInner.
Crashes:
- Bot start deep links (ShowAndStartBotMsgId/ShowAndMaybeStartBotMsgId)
no longer feed a special id into the sparse-ids viewer; /start is sent
and inlineReturnTo is preserved.
- Touch long-press over empty space with an active selection no longer
dereferences a null view in the translate-selected menu branch.
- AboutView element use-after-free when the card is replaced/destroyed.
- HistoryMessagesViewer no longer asserts on unresolved slice ids
(chat preview hardened).
History-mode parity:
- Typing/recording send actions, incoming/outgoing cloud drafts, manual
mark-as-unread clearing on open, channel-unavailable close.
- Force-reply dismissal after sending; bot keyboards no longer
resurrected by slice rescans; single-use re-show persists; keyboard
height parity; keyboard hidden while in-chat search is open.
- Unread mentions/reactions/poll-votes corner buttons; reply-return
stack; jump-to-date calendar; AboutView hit-testing + intro sticker
send; empty-group card.
- Quick Replies and moderate-mode hotkeys autocomplete; interactive
emoji; view-once (TTL) voice button; per-post Statistics and
paid-reaction context items; topic-creating bots; inline-bot slowmode
checks; edit-time countdown.
- Navigation stack clear/dedup, embedded-search recursion guard,
choose-to-report on the legacy path, active-chat re-click jump,
show-at-end positioning, unread-count undercounting, uncached-jump
blanking.
Regressions in pre-existing flows:
- Comments: unread jump on re-open, unread bar, and stray group-call/
requests/contact-status bars no longer leak into threads.
- Topics: no extra reply cancel on normal sends.
- Replies: bot command via section override threads into the comment.
- In-place migration re-subscribes the pinned tracker.
Performance:
- Killed a self-perpetuating 14s draft-write loop.
- Restored updateBotKeyboard's unchanged-state early-out.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>