X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-main%2Fusers%2Fuser-notification.model.ts;h=96e7b4dd04430a5dbac9ab4d505c9185dbb5b24e;hb=dec437aa46a644fb1b3cedc9afe4503c44e15308;hp=389a242fd1a429e80f1d37f1dcaed238dee8f3b3;hpb=d95d15598847c7f020aa056e7e6e0c02d2bbf732;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-main/users/user-notification.model.ts b/client/src/app/shared/shared-main/users/user-notification.model.ts index 389a242fd..96e7b4dd0 100644 --- a/client/src/app/shared/shared-main/users/user-notification.model.ts +++ b/client/src/app/shared/shared-main/users/user-notification.model.ts @@ -1,5 +1,19 @@ -import { Actor } from '../account/actor.model' -import { ActorInfo, Avatar, FollowState, UserNotification as UserNotificationServer, UserNotificationType, VideoInfo } from '@shared/models' +import { AuthUser } from '@app/core' +import { Account } from '@app/shared/shared-main/account/account.model' +import { Actor } from '@app/shared/shared-main/account/actor.model' +import { VideoChannel } from '@app/shared/shared-main/video-channel/video-channel.model' +import { logger } from '@root-helpers/logger' +import { + AbuseState, + ActorInfo, + FollowState, + PluginType, + UserNotification as UserNotificationServer, + UserNotificationType, + UserRight, + VideoInfo +} from '@shared/models' +import { Video } from '../video' export class UserNotification implements UserNotificationServer { id: number @@ -27,15 +41,14 @@ export class UserNotification implements UserNotificationServer { abuse?: { id: number + state: AbuseState video?: VideoInfo comment?: { threadId: number - video: { - uuid: string - } + video: VideoInfo } account?: ActorInfo @@ -60,20 +73,48 @@ export class UserNotification implements UserNotificationServer { } } + plugin?: { + name: string + type: PluginType + latestVersion: string + } + + peertube?: { + latestVersion: string + } + + registration?: { + id: number + username: string + } + createdAt: string updatedAt: string // Additional fields videoUrl?: string commentUrl?: any[] + abuseUrl?: string + abuseQueryParams?: { [id: string]: string } = {} + videoAutoBlacklistUrl?: string + accountUrl?: string + + registrationsUrl?: string + videoImportIdentifier?: string videoImportUrl?: string + instanceFollowUrl?: string - constructor (hash: UserNotificationServer) { + peertubeVersionLink?: string + + pluginUrl?: string + pluginQueryParams?: { [id: string]: string } = {} + + constructor (hash: UserNotificationServer, user: AuthUser) { this.id = hash.id this.type = hash.type this.read = hash.read @@ -82,22 +123,26 @@ export class UserNotification implements UserNotificationServer { // 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) + if (this.video) this.setVideoChannelAvatarUrl(this.video.channel) this.videoImport = hash.videoImport this.comment = hash.comment - if (this.comment) this.setAvatarUrl(this.comment.account) + if (this.comment) this.setAccountAvatarUrl(this.comment.account) this.abuse = hash.abuse this.videoBlacklist = hash.videoBlacklist this.account = hash.account - if (this.account) this.setAvatarUrl(this.account) + if (this.account) this.setAccountAvatarUrl(this.account) this.actorFollow = hash.actorFollow - if (this.actorFollow) this.setAvatarUrl(this.actorFollow.follower) + if (this.actorFollow) this.setAccountAvatarUrl(this.actorFollow.follower) + + this.plugin = hash.plugin + this.peertube = hash.peertube + this.registration = hash.registration this.createdAt = hash.createdAt this.updatedAt = hash.updatedAt @@ -115,13 +160,28 @@ export class UserNotification implements UserNotificationServer { case UserNotificationType.COMMENT_MENTION: if (!this.comment) break this.accountUrl = this.buildAccountUrl(this.comment.account) - this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ] + this.commentUrl = this.buildCommentUrl(this.comment) break - case UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS: + case UserNotificationType.NEW_ABUSE_FOR_MODERATORS: this.abuseUrl = '/admin/moderation/abuses/list' + this.abuseQueryParams.search = '#' + this.abuse.id if (this.abuse.video) this.videoUrl = this.buildVideoUrl(this.abuse.video) + else if (this.abuse.comment) this.commentUrl = this.buildCommentUrl(this.abuse.comment) + else if (this.abuse.account) this.accountUrl = this.buildAccountUrl(this.abuse.account) + break + + case UserNotificationType.ABUSE_STATE_CHANGE: + this.abuseUrl = '/my-account/abuses' + this.abuseQueryParams.search = '#' + this.abuse.id + break + + case UserNotificationType.ABUSE_NEW_MESSAGE: + this.abuseUrl = user.hasRight(UserRight.MANAGE_ABUSES) + ? '/admin/moderation/abuses/list' + : '/my-account/abuses' + this.abuseQueryParams.search = '#' + this.abuse.id break case UserNotificationType.VIDEO_AUTO_BLACKLIST_FOR_MODERATORS: @@ -156,6 +216,10 @@ export class UserNotification implements UserNotificationServer { this.accountUrl = this.buildAccountUrl(this.account) break + case UserNotificationType.NEW_USER_REGISTRATION_REQUEST: + this.registrationsUrl = '/admin/moderation/registrations/list' + break + case UserNotificationType.NEW_FOLLOW: this.accountUrl = this.buildAccountUrl(this.actorFollow.follower) break @@ -167,30 +231,51 @@ export class UserNotification implements UserNotificationServer { case UserNotificationType.AUTO_INSTANCE_FOLLOWING: this.instanceFollowUrl = '/admin/follows/following-list' break + + case UserNotificationType.NEW_PEERTUBE_VERSION: + this.peertubeVersionLink = 'https://joinpeertube.org/news' + break + + case UserNotificationType.NEW_PLUGIN_VERSION: + this.pluginUrl = `/admin/plugins/list-installed` + this.pluginQueryParams.pluginType = this.plugin.type + '' + break + + case UserNotificationType.MY_VIDEO_STUDIO_EDITION_FINISHED: + this.videoUrl = this.buildVideoUrl(this.video) + break } } catch (err) { this.type = null - console.error(err) + logger.error(err) } } private buildVideoUrl (video: { uuid: string }) { - return '/videos/watch/' + video.uuid + return Video.buildWatchUrl(video) } private buildAccountUrl (account: { name: string, host: string }) { - return '/accounts/' + Actor.CREATE_BY_STRING(account.name, account.host) + return '/a/' + Actor.CREATE_BY_STRING(account.name, account.host) } private buildVideoImportUrl () { - return '/my-account/video-imports' + return '/my-library/video-imports' } private buildVideoImportIdentifier (videoImport: { targetUrl?: string, magnetUri?: string, torrentName?: string }) { return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName } - private setAvatarUrl (actor: { avatarUrl?: string, avatar?: { url?: string, path: string } }) { - actor.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(actor) + private buildCommentUrl (comment: { video: { uuid: string }, threadId: number }) { + return [ this.buildVideoUrl(comment.video), { threadId: comment.threadId } ] + } + + private setAccountAvatarUrl (actor: { avatarUrl?: string, avatars: { width: number, url?: string, path: string }[] }) { + actor.avatarUrl = VideoChannel.GET_ACTOR_AVATAR_URL(actor, 48) || Account.GET_DEFAULT_AVATAR_URL(48) + } + + private setVideoChannelAvatarUrl (actor: { avatarUrl?: string, avatars: { width: number, url?: string, path: string }[] }) { + actor.avatarUrl = VideoChannel.GET_ACTOR_AVATAR_URL(actor, 48) || VideoChannel.GET_DEFAULT_AVATAR_URL(48) } }