Private
Public Access
Add @-mention highlighting, sidebar badge, and push customization (#39)
@username tokens in a sent message are parsed against the room's actual members (skipping fenced/inline code, so pasted code isn't misread) and recorded as MessageMention rows, reusing #38's read-tracking and offline-member broadcast infrastructure rather than building a parallel notification path: - Sidebar: a mentioned-and-unread room shows a distinct highlight- colored badge instead of (not alongside) the plain unread dot -- computed the same way as has_unread, just scoped to messages that mention the caller, and cleared by the same last_read_at mark-read flow. - Push notifications: a mentioned offline recipient gets "X mentioned you: ..." instead of the generic "X: ...", still per-recipient since the same message can page some room members and not others. - Message rendering: a validated @username is highlighted inline, implemented by turning it into a `[@username](mention:username)` link before markdown parsing and overriding link rendering to style `mention:`-scheme links as a span instead of an anchor -- reuses markdown-to-jsx's existing parser rather than hand-rolling text-node splitting. - Composer: typing @ opens an autocomplete dropdown of matching room members (arrow keys to navigate, Enter/Tab/click to insert, Escape or moving the cursor away to dismiss). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,8 +6,9 @@ from sqlalchemy import or_, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from app.models import Message, MessageReaction
|
||||
from app.models import Message, MessageMention, MessageReaction
|
||||
from app.schemas.message import ReactionSummary
|
||||
from app.services.mention_service import extract_mentioned_user_ids
|
||||
|
||||
|
||||
class MessageNotFoundError(Exception):
|
||||
@@ -30,6 +31,12 @@ async def create_message(
|
||||
room_id=room_id, user_id=user_id, content=content, image_id=image_id, file_id=file_id
|
||||
)
|
||||
db.add(message)
|
||||
# message.id is available immediately (a Python-side uuid4 default, not
|
||||
# server-generated), so mention rows can reference it without a flush.
|
||||
if content:
|
||||
mentioned_ids = await extract_mentioned_user_ids(db, room_id, content)
|
||||
for mentioned_id in mentioned_ids:
|
||||
db.add(MessageMention(message_id=message.id, user_id=mentioned_id))
|
||||
await db.commit()
|
||||
await db.refresh(message)
|
||||
return message
|
||||
|
||||
Reference in New Issue
Block a user