Skip to content

feat(dm-list): group DM avatars, iOS autocapitalize fix, and timeline/sort fixes#816

Draft
Just-Insane wants to merge 8 commits into
SableClient:devfrom
Just-Insane:feat/dm-list-group-avatars
Draft

feat(dm-list): group DM avatars, iOS autocapitalize fix, and timeline/sort fixes#816
Just-Insane wants to merge 8 commits into
SableClient:devfrom
Just-Insane:feat/dm-list-group-avatars

Conversation

@Just-Insane
Copy link
Copy Markdown
Contributor

Description

Five commits bundled around the DM list and related iOS/timeline fixes.

feat(dm-list): group member avatars and sort on reload

  • Group DMs now show up to three member avatars stacked in the sidebar rail, matching the visual style used in other Matrix clients.
  • Fixes DM list sort order not updating when a limited sync repopulates the timeline (TimelineReset event).

fix(editor): hidden input for iOS autocapitalize

  • Replaces the previous Transforms hack (inserting and immediately deleting a space on focus) with a visually hidden <input> that the iOS keyboard reads for autocapitalize hints. Less fragile and doesn't produce undo-history noise.

fix(timeline): unblock initial scroll after TimelineReset with eventId

  • When navigating to a specific event ID, isReady could get stuck if a TimelineReset fired before the event was found. Now unblocked correctly.

fix: import cleanup and lint

  • Removes unused imports and resolves lint warnings in RoomTimeline, ThreadDrawer, RoomItem, and slidingSync.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code

Just-Insane and others added 8 commits May 13, 2026 10:23
- RoomNavItem: for group DMs (>2 joined members) render a 3-slot
  mini-avatar cluster instead of the single room avatar, using the
  same useGroupDMMembers / UserAvatar logic as the sidebar new-chat
  panel; bot accounts are filtered out automatically
- styles.css: add GroupAvatarRow / GroupAvatarMini for the triangle
  layout (top-centre, bottom-left, bottom-right) inside size="200"
- useGroupDMMembers: accept Room | undefined so RoomNavItem can skip
  the hook conditionally for non-group DMs
- Direct: bump activityCounter once immediately after re-attaching
  timeline listeners so the list re-sorts on mount / directs change,
  fixing stale order after a limited-sync reload
When a room is opened via notification tap (eventId in URL) and a
TimelineReset fires while loadEventTimeline is in flight — which happens
consistently on iOS background resume when mx.retryImmediately() triggers
a fresh sliding sync batch — useLiveTimelineRefresh resets to the live
timeline and the blank-protection re-arms hasInitialScrolledRef.

blocked the scroll from firing once events arrived in the live timeline,
leaving the room permanently blank (only header + text input visible).

The liveTimelineLinked guard already provides the necessary protection:
historical slices returned by loadEventTimeline are never live-linked, so
an in-flight loadEventTimeline. Also drop eventId from the dep array since
it is no longer read inside the effect.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… RoomItem, slidingSync

- Combine type-only and value imports per consistent-type-imports rule
- Remove unused imports (NetworkInformation interface, unwrapRelationJumpTarget, useMessageEdit, etc.)
- Fix RoomItem: use Membership.Join instead of KnownMembership.Join
- Add eslint-disable comments for class-methods-use-this in ExtensionPresence
…n encrypted rooms

- Implement group DM triangle-avatar layout in RoomNavItem (the wider DM
  list panel). The CSS (GroupAvatarRow/GroupAvatarMini) was already defined
  in styles.css.ts from feat/dm-list-group-avatars but the JSX
  implementation was never added.
- Fix ArrowUp edit-last-message failing in encrypted rooms: use
  getEffectiveEvent()?.type instead of getType(), which returns the wire
  type m.room.encrypted rather than the actual message type.
SpaceTab was using RoomUnreadProvider with the space's own roomId, but
space rooms carry no messages so the unread count was always zero.

Replace with the same recursive aggregation pattern used by SpaceMenu:
useSpaceChildren + useRecursiveChildScopeFactory to gather all
descendant room IDs, then useRoomsUnread to sum their unread counts.
The SidebarUnreadBadge now lights up correctly whenever any child room
(or sub-space room) has unread messages or highlights.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant