Skip to content

feat: read-state & cross-server notifications, context menus, message markup, resizable channel column & space settings#100

Merged
krazyjakee merged 4 commits into
masterfrom
feat/channel-category-context-menu
Jun 10, 2026
Merged

feat: read-state & cross-server notifications, context menus, message markup, resizable channel column & space settings#100
krazyjakee merged 4 commits into
masterfrom
feat/channel-category-context-menu

Conversation

@krazyjakee

@krazyjakee krazyjakee commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Summary

This branch bundles five related UI/UX features (commit c4d1dd04 plus the original context-menu commit 2bae4b9f). They were developed together against the same screens, so they're shipped as one branch.

Important

Merge-order dependency. The read-state work calls client.onReadStateUpdate, which is added in DaccordProject/accordkit-dart#1. That SDK PR must merge (and this client re-resolve accordkit) before CI here can compile. The server-side behaviour (mention counts, read_state.update broadcast, space_id in unreads) lands in DaccordProject/accordserver#27.

What changed

1. Read-state & cross-server notifications

  • Read-state is now keyed per server (serverKey = userId@baseUrl) via a keepAlive family provider, so colliding snowflake IDs across servers don't clobber each other.
  • ReadStateSnapshot reworked around ReadEntry { channelId, spaceId, mentions }, enabling server-level rollups (anyUnreadInSpace, mentionsInSpace) that drive the rail's unread dot and mention badge.
  • Gateway READY now hydrates each server's authoritative unread list, so badges survive cold starts.
  • Incoming messages mark channels unread on every connection (not just the active one) — a message on server B notifies while you're on server A.
  • New onReadStateUpdate subscription clears a channel's badge in real time when you ack it on another device (multi-device sync).
  • Read state is invalidated on logout / account removal / server disconnect so stale snapshots don't linger.

2. Channel & category context menus (original scope)

  • Right-click / long-press menus on channel rows and category headers: mark-as-read, mute/unmute, and manage_channels-gated edit/create/delete. New channel_context_menu.dart + shared context_menu.dart anchored-menu helper.

3. Message markup rendering

  • New accord_message_markup.dart custom inline markdown syntaxes for Accord mentions/channels/emoji (promoted dart_markdown + source_span to direct deps). accord_message_content.dart reworked onto it.

4. Resizable channel column

  • Drag handle between the rail and channel list; final width persisted to AccordSettings.channelListWidth (clamped), live width kept local during drag to avoid per-frame Hive writes.

5. Two-column space settings

  • accord_space_settings.dart reworked into a two-column layout.

Test plan

  • flutter analyze --no-fatal-infos — clean (pre-existing infos only)
  • flutter test — passing
  • CI build — blocked on accordkit-dart#1 merge (see note above)
  • Manual UI check on a connected Accord server: unread badges + rail rollups, cross-server notification, multi-device ack clearing, context menus, mention/channel/emoji markup, channel-column resize, space settings layout.

🤖 Generated with Claude Code

krazyjakee and others added 2 commits June 10, 2026 10:42
Long-press (touch) and right-click (onSecondaryTap, desktop) on a
channel row or category header now open a context menu, mirroring the
existing space-rail menu pattern.

- Channel menu: Mark as read (when unread), Mute/Unmute (server-side via
  client.channels.mute/unmute), and — with manage_channels — Edit and
  Delete.
- Category menu: Expand/Collapse, and — with manage_channels — Create
  channel here, Edit, and Delete.

Reuses the existing edit/create dialogs and the header bell's mute
pattern; factors the delete confirmation into a shared
confirmAndDeleteChannel helper. Threads canManageChannels/spaceId into
_ChannelTile and _CategoryHeader (the latter is now a ConsumerWidget).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ctions & two-column space settings

- Resizable left channel column with width persisted across restarts
  (new channelListWidth setting + drag handle)
- Hover tooltip on message timestamps showing full date/time
- Mobile/desktop message actions menu via long-press / right-click,
  with multi-select demoted to a menu entry
- Shared showAccordContextMenu helper: anchored popups on desktop,
  bottom sheets on touch, applied across spaces/folders/members/
  channels/categories
- Two-column space settings layout on desktop, single column on mobile

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@krazyjakee krazyjakee changed the title feat(channels): channel & category context menus feat: read-state & cross-server notifications, context menus, message markup, resizable channel column & space settings Jun 10, 2026
krazyjakee and others added 2 commits June 10, 2026 17:12
…ate reactions/DM/accordkit

# Conflicts:
#	lib/features/messaging/components/box/accord_message_content.dart
#	lib/features/messaging/components/box/accord_message_markup.dart
#	test/features/messaging/accord_message_markup_test.dart
The markup channel-mention tap was kept from #106 during the master merge,
but #100 keys readStateControllerProvider by serverKey. Pass the active key
and refresh codegen so the family signature resolves.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@krazyjakee krazyjakee merged commit 1625665 into master Jun 10, 2026
5 checks passed
@krazyjakee krazyjakee deleted the feat/channel-category-context-menu branch June 28, 2026 23:01
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