[web] add preferences to control all implemented notifications (#33320)

* feat: add granular controls for other features
* feat: add filtering to notifications that were missing them
* refactor: rm duplicate thread fetches
* fix: reduce permissions to fit spec (all === new comments/tracked changes, replies === only if also a participant)
* fix: include mentions in types

GitOrigin-RevId: b4a09ef59e5cf4de2e07d5b9a13c31fc1cf81a31
This commit is contained in:
Kristina
2026-05-07 10:37:36 +02:00
committed by Copybot
parent 40954ae2dc
commit bd604063e6
2 changed files with 59 additions and 34 deletions

View File

@@ -22,36 +22,45 @@ function levelToPreferences(
switch (level) {
case 'all':
return {
trackedChangesOnOwnProject: true,
trackedChangesOnInvitedProject: true,
commentOnOwnProject: true,
commentOnInvitedProject: true,
repliesOnOwnProject: true,
repliesOnInvitedProject: true,
repliesOnAuthoredThread: true,
repliesOnParticipatingThread: true,
commentResolvedOnAuthoredThread: true,
commentResolvedOnParticipatingThread: true,
commentReopenedOnAuthoredThread: true,
commentReopenedOnParticipatingThread: true,
trackedChangesOnOwnProject: true,
trackedChangesOnInvitedProject: true,
trackChangesAcceptedOnAuthoredChange: true,
}
case 'replies':
return {
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
commentOnOwnProject: false,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: true,
repliesOnParticipatingThread: true,
commentResolvedOnAuthoredThread: true,
commentResolvedOnParticipatingThread: true,
commentReopenedOnAuthoredThread: true,
commentReopenedOnParticipatingThread: true,
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
trackChangesAcceptedOnAuthoredChange: true,
}
case 'off':
return {
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
commentOnOwnProject: false,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: false,
repliesOnParticipatingThread: false,
commentResolvedOnAuthoredThread: false,
commentResolvedOnParticipatingThread: false,
commentReopenedOnAuthoredThread: false,
commentReopenedOnParticipatingThread: false,
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
trackChangesAcceptedOnAuthoredChange: false,
}
}
}
@@ -76,15 +85,16 @@ function preferencesToLevel(
const projectTrackedChanges = isOwner
? preferences.trackedChangesOnOwnProject
: preferences.trackedChangesOnInvitedProject
const projectReplies = isOwner
? preferences.repliesOnOwnProject
: preferences.repliesOnInvitedProject
const anyProjectNotifications =
projectComments || projectTrackedChanges || projectReplies
const anyProjectNotifications = projectComments || projectTrackedChanges
const anyParticipantNotifications =
preferences.repliesOnAuthoredThread ||
preferences.repliesOnParticipatingThread
preferences.repliesOnParticipatingThread ||
preferences.trackChangesAcceptedOnAuthoredChange ||
preferences.commentResolvedOnAuthoredThread ||
preferences.commentResolvedOnParticipatingThread ||
preferences.commentReopenedOnAuthoredThread ||
preferences.commentReopenedOnParticipatingThread
if (!anyProjectNotifications && !anyParticipantNotifications) {
return 'off'

View File

@@ -9,25 +9,31 @@ import ProjectNotificationsSetting from '@/features/settings/components/editor-s
const preferencesUrl = `/notifications/preferences/project/${PROJECT_ID}`
const allNotificationsOn = {
trackedChangesOnOwnProject: true,
trackedChangesOnInvitedProject: true,
commentOnOwnProject: true,
commentOnInvitedProject: true,
repliesOnOwnProject: true,
repliesOnInvitedProject: true,
repliesOnAuthoredThread: true,
repliesOnParticipatingThread: true,
commentResolvedOnAuthoredThread: true,
commentResolvedOnParticipatingThread: true,
commentReopenedOnAuthoredThread: true,
commentReopenedOnParticipatingThread: true,
trackedChangesOnOwnProject: true,
trackedChangesOnInvitedProject: true,
trackChangesAcceptedOnAuthoredChange: true,
}
const repliesOnlyPreferences = {
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
commentOnOwnProject: false,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: true,
repliesOnParticipatingThread: true,
commentResolvedOnAuthoredThread: true,
commentResolvedOnParticipatingThread: true,
commentReopenedOnAuthoredThread: true,
commentReopenedOnParticipatingThread: true,
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
trackChangesAcceptedOnAuthoredChange: true,
}
const globallyMutedPreferences = {
@@ -35,22 +41,28 @@ const globallyMutedPreferences = {
trackedChangesOnInvitedProject: false,
commentOnOwnProject: false,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: false,
repliesOnParticipatingThread: false,
muteAllNotifications: true,
commentResolvedOnAuthoredThread: false,
commentResolvedOnParticipatingThread: false,
commentReopenedOnAuthoredThread: false,
commentReopenedOnParticipatingThread: false,
trackChangesAcceptedOnAuthoredChange: false,
}
const allNotificationsOff = {
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
commentOnOwnProject: false,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: false,
repliesOnParticipatingThread: false,
commentResolvedOnAuthoredThread: false,
commentResolvedOnParticipatingThread: false,
commentReopenedOnAuthoredThread: false,
commentReopenedOnParticipatingThread: false,
trackedChangesOnOwnProject: false,
trackedChangesOnInvitedProject: false,
trackChangesAcceptedOnAuthoredChange: false,
}
const defaultPreferences = {
@@ -58,11 +70,14 @@ const defaultPreferences = {
trackedChangesOnInvitedProject: false,
commentOnOwnProject: true,
commentOnInvitedProject: false,
repliesOnOwnProject: false,
repliesOnInvitedProject: false,
repliesOnAuthoredThread: true,
repliesOnParticipatingThread: true,
muteAllNotifications: false,
commentResolvedOnAuthoredThread: true,
commentResolvedOnParticipatingThread: true,
commentReopenedOnAuthoredThread: true,
commentReopenedOnParticipatingThread: true,
trackChangesAcceptedOnAuthoredChange: true,
}
function renderComponent(props: { permissionsLevel?: string } = {}) {