Skip to content

feat(comms): has_replied on chats + unreplied unread split - #1082

Merged
dylanjeffers merged 1 commit into
mainfrom
feat/inbox-replied-priority
Nov 13, 2026
Merged

dylanjeffers merged 1 commit into
mainfrom
feat/inbox-replied-priority

Conversation

@dylanjeffers

Copy link
Copy Markdown
Contributor

Backs the inbox default change in AudiusProject/apps (linked from that PR). Michael's spec was that Priority holds only chats you chose and new chats land in General. What shipped put every uncategorized chat in Priority, so General stayed empty.

New rule (computed client-side from these fields): an explicit category wins. Otherwise a chat is Priority once you have sent a message of your own in it (blast copies don't count) and General until then.

  • GET /comms/chats and /comms/chats/:id return has_replied per viewer. Sent blasts return true.
  • GET /comms/chats/unread_by_category adds uncategorized_unreplied, a subset of uncategorized. Older clients ignore it and behave as before.
  • No migration. The check uses the existing partial index chat_message_chat_created_non_blast_idx (chat_id, created_at, user_id) WHERE blast_id IS NULL.
  • Pedalboard push silencing is unchanged: only chats explicitly filed as General are silent, so a new DM still notifies.

Tests: extended TestPostMutateChatSetCategory (per-viewer has_replied) and TestGetUnreadCountByCategory (replied, blast-copy-only and other-member-only chats).

🤖 Generated with Claude Code

…ounts

Uncategorized chats the viewer never replied to (inbound DMs, blast threads)
now belong in the General inbox tab. Chats gain has_replied, and
unread_by_category gains uncategorized_unreplied (a subset of uncategorized,
so older clients keep working).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@dylanjeffers
dylanjeffers merged commit 56bd86a into main Nov 13, 2026
@dylanjeffers
dylanjeffers deleted the feat/inbox-replied-priority branch November 13, 2026 00:12
dylanjeffers added a commit to AudiusProject/apps that referenced this pull request Nov 13, 2026
…pills (#14783)

Needs AudiusProject/api#1082 for the new behavior. Before that deploys,
nothing changes, because a missing `has_replied` falls back to Priority.

**Why:** In the #eng thread on 9/10, Michael settled on Priority as the
default view, curated to the user, with "a dot on general for new
messages". What shipped put every uncategorized chat in Priority, so
General only filled up if you sorted chats by hand.

**Tab rule** (`getInboxTabForChat`):
- An explicit Priority or General choice wins.
- Uncategorized chats you have replied in → Priority. New inbound DMs
and blast threads you never answered → General.
- Your own sent blasts stay in Priority.
- Sending a message in a General-by-default chat moves it to Priority
right away.

**Dots:** The tab dots use `uncategorized_unreplied` from
`unread_by_category`. The dot now sits inside the pill after the label
instead of hanging off the corner, and turns white on the selected
(purple) pill. That needed a new `endAdornment` prop on
`SelectablePill`, added to both harmony and harmony-native.

**Menus/swipes:** These now offer only the tab the chat isn't shown in.
Pushes are unchanged: only chats filed as General explicitly are silent.

Tests: common `category.test.ts` (tab rule, unreplied buckets, reply
moves a chat, blast copies don't count, filing moves unreads) and web
`InboxTabs.test.tsx`. Typecheck and lint are clean on the touched files.
Mobile has not been run on a device.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.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