feat: improve chat mention notifications and consent controls#2255
feat: improve chat mention notifications and consent controls#2255webguru-hypha wants to merge 82 commits into
Conversation
Add a dedicated mention-notification consent setting to Notification Centre, persist it to OneSignal tags, and localize the new control across all supported locales. Also introduce OneSignal expert role definitions and a ready-to-implement chat/notification specification for Discord-parity mention flows. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThis PR implements a Discord-parity mention notification system: specification, consent tag and UI, OneSignal integration, client/server notification plumbing (notifyChatMention), Matrix sendMessage eventId extraction for deep-links, deep-link retry/fallback, signal-team authorization and composer locking, coherence boards UI, i18n updates, and OneSignal agent roles. ChangesMention Notification System with Consent and Signal-Team Support
Estimated code review effort 🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
🔗 Custom preview URL: https://pr-2255.preview-app.hypha.earth |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/epics/src/notifications/components/notification-centre-form.tsx (1)
148-150: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winReplace
anyin invalid-submit handler with a typed error shape.Use
FieldErrors<NotificationCentreFormValues>(orSubmitErrorHandler<NotificationCentreFormValues>) instead ofany.💡 Suggested fix
import { useFieldArray, useForm } from 'react-hook-form'; +import { FieldErrors } from 'react-hook-form'; @@ - const handleInvalid = async (err?: any) => { + const handleInvalid = async ( + err?: FieldErrors<NotificationCentreFormValues>, + ) => { console.warn('Notification settings errors:', err); };🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/epics/src/notifications/components/notification-centre-form.tsx` around lines 148 - 150, The invalid-submit handler handleInvalid currently types its parameter as any; change its signature to use the proper form error type (e.g. FieldErrors<NotificationCentreFormValues> or SubmitErrorHandler<NotificationCentreFormValues>) and update the parameter name/type accordingly so the handler is strongly typed; locate handleInvalid in notification-centre-form.tsx and replace the any with FieldErrors<NotificationCentreFormValues> (or use SubmitErrorHandler<NotificationCentreFormValues> for the whole handler type) and adjust the console log or error handling to accept that typed shape.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.agents/roles/senior-onesignal-notifications-engineer.base.md:
- Around line 18-19: The ordered list after the section heading incorrectly
continues numbering (shows "3." and "4."); change those list items for
"Requirements Engineering" and "Information Synthesis" to restart at "1." and
"2." respectively and ensure there's a blank line between the heading and the
list so the markdown restarts numbering correctly (edit the lines containing
"Requirements Engineering" and "Information Synthesis" in the
.agents/roles/senior-onesignal-notifications-engineer.base.md file).
In `@packages/epics/src/notifications/components/notification-centre-form.tsx`:
- Around line 300-305: The UI shows a hardcoded fallback string for the
mention-consent label; remove the literal and use the translation key only. In
notification-centre-form.tsx replace the conditional that renders FormLabel with
the fallback ('Mention Notifications Consent') so that it always calls
tNotificationCentre('channels.mentionConsent') (remove the ternary/has check) to
ensure all user-facing text uses the i18n key via tNotificationCentre and the
channels.mentionConsent identifier.
---
Outside diff comments:
In `@packages/epics/src/notifications/components/notification-centre-form.tsx`:
- Around line 148-150: The invalid-submit handler handleInvalid currently types
its parameter as any; change its signature to use the proper form error type
(e.g. FieldErrors<NotificationCentreFormValues> or
SubmitErrorHandler<NotificationCentreFormValues>) and update the parameter
name/type accordingly so the handler is strongly typed; locate handleInvalid in
notification-centre-form.tsx and replace the any with
FieldErrors<NotificationCentreFormValues> (or use
SubmitErrorHandler<NotificationCentreFormValues> for the whole handler type) and
adjust the console log or error handling to accept that typed shape.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 2e1f5941-6351-4ad8-9e0b-f940228ad129
📒 Files selected for processing (13)
.agents/AGENTS.md.agents/roles/senior-onesignal-expert.base.md.agents/roles/senior-onesignal-notifications-engineer.base.mddocs/requirements/Features/chat-mentions-notifications-discord-parity/requirements.mdpackages/epics/src/notifications/components/notification-centre-form.tsxpackages/epics/src/notifications/hooks/validation.tspackages/i18n/src/messages/de.jsonpackages/i18n/src/messages/en.jsonpackages/i18n/src/messages/es.jsonpackages/i18n/src/messages/fr.jsonpackages/i18n/src/messages/pt.jsonpackages/notifications/src/constants/tags.tspackages/notifications/src/hooks/use-notifications.ts
Add chat mention notification dispatch that maps mentioned Matrix users to Hypha recipients, enforces mention consent tags, and sends push/email notifications with deep links to the mentioned message. Also return sent event ids from Matrix sendMessage and wire client notification hooks for chat mentions. Co-authored-by: Cursor <cursoragent@cursor.com>
Add resilient mention navigation fallback when a target message or room cannot be resolved, with non-blocking user notices and localized copy. Also extract and test mention notification helper utilities to improve confidence in mention recipient normalization and email body rendering. Co-authored-by: Cursor <cursoragent@cursor.com>
Reset supporting competencies numbering to restart at the section boundary so markdown lint rules pass and list formatting remains consistent. Co-authored-by: Cursor <cursoragent@cursor.com>
Use the translation key directly for the mention consent form label so notification-center UI strings remain fully i18n-driven. Co-authored-by: Cursor <cursoragent@cursor.com>
Autofix Review CompletedResolved all currently unresolved CodeRabbit comments with one commit per comment. Commits
Branch is clean and fully pushed. |
Format the mention notification and chat panel files to satisfy the format:check workflow. Co-authored-by: Cursor <cursoragent@cursor.com>
Allow @ mentions in coherence/signal-linked threads by merging candidates from the thread room and the parent space chat room membership. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/epics/src/notifications/components/notification-centre-form.tsx (1)
148-150: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick winRemove
anytype from invalid-submit handler and use proper form error typing.The
err?: anyparameter weakens type safety. UseSubmitErrorHandler<NotificationCentreFormValues>(the standard React Hook Form pattern already used elsewhere in the codebase, e.g.,people-redeem-form.tsx).♻️ Proposed fix
-import { useFieldArray, useForm } from 'react-hook-form'; +import { + SubmitErrorHandler, + useFieldArray, + useForm, +} from 'react-hook-form'; ... - const handleInvalid = async (err?: any) => { - console.warn('Notification settings errors:', err); - }; + const handleInvalid: SubmitErrorHandler<NotificationCentreFormValues> = + async (errors) => { + console.warn('Notification settings errors:', errors); + };🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/epics/src/notifications/components/notification-centre-form.tsx` around lines 148 - 150, The invalid-submit handler handleInvalid currently types its parameter as err?: any which reduces type safety; change its signature to use React Hook Form's SubmitErrorHandler<NotificationCentreFormValues> (i.e. const handleInvalid: SubmitErrorHandler<NotificationCentreFormValues> = async (errors) => { ... }) and update the parameter name from err to errors, remove console.warn any-typing, and use the typed errors inside the body; add/import SubmitErrorHandler and NotificationCentreFormValues if not already imported.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 964-967: The memo that builds candidateRoomIds (using
candidateRoomIds, roomId, mode, space.chatRoomId) only causes
mentionMembershipEpoch to update for the active room; ensure changes to the
parent space room also refresh mentions by including space.chatRoomId (trimmed)
in the dependency logic that computes candidateRoomIds and in the place that
bumps mentionMembershipEpoch. Specifically, update the memo/effect that uses
candidateRoomIds so it depends on space.chatRoomId?.trim() (and mode/roomId as
already present) or compute a stable key from the Set and use that to trigger
the mentionMembershipEpoch increment whenever the parent space chatRoomId
changes.
- Around line 2351-2362: The deep link is built using the current pathname
(variable pathname) which may be outside the target space; replace pathname with
the canonical route that mounts the target space/chat before appending the
msg/chat query params. Locate the deep link construction (uses pathname, roomId,
sendResult.eventId) and call or compute the canonical space route for the target
room (e.g., getCanonicalSpaceRoute(roomId) or derive the space route from
roomId/spaceId) and use that route instead of pathname when composing
`${window.location.origin}${...}` so the resulting link mounts the correct space
and the msg/chat params resolve.
In `@packages/notifications/src/actions/notify-chat-mention.ts`:
- Around line 61-79: The Promise.allSettled call in notify-chat-mention.ts
currently discards results so failed push or email deliveries are swallowed;
change the code to capture the results (e.g., const results = await
Promise.allSettled([...]) ), inspect each result for status === "rejected" for
sendPushNotifications and sendEmailNotifications, log the rejection details
(error messages/stack) via the existing logger/processLogger, and if both
channels failed throw or return an error to surface the failure; ensure you
reference the sendPushNotifications and sendEmailNotifications calls and
preserve the built email body via buildMentionEmailBody while adding this error
handling and logging logic.
In `@packages/notifications/src/actions/notify-chat-mention.utils.ts`:
- Around line 14-23: The template currently interpolates url directly into the
anchor href (variable url), allowing attribute injection and unsafe schemes;
validate the url scheme (allow only http or https) and reject or replace unsafe
values with a safe fallback, then HTML-escape it for attribute context (escape
quotes, ampersand, <, > — e.g., produce escapedUrl) before interpolation; update
the template returned by the function that produces the mention HTML to use
escapedUrl instead of url and preserve existing escapedActor and escapedPreview
logic so the href cannot be exploited.
---
Outside diff comments:
In `@packages/epics/src/notifications/components/notification-centre-form.tsx`:
- Around line 148-150: The invalid-submit handler handleInvalid currently types
its parameter as err?: any which reduces type safety; change its signature to
use React Hook Form's SubmitErrorHandler<NotificationCentreFormValues> (i.e.
const handleInvalid: SubmitErrorHandler<NotificationCentreFormValues> = async
(errors) => { ... }) and update the parameter name from err to errors, remove
console.warn any-typing, and use the typed errors inside the body; add/import
SubmitErrorHandler and NotificationCentreFormValues if not already imported.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 1c979d89-0908-4088-8621-988ed0113442
📒 Files selected for processing (16)
.agents/roles/senior-onesignal-notifications-engineer.base.mdpackages/core/src/matrix/client/providers/matrix-provider.tsxpackages/core/src/notifications/client/hooks/use-send-notifications.tspackages/epics/src/common/human-chat-panel/human-chat-panel-messages.tsxpackages/epics/src/common/human-right-panel.tsxpackages/epics/src/notifications/components/notification-centre-form.tsxpackages/i18n/src/messages/de.jsonpackages/i18n/src/messages/en.jsonpackages/i18n/src/messages/es.jsonpackages/i18n/src/messages/fr.jsonpackages/i18n/src/messages/pt.jsonpackages/notifications/src/actions/index.tspackages/notifications/src/actions/notify-chat-mention.test.tspackages/notifications/src/actions/notify-chat-mention.tspackages/notifications/src/actions/notify-chat-mention.utils.tspackages/notifications/src/hooks/use-send-notifications.ts
Autofix Review CompletedApplied 4 CodeRabbit autofix comments with one commit per comment. Commits
Validation run
CI is currently running on the latest commits. |
There was a problem hiding this comment.
Actionable comments posted: 15
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@docs/requirements/Features/chat-mentions-notifications-discord-parity/requirements.md`:
- Around line 199-203: In
docs/requirements/Features/chat-mentions-notifications-discord-parity/requirements.md
the ordered lists that currently begin with "6. As a signal owner/editor..." and
"9. As a non-team member..." (and the similar block at 325-338) must be
normalized to satisfy markdownlint MD029: restart each logical ordered-list
block at 1 (or make them consistently sequential within each block) so change
the leading numerals (e.g., 6., 7., 8., 9., 10.) to 1., 2., 3., etc. for each
separate list block and verify other list blocks in the file follow the same
convention.
In `@packages/epics/src/common/human-chat-panel/human-chat-panel-chat-bar.tsx`:
- Around line 484-490: The component HumanChatPanelChatBar allows drag-and-drop
to call pushDrafts even when composerLocked is true; update all drop/attachment
ingestion paths to early-return or no-op when composerLocked is true (e.g.,
inside the onDrop, handleDrop, or addAttachment handlers that call pushDrafts)
so draft ingestion is guarded by if (!composerLocked) before calling pushDrafts;
apply the same guard to the other affected blocks where pushDrafts is invoked so
read-only/locked mode cannot mutate drafts.
- Around line 489-490: The combined condition atMentionInteractable is causing
locked composers to show the "no members loaded" tooltip; separate the
membership availability check from the lock check: compute a membershipAvailable
boolean from (mentionPickerEnabled ?? mentionCandidates.length > 0), then set
atMentionInteractable = !composerLocked && membershipAvailable; update the
tooltip logic to show a lock-specific message when composerLocked is true and
only show the "no members loaded" message when membershipAvailable is false and
composerUnlocked; apply the same split/tooltip change to the other occurrence
around the mention logic referenced (lines ~2059-2061).
In `@packages/epics/src/common/human-right-panel.tsx`:
- Around line 2733-2752: The hook that builds the mention deep link uses
spaceSlug (used to compute canonicalSpaceSlug at the mention deep-link logic
around the canonicalSpaceSlug usage) but spaceSlug is missing from the
dependency array for the effect/memo; add spaceSlug to the dependency array
alongside the existing entries (input, roomId, ..., t) so the effect
recalculates canonicalSpaceSlug and the notification deep link whenever
spaceSlug changes, preventing stale closures.
- Around line 1268-1274: The event content object passed to client.sendEvent
contains custom fields (coherenceSlug, memberMatrixUserIds, updatedAt) not
present on the Matrix SDK's RoomMessage content type; update the call to either
cast the payload to a permissive type or create and use a custom content
interface (e.g., SignalTeamEventContent extends IContent with coherenceSlug?:
string|null, memberMatrixUserIds: string[], updatedAt: string, plus body and
msgtype) and use that type for client.sendEvent<SignalTeamEventContent>(...) for
this call and the other signal-team sends (the nearby sendEvent calls referenced
in the comment) so TypeScript accepts the custom properties.
- Around line 1283-1301: requestSignalTeamAccess currently swallows failures
because it uses try/finally without a catch; update it to add a catch block
around the client.sendEvent call that logs the error (use the project's logger
or console.error) and surfaces feedback to the user (e.g., set a local error
state like setSignalTeamError or call the app's toast/notification helper) so
failures aren't silent, while keeping the existing success path that calls
setSignalTeamPendingRequesterIds only when sendEvent succeeds and preserving
setSignalTeamBusy(false) in finally.
- Around line 1303-1346: approveSignalTeamRequester currently lacks error
handling so failures are silently swallowed; add a catch block around the await
Promise.all call to capture errors, log them (via console.error or the app
logger) and surface the failure to the UI using the existing error/loading
mechanisms (e.g., call a state setter such as setSignalTeamError or dispatch a
user-facing toast), then rethrow or handle accordingly; keep the existing
finally that calls setSignalTeamBusy(false). Reference: function
approveSignalTeamRequester, Promise.all call, setSignalTeamBusy, and
setSignalTeamPendingRequesterIds.
- Around line 1264-1281: publishSignalTeamMembers currently awaits
client.sendEvent without error handling, causing unhandled promise rejections
when callers invoke it with void; wrap the body of publishSignalTeamMembers in a
try/catch, catch any error from client.sendEvent (and normalizeMatrixUserIds if
needed), log the error via the same logger used elsewhere (or processLogger)
with context ("publishSignalTeamMembers") and ensure you only call
setSignalTeamMemberIds and setSignalTeamPendingRequesterIds on success (or
revert state on failure) so state updates are not lost when the sendEvent fails.
In `@packages/epics/src/notifications/components/notification-centre-form.tsx`:
- Around line 93-95: The code calls
getSwitch(configuration.mentionNotificationsConsent) without guarding against
configs that lack that property, which causes missing values to be coerced to
'no'; change the call to first check whether configuration has an explicit
mentionNotificationsConsent and if not pass the intended default 'yes' into
getSwitch (e.g. use a null/undefined check or hasOwnProperty/'in' on
configuration before calling getSwitch), and apply the same guard to the other
occurrence of mentionNotificationsConsent conversion in the file so legacy
configs default to 'yes'.
In `@packages/i18n/src/messages/de.json`:
- Around line 1998-2010: The German locale file contains untranslated English
values for keys like composerLockedPlaceholder, signalTeamInteractionRestricted,
signalTeamBannerReadOnly, signalTeamRequestAccess, signalTeamRequestPending,
signalTeamManageTitle, signalTeamManageOpen, signalTeamManageClose,
signalTeamMemberListHint, signalTeamAddMember, signalTeamRemoveMember,
signalTeamPendingRequests, and signalTeamApproveRequester; replace those English
strings with proper German translations (keeping message intent and placeholders
intact) so de.json matches other locales' semantics and message keys (verify
spelling/formatting match other locale files and update any pluralization or
punctuation to follow German conventions).
In `@packages/i18n/src/messages/en.json`:
- Around line 179-181: Update the "title" value for the "mentionOnChatMessage"
message key to use natural English by replacing "You are mentioned on a chat
message" with "You are mentioned in a chat message"; locate the JSON object
named mentionOnChatMessage and modify its title property accordingly so the
description stays unchanged.
In `@packages/i18n/src/messages/es.json`:
- Around line 1990-2002: The Spanish locale contains English literals for the
new Signal Team messages; update the translations in the es.json entries for
keys composerLockedPlaceholder, signalTeamInteractionRestricted,
signalTeamBannerReadOnly, signalTeamRequestAccess, signalTeamRequestPending,
signalTeamManageTitle, signalTeamManageOpen, signalTeamManageClose,
signalTeamMemberListHint, signalTeamAddMember, signalTeamRemoveMember,
signalTeamPendingRequests, and signalTeamApproveRequester with proper Spanish
strings that match the tone and punctuation of the existing locale (e.g., "Only
selected team members can interact in this thread." → "Solo los miembros
seleccionados del equipo pueden participar en este hilo."). Ensure
pluralization/verb forms and capitalization follow other messages in es.json and
keep JSON syntax unchanged.
In `@packages/i18n/src/messages/fr.json`:
- Around line 1990-2003: The listed i18n keys (composerLockedPlaceholder,
signalTeamInteractionRestricted, signalTeamBannerReadOnly,
signalTeamRequestAccess, signalTeamRequestPending, signalTeamManageTitle,
signalTeamManageOpen, signalTeamManageClose, signalTeamMemberListHint,
signalTeamAddMember, signalTeamRemoveMember, signalTeamPendingRequests,
signalTeamApproveRequester, mentionInboxTitle) in
packages/i18n/src/messages/fr.json are still in English; replace each value with
the correct French translations consistent with other locales and the UI copy,
and verify all these keys exactly match the corresponding keys in other locale
files so no keys are missing or misnamed. Ensure translations preserve intent
(e.g., “Request to be included” → appropriate French phrasing) and re-run any
i18n validation scripts to confirm consistency across locales.
In `@packages/i18n/src/messages/pt.json`:
- Around line 1990-2002: The Portuguese locale file contains several
untranslated Signal Team strings; update the pt.json entries for
composerLockedPlaceholder, signalTeamInteractionRestricted,
signalTeamBannerReadOnly, signalTeamRequestAccess, signalTeamRequestPending,
signalTeamManageTitle, signalTeamManageOpen, signalTeamManageClose,
signalTeamMemberListHint, signalTeamAddMember, signalTeamRemoveMember,
signalTeamPendingRequests, and signalTeamApproveRequester by providing accurate
Portuguese translations for each key while keeping the exact message keys and
surrounding punctuation unchanged so the locale remains consistent with other
language files.
In `@packages/notifications/src/actions/notify-chat-mention.ts`:
- Around line 23-25: The current guard in notify-chat-mention.ts only checks
that authToken is non-empty (authToken) but does not actually validate it;
update the authentication step in the notifyChatMention function (or the
top-level export that processes mentions) to verify the token against the
trusted auth service or server-side context (call your existing verifyAuthToken
/ validateToken function or perform a remote auth check) and reject if
verification fails; replace the simple presence check with a real verification
call, log/throw a descriptive error when verification returns false, and ensure
downstream code only runs when the token is confirmed valid.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: bc99d53c-2fe3-44dd-bc3c-3056ec5b4d30
📒 Files selected for processing (12)
docs/requirements/Features/chat-mentions-notifications-discord-parity/requirements.mdpackages/epics/src/common/human-chat-panel/human-chat-panel-chat-bar.tsxpackages/epics/src/common/human-right-panel.tsxpackages/epics/src/notifications/components/notification-centre-form.tsxpackages/i18n/src/messages/de.jsonpackages/i18n/src/messages/en.jsonpackages/i18n/src/messages/es.jsonpackages/i18n/src/messages/fr.jsonpackages/i18n/src/messages/pt.jsonpackages/notifications/src/actions/notify-chat-mention.test.tspackages/notifications/src/actions/notify-chat-mention.tspackages/notifications/src/actions/notify-chat-mention.utils.ts
Restrict signal-thread mentions to selected team members and route non-team call attempts through request-to-join so team members can approve access in-thread.
Replace the onboarding adventure subtitle copy with the new vision-focused message in all supported locales.
Reset ordered list indices in section 11 user stories and implementation slices to satisfy markdownlint MD029.
Restore type/priority badges and time/message metadata to the card body so the image header stays clean and tags remain readable.
Remove heavy dark image overlays while expanding priority tint coverage, slightly increase signal image height, and render loaded signals in a single grid so second-row gaps collapse correctly.
Switch signal card footer actions to accent outline with transparent background so call-to-action emphasis stays clear without heavy full-surface color fill.
Render the same icon language used in the new signal form inside signal-card type and priority badges to improve scanability and visual consistency.
Move type/priority badges beside the time/comment metadata row, slightly increase image height, and soften full-surface priority blending while improving icon contrast for better readability.
Keep signal-card type and priority labels readable by restoring foreground text while preserving semantic icon colors through explicit icon-class support in badges.
Move edit/archive controls out of absolute positioning and into the title row layout to keep consistent alignment and prevent overlap with metadata and badges.
…rship Improve signal cards with richer creator identity cues and auto-seed new signal threads with all available members so team-scoped interactions are enabled by default. Co-authored-by: Cursor <cursoragent@cursor.com>
Batch signal-team membership edits while the panel is open and emit a single update message on Done that names added and removed members. Co-authored-by: Cursor <cursoragent@cursor.com>
Make the board tag picker's All tags action reliably clickable in dialog focus traps and normalize board select field heights to match standard input sizing. Co-authored-by: Cursor <cursoragent@cursor.com>
Harden signal-team state derivation to ignore spoofable marker messages from untrusted senders and persist owner identity explicitly in team update events. Co-authored-by: Cursor <cursoragent@cursor.com>
Validate mention notification auth tokens with Privy before processing recipients so downstream notification delivery only runs for trusted callers. Co-authored-by: Cursor <cursoragent@cursor.com>
Replace signal-team m.room.message payload any-casts with an explicit typed event content shape for safer sendEvent usage. Co-authored-by: Cursor <cursoragent@cursor.com>
Replace block-in-inline markup in the mention consent row to avoid div-inside-span nesting warnings while preserving layout and behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
Refine the English onboarding subtitle wording to use natural action-oriented phrasing. Co-authored-by: Cursor <cursoragent@cursor.com>
Adjust signal-team event typing and apply formatting updates so the epics typecheck and main format check jobs pass on PR CI. Co-authored-by: Cursor <cursoragent@cursor.com>
Type signal-team payloads as RoomMessageEventContent extensions so custom metadata remains typed without violating sendEvent content constraints. Co-authored-by: Cursor <cursoragent@cursor.com>
|
@CodeRabbit please review |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 32543 🏁 Script executed: Length of output: 6388 🏁 Script executed: Length of output: 478 🏁 Script executed: Length of output: 15649
Overall AssessmentThe core notification pipeline ( 1. 🐛 Actor self-notification when
|
| Area | Status |
|---|---|
sendResult.eventId gating before notifyChatMention dispatch |
✅ |
Deep link built from canonical spaceSlug |
✅ |
escapeHtml + getSafeMentionHref in email body |
✅ |
Promise.allSettled + partial failure surfacing |
✅ |
TAG_MENTION_CONSENT: 'true' required-tags contract |
✅ |
mentionNotificationsConsent init/reset/save round-trip |
✅ |
All 5 locales have mentionOnChatMessage.title / .description |
✅ |
onScrollTargetNotFound per-eventId guard + miss-count threshold |
✅ |
composerLocked gating for canSend, pushDrafts, drag-drop |
✅ |
Unit tests for sanitizeMentionIds and buildMentionEmailBody |
✅ |
🐇
Apply CodeRabbit feedback to provide screen-reader context for signal card message counts while keeping visual output unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
Address CodeRabbit i18n feedback by replacing hardcoded resize handle aria/title copy with translation keys. Co-authored-by: Cursor <cursoragent@cursor.com>
Apply CodeRabbit feedback so mention candidate recomputation is triggered for both thread and parent space room membership updates. Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve CodeRabbit feedback by translating leftover English strings in OnboardingAdventure.aiHero for Portuguese users. Co-authored-by: Cursor <cursoragent@cursor.com>
Apply CodeRabbit feedback by using a null SWR key until endpoint and jwt exist, preventing unnecessary refresh loops. Co-authored-by: Cursor <cursoragent@cursor.com>
Apply CodeRabbit feedback by rendering the onboarding hero title from next-intl and removing hardcoded English heading fragments. Co-authored-by: Cursor <cursoragent@cursor.com>
Apply CodeRabbit accessibility feedback by running the standard axe-core check in the space-context ecosystem logo scenario. Co-authored-by: Cursor <cursoragent@cursor.com>
Repair the onboarding adventure component after misapplied branch transfer changes so web typecheck passes again.
Bring back the missing signal card metadata row so type, priority, and creator are consistently visible after recent layout refactors. Co-authored-by: Cursor <cursoragent@cursor.com>
…check" This reverts commit c3a8e4f.
Summary
Test plan
saveConfigurationsand reloads from OneSignal tagsen,de,fr,es, andptMade with Cursor
Summary by CodeRabbit