-import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo } from '../../../../../shared'
+import { ActorInfo, FollowState, UserNotification as UserNotificationServer, UserNotificationType, VideoInfo } from '../../../../../shared'
+import { Actor } from '@app/shared/actor/actor.model'
export class UserNotification implements UserNotificationServer {
id: number
read: boolean
video?: VideoInfo & {
- channel: {
- id: number
- displayName: string
- }
+ channel: ActorInfo & { avatarUrl?: string }
}
videoImport?: {
comment?: {
id: number
threadId: number
- account: {
- id: number
- displayName: string
- }
+ account: ActorInfo & { avatarUrl?: string }
video: VideoInfo
}
video: VideoInfo
}
- account?: {
- id: number
- displayName: string
- name: string
- }
+ account?: ActorInfo & { avatarUrl?: string }
actorFollow?: {
id: number
- follower: {
- name: string
- displayName: string
- }
+ state: FollowState
+ follower: ActorInfo & { avatarUrl?: string }
following: {
- type: 'account' | 'channel'
+ type: 'account' | 'channel' | 'instance'
name: string
displayName: string
+ host: string
}
}
videoUrl?: string
commentUrl?: any[]
videoAbuseUrl?: string
+ videoAutoBlacklistUrl?: string
accountUrl?: string
videoImportIdentifier?: string
videoImportUrl?: string
+ instanceFollowUrl?: string
constructor (hash: UserNotificationServer) {
this.id = hash.id
this.type = hash.type
this.read = hash.read
- this.video = hash.video
- this.videoImport = hash.videoImport
- this.comment = hash.comment
- this.videoAbuse = hash.videoAbuse
- this.videoBlacklist = hash.videoBlacklist
- this.account = hash.account
- this.actorFollow = hash.actorFollow
-
- this.createdAt = hash.createdAt
- this.updatedAt = hash.updatedAt
-
- switch (this.type) {
- case UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION:
- this.videoUrl = this.buildVideoUrl(this.video)
- break
-
- case UserNotificationType.UNBLACKLIST_ON_MY_VIDEO:
- this.videoUrl = this.buildVideoUrl(this.video)
- break
-
- case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO:
- case UserNotificationType.COMMENT_MENTION:
- this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ]
- break
-
- case UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS:
- this.videoAbuseUrl = '/admin/moderation/video-abuses/list'
- this.videoUrl = this.buildVideoUrl(this.videoAbuse.video)
- break
-
- case UserNotificationType.BLACKLIST_ON_MY_VIDEO:
- this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video)
- break
-
- case UserNotificationType.MY_VIDEO_PUBLISHED:
- this.videoUrl = this.buildVideoUrl(this.video)
- break
-
- case UserNotificationType.MY_VIDEO_IMPORT_SUCCESS:
- this.videoImportUrl = this.buildVideoImportUrl()
- this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
- this.videoUrl = this.buildVideoUrl(this.videoImport.video)
- break
-
- case UserNotificationType.MY_VIDEO_IMPORT_ERROR:
- this.videoImportUrl = this.buildVideoImportUrl()
- this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
- break
-
- case UserNotificationType.NEW_USER_REGISTRATION:
- this.accountUrl = this.buildAccountUrl(this.account)
- break
-
- case UserNotificationType.NEW_FOLLOW:
- this.accountUrl = this.buildAccountUrl(this.actorFollow.follower)
- break
+ // We assume that some fields exist
+ // To prevent a notification popup crash in case of bug, wrap it inside a try/catch
+ try {
+ this.video = hash.video
+ if (this.video) this.setAvatarUrl(this.video.channel)
+
+ this.videoImport = hash.videoImport
+
+ this.comment = hash.comment
+ if (this.comment) this.setAvatarUrl(this.comment.account)
+
+ this.videoAbuse = hash.videoAbuse
+
+ this.videoBlacklist = hash.videoBlacklist
+
+ this.account = hash.account
+ if (this.account) this.setAvatarUrl(this.account)
+
+ this.actorFollow = hash.actorFollow
+ if (this.actorFollow) this.setAvatarUrl(this.actorFollow.follower)
+
+ this.createdAt = hash.createdAt
+ this.updatedAt = hash.updatedAt
+
+ switch (this.type) {
+ case UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION:
+ this.videoUrl = this.buildVideoUrl(this.video)
+ break
+
+ case UserNotificationType.UNBLACKLIST_ON_MY_VIDEO:
+ this.videoUrl = this.buildVideoUrl(this.video)
+ break
+
+ case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO:
+ case UserNotificationType.COMMENT_MENTION:
+ this.accountUrl = this.buildAccountUrl(this.comment.account)
+ this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ]
+ break
+
+ case UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS:
+ this.videoAbuseUrl = '/admin/moderation/video-abuses/list'
+ this.videoUrl = this.buildVideoUrl(this.videoAbuse.video)
+ break
+
+ case UserNotificationType.VIDEO_AUTO_BLACKLIST_FOR_MODERATORS:
+ this.videoAutoBlacklistUrl = '/admin/moderation/video-auto-blacklist/list'
+ // Backward compatibility where we did not assign videoBlacklist to this type of notification before
+ if (!this.videoBlacklist) this.videoBlacklist = { id: null, video: this.video }
+
+ this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video)
+ break
+
+ case UserNotificationType.BLACKLIST_ON_MY_VIDEO:
+ this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video)
+ break
+
+ case UserNotificationType.MY_VIDEO_PUBLISHED:
+ this.videoUrl = this.buildVideoUrl(this.video)
+ break
+
+ case UserNotificationType.MY_VIDEO_IMPORT_SUCCESS:
+ this.videoImportUrl = this.buildVideoImportUrl()
+ this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
+
+ if (this.videoImport.video) this.videoUrl = this.buildVideoUrl(this.videoImport.video)
+ break
+
+ case UserNotificationType.MY_VIDEO_IMPORT_ERROR:
+ this.videoImportUrl = this.buildVideoImportUrl()
+ this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
+ break
+
+ case UserNotificationType.NEW_USER_REGISTRATION:
+ this.accountUrl = this.buildAccountUrl(this.account)
+ break
+
+ case UserNotificationType.NEW_FOLLOW:
+ this.accountUrl = this.buildAccountUrl(this.actorFollow.follower)
+ break
+
+ case UserNotificationType.NEW_INSTANCE_FOLLOWER:
+ this.instanceFollowUrl = '/admin/follows/followers-list'
+ break
+
+ case UserNotificationType.AUTO_INSTANCE_FOLLOWING:
+ this.instanceFollowUrl = '/admin/follows/following-list'
+ break
+ }
+ } catch (err) {
+ this.type = null
+ console.error(err)
}
}
return '/videos/watch/' + video.uuid
}
- private buildAccountUrl (account: { name: string }) {
- return '/accounts/' + account.name
+ private buildAccountUrl (account: { name: string, host: string }) {
+ return '/accounts/' + Actor.CREATE_BY_STRING(account.name, account.host)
}
private buildVideoImportUrl () {
return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName
}
+ private setAvatarUrl (actor: { avatarUrl?: string, avatar?: { path: string } }) {
+ actor.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(actor)
+ }
}