Skip to content

feat: add NIP-38 user status for desktop and mobile - #449

Merged
wesbillman merged 1 commit into
mainfrom
user-status-ux
May 2, 2026
Merged

feat: add NIP-38 user status for desktop and mobile#449
wesbillman merged 1 commit into
mainfrom
user-status-ux

Conversation

@wesbillman

Copy link
Copy Markdown
Collaborator

Summary

  • Implements Slack/Discord-style user status using NIP-38 (kind:30315) parameterised replaceable events
  • Desktop: status dialog with emoji picker and presets, live display in profile popovers and sidebar, fetch-then-subscribe with TanStack Query
  • Mobile: bottom sheet with emoji grid and quick presets, status in settings page and member list, Riverpod cache with WS subscription and 120s backstop refresh
  • Both platforms produce identical wire-format events (d=general, content=text, ["emoji", value] tag)

Details

Desktop (10 files: 2 new, 8 modified)

  • features/user-status/hooks.tsuseUserStatus / useSetUserStatus hooks with fetch-then-subscribe and optimistic updates
  • features/user-status/ui/SetStatusDialog.tsx — dialog with emoji picker, text input, presets, clear
  • ProfilePopover.tsx — shows own status with click-to-edit
  • UserProfilePopover.tsx — shows other users' status
  • AppSidebar.tsx / AppShell.tsx — status display and dialog entry points
  • relayClientSession.tssubscribeUserStatuses() for live WS updates
  • types.ts / kinds.ts — NIP-38 type and kind constant

Mobile (8 files: 4 new, 4 modified)

  • user_status.dart — immutable UserStatus model with fromEvent factory
  • user_status_cache_provider.dartNotifier<Map<String, UserStatus?>> with WS subscription, batched fetch, 120s backstop
  • user_status_provider.dartAsyncNotifier<UserStatus?> for own status with optimistic publish
  • set_status_sheet.dart — Material bottom sheet with 8 emojis, 5 presets, text input
  • settings_page.dart — status section between Connection and Appearance
  • members_sheet.dart — status display in channel member tiles
  • app.dart — wire cache provider on auth
  • nostr_models.dartEventKind.userStatus = 30315

Test plan

  • Desktop: set status from sidebar profile → verify it appears in own profile popover
  • Desktop: set status → verify other users see it in their profile popover
  • Desktop: clear status → verify it disappears for self and others
  • Desktop: preset chips populate emoji + text correctly
  • Mobile: set status from Settings → verify emoji + text appear in status tile
  • Mobile: open member list in a channel → verify statuses appear as subtitles
  • Mobile: clear status → verify "Set a status" placeholder returns
  • Cross-platform: set status on desktop → verify it appears on mobile (and vice versa)

🤖 Generated with Claude Code

Implements Slack/Discord-style user status using NIP-38 (kind:30315)
parameterized replaceable events across both platforms.

Desktop: status dialog with emoji picker and presets, live status
display in profile popovers and sidebar, fetch-then-subscribe with
TanStack Query integration.

Mobile: bottom sheet with emoji grid and quick presets, status display
in settings and member list, Riverpod cache with WS subscription
and 120s backstop refresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@wesbillman

Copy link
Copy Markdown
Collaborator Author
Screenshot 2026-05-01 at 4 49 27 PM Screenshot 2026-05-01 at 4 57 31 PM Screenshot 2026-05-01 at 4 41 17 PM

@wesbillman
wesbillman merged commit 56f5062 into main May 2, 2026
13 checks passed
@wesbillman
wesbillman deleted the user-status-ux branch May 2, 2026 00:03
Chessing234 added a commit to Chessing234/buzz that referenced this pull request Aug 8, 2026
The relay resolves S3 credentials from the pod IAM role (EKS Pod Identity /
IRSA) only because the workspace pins aws-creds to a fork adopting the
aws-creds portion of durch/rust-s3#449; the crates.io release cannot read
EKS Pod Identity credentials. That pin is temporary and reverts to
crates.io once block#449 lands upstream, so operators relying on Pod Identity
support are depending on an unmerged fork — worth calling out in the chart
README's "Honest limitations" section.

See block#5211.

Signed-off-by: Taksh <takshkothari09@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Chessing234 added a commit to Chessing234/buzz that referenced this pull request Aug 8, 2026
The relay resolves S3 credentials from the pod IAM role (EKS Pod Identity /
IRSA) only because the workspace pins aws-creds to a fork adopting the
aws-creds portion of durch/rust-s3#449; the crates.io release cannot read
EKS Pod Identity credentials. That pin is temporary and reverts to
crates.io once block#449 lands upstream, so operators relying on Pod Identity
support are depending on an unmerged fork — worth calling out in the chart
README's "Honest limitations" section.

See block#5211.

Signed-off-by: Taksh <takshkothari09@gmail.com>
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