Skip to content

feat(desktop): redesign status UI with full emoji picker and presence sub-menu#760

Merged
wesbillman merged 2 commits into
mainfrom
status-ui-emoji
May 27, 2026
Merged

feat(desktop): redesign status UI with full emoji picker and presence sub-menu#760
wesbillman merged 2 commits into
mainfrom
status-ui-emoji

Conversation

@wesbillman

@wesbillman wesbillman commented May 27, 2026

Copy link
Copy Markdown
Collaborator

What

Reworks the user status UI per Wes's feedback in the screenshots:

  1. User menu (ProfilePopover) — the two large "Set yourself as away" / "Set yourself as offline" rows are gone. The identity block now surfaces:

    • display name
    • @nip05 · presence dot + label
    • {emoji} {text} (only when a status is set)

    Presence selection moved into a single disclosure row that opens a nested right-side popover with the three states. The row label shows the live presence (Online / Away / Offline / etc.) with a chevron, not a static "Change presence" string. The sub-menu opens on hover (with click toggle for keyboard) — focus-driven open was dropped because Radix's focus restore on close caused a flicker loop. Existing data-testid="profile-popover-status-{status}" ids preserved; trigger gains profile-popover-presence-trigger.

  2. Set status dialog — the hardcoded 8-emoji strip is replaced with a full emoji-mart picker. Preset chips (In a meeting, Commuting, etc.) stay as quick-pick. A small ✕ overlay clears the picked emoji without touching the text. The dialog has its own Clear status button, so the duplicate one in the popover was removed.

Notes

  • Focus trap: the picker uses PopoverPrimitive.Content directly (no Portal) so it renders inside the Dialog subtree. Otherwise Radix Dialog's focus trap blocks emoji-mart's search input.
  • Hover timers: 80ms open / 160ms close, cleared on unmount; covers mouse transit between trigger and content with no flicker.
  • Status expiry ("Remove status after…") is intentionally not in this PR — needs an event tag + sweeper, separate work.
  • Backend / event types untouched; publishUserStatus(text, emoji) already accepts arbitrary emoji.
  • profile.spec.ts updated to click the new disclosure (now via testid) before each presence selection.

Tests

  • pnpm --filter sprout typecheck
  • pnpm --filter sprout lint
  • pnpm --filter sprout build
  • All pre-push hooks green (rust-clippy, rust-tests, desktop-tauri-check, mobile-test, etc.)
  • Playwright e2e: not run locally (no Chromium installed); CI will execute.

… sub-menu

- ProfilePopover: surface current presence inline (dot + label) and the
  user-set status (emoji + text) in the identity block. Replace the two
  large 'Set yourself as away/offline' rows with a single 'Change
  presence' disclosure that opens a nested right-side popover.
- SetStatusDialog: drop the hardcoded 8-emoji strip; users can now pick
  any emoji via emoji-mart. Keep the preset chips ('In a meeting',
  'Commuting', etc.) as quick-pick. Add a small ✕ overlay to clear the
  picked emoji.
- Use PopoverPrimitive.Content directly (no Portal) for the picker so it
  renders inside the Dialog's focus trap — keeps emoji-mart search and
  focus-return semantics correct.
- Update profile e2e to click the new disclosure before each presence
  selection.

Signed-off-by: Wes <wesbillman@users.noreply.github.com>
@wesbillman wesbillman requested a review from a team as a code owner May 27, 2026 19:42
- Open the presence sub-menu on hover (with click toggle for keyboard);
  drop the focus-driven open that caused a flicker loop on close →
  focus-restore → reopen.
- Replace static "Change presence" label with the live presence
  (Online/Away/Offline/etc.) so the row reflects current state.
- Remove duplicate "Clear status" entry from the popover; the Update
  Status dialog already exposes its own clear control.
- Add stable testid for the presence trigger and update e2e selectors.

Signed-off-by: Wes <wesbillman@users.noreply.github.com>
@wesbillman

Copy link
Copy Markdown
Collaborator Author
Screenshot 2026-05-27 at 12 57 46 PM Screenshot 2026-05-27 at 12 57 52 PM Screenshot 2026-05-27 at 12 57 59 PM

@wesbillman wesbillman merged commit 3582157 into main May 27, 2026
15 checks passed
@wesbillman wesbillman deleted the status-ui-emoji branch May 27, 2026 20:13
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