]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
Improve notification settings UI
[github/Chocobozzz/PeerTube.git] / client / src / app / +my-account / my-account-settings / my-account-notification-preferences / my-account-notification-preferences.component.ts
index 519bdfab4fb8055c567de22012b8d22c401bc6a9..09da979ab4d404b4beb909164bd08ae9bcbb635b 100644 (file)
@@ -1,11 +1,9 @@
-import { Component, Input, OnInit } from '@angular/core'
-import { User } from '@app/shared'
-import { I18n } from '@ngx-translate/i18n-polyfill'
-import { Subject } from 'rxjs'
-import { UserNotificationSetting, UserNotificationSettingValue, UserRight } from '../../../../../../shared'
-import { Notifier, ServerService } from '@app/core'
 import { debounce } from 'lodash-es'
-import { UserNotificationService } from '@app/shared/users/user-notification.service'
+import { Subject } from 'rxjs'
+import { Component, Input, OnInit } from '@angular/core'
+import { Notifier, ServerService, User } from '@app/core'
+import { UserNotificationService } from '@app/shared/shared-main'
+import { UserNotificationSetting, UserNotificationSettingValue, UserRight } from '@shared/models'
 
 @Component({
   selector: 'my-account-notification-preferences',
@@ -13,46 +11,98 @@ import { UserNotificationService } from '@app/shared/users/user-notification.ser
   styleUrls: [ './my-account-notification-preferences.component.scss' ]
 })
 export class MyAccountNotificationPreferencesComponent implements OnInit {
-  @Input() user: User = null
+  @Input() user: User
   @Input() userInformationLoaded: Subject<any>
 
-  notificationSettingKeys: (keyof UserNotificationSetting)[] = []
-  emailNotifications: { [ id in keyof UserNotificationSetting ]: boolean } = {} as any
-  webNotifications: { [ id in keyof UserNotificationSetting ]: boolean } = {} as any
-  labelNotifications: { [ id in keyof UserNotificationSetting ]: string } = {} as any
-  rightNotifications: { [ id in keyof Partial<UserNotificationSetting> ]: UserRight } = {} as any
-  emailEnabled: boolean
+  notificationSettingGroups: { label: string, keys: (keyof UserNotificationSetting)[] }[] = []
+  emailNotifications: { [ id in keyof UserNotificationSetting ]?: boolean } = {}
+  webNotifications: { [ id in keyof UserNotificationSetting ]?: boolean } = {}
+  labelNotifications: { [ id in keyof UserNotificationSetting ]?: string } = {}
+  rightNotifications: { [ id in keyof Partial<UserNotificationSetting> ]?: UserRight } = {}
+  emailEnabled = false
 
   private savePreferences = debounce(this.savePreferencesImpl.bind(this), 500)
 
   constructor (
-    private i18n: I18n,
     private userNotificationService: UserNotificationService,
     private serverService: ServerService,
     private notifier: Notifier
   ) {
     this.labelNotifications = {
-      newVideoFromSubscription: this.i18n('New video from your subscriptions'),
-      newCommentOnMyVideo: this.i18n('New comment on your video'),
-      videoAbuseAsModerator: this.i18n('New video abuse on local video'),
-      blacklistOnMyVideo: this.i18n('One of your video is blacklisted/unblacklisted'),
-      myVideoPublished: this.i18n('Video published (after transcoding/scheduled update)'),
-      myVideoImportFinished: this.i18n('Video import finished'),
-      newUserRegistration: this.i18n('A new user registered on your instance'),
-      newFollow: this.i18n('You or your channel(s) has a new follower'),
-      commentMention: this.i18n('Someone mentioned you in video comments')
+      newVideoFromSubscription: $localize`New video from your subscriptions`,
+      newCommentOnMyVideo: $localize`New comment on your video`,
+      abuseAsModerator: $localize`New abuse`,
+      videoAutoBlacklistAsModerator: $localize`An automatically blocked video is awaiting review`,
+      blacklistOnMyVideo: $localize`One of your video is blocked/unblocked`,
+      myVideoPublished: $localize`Video published (after transcoding/scheduled update)`,
+      myVideoImportFinished: $localize`Video import finished`,
+      newUserRegistration: $localize`A new user registered on your instance`,
+      newFollow: $localize`You or your channel(s) has a new follower`,
+      commentMention: $localize`Someone mentioned you in video comments`,
+      newInstanceFollower: $localize`Your instance has a new follower`,
+      autoInstanceFollowing: $localize`Your instance automatically followed another instance`,
+      abuseNewMessage: $localize`An abuse report received a new message`,
+      abuseStateChange: $localize`One of your abuse reports has been accepted or rejected by moderators`,
+      newPeerTubeVersion: $localize`A new PeerTube version is available`,
+      newPluginVersion: $localize`One of your plugin/theme has a new available version`
     }
-    this.notificationSettingKeys = Object.keys(this.labelNotifications) as (keyof UserNotificationSetting)[]
+    this.notificationSettingGroups = [
+      {
+        label: $localize`Social`,
+        keys: [
+          'newVideoFromSubscription',
+          'newFollow',
+          'commentMention'
+        ]
+      },
+
+      {
+        label: $localize`Your videos`,
+        keys: [
+          'newCommentOnMyVideo',
+          'blacklistOnMyVideo',
+          'myVideoPublished',
+          'myVideoImportFinished'
+        ]
+      },
+
+      {
+        label: $localize`Moderation`,
+        keys: [
+          'abuseStateChange',
+          'abuseNewMessage',
+          'abuseAsModerator',
+          'videoAutoBlacklistAsModerator'
+        ]
+      },
+
+      {
+        label: $localize`Administration`,
+        keys: [
+          'newUserRegistration',
+          'newInstanceFollower',
+          'autoInstanceFollowing',
+          'newPeerTubeVersion',
+          'newPluginVersion'
+        ]
+      }
+    ]
 
     this.rightNotifications = {
-      videoAbuseAsModerator: UserRight.MANAGE_VIDEO_ABUSES,
-      newUserRegistration: UserRight.MANAGE_USERS
+      abuseAsModerator: UserRight.MANAGE_ABUSES,
+      videoAutoBlacklistAsModerator: UserRight.MANAGE_VIDEO_BLACKLIST,
+      newUserRegistration: UserRight.MANAGE_USERS,
+      newInstanceFollower: UserRight.MANAGE_SERVER_FOLLOW,
+      autoInstanceFollowing: UserRight.MANAGE_CONFIGURATION,
+      newPeerTubeVersion: UserRight.MANAGE_DEBUG,
+      newPluginVersion: UserRight.MANAGE_DEBUG
     }
-
-    this.emailEnabled = this.serverService.getConfig().email.enabled
   }
 
   ngOnInit () {
+    const serverConfig = this.serverService.getHTMLConfig()
+    this.emailEnabled = serverConfig.email.enabled
+
     this.userInformationLoaded.subscribe(() => this.loadNotificationSettings())
   }
 
@@ -78,14 +128,14 @@ export class MyAccountNotificationPreferencesComponent implements OnInit {
   }
 
   private savePreferencesImpl () {
-    this.userNotificationService.updateNotificationSettings(this.user, this.user.notificationSettings)
-      .subscribe(
-        () => {
-          this.notifier.success(this.i18n('Preferences saved'), undefined, 2000)
+    this.userNotificationService.updateNotificationSettings(this.user.notificationSettings)
+      .subscribe({
+        next: () => {
+          this.notifier.success($localize`Preferences saved`, undefined, 2000)
         },
 
-        err => this.notifier.error(err.message)
-      )
+        error: err => this.notifier.error(err.message)
+      })
   }
 
   private loadNotificationSettings () {