First implem global search
[oweals/peertube.git] / client / src / app / shared / actor / actor.model.ts
1 import { Actor as ActorServer } from '../../../../../shared/models/actors/actor.model'
2 import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
3 import { getAbsoluteAPIUrl } from '@app/shared/misc/utils'
4
5 export abstract class Actor implements ActorServer {
6   id: number
7   url: string
8   name: string
9   host: string
10   followingCount: number
11   followersCount: number
12   createdAt: Date | string
13   updatedAt: Date | string
14   avatar: Avatar
15
16   avatarUrl: string
17
18   static GET_ACTOR_AVATAR_URL (actor: { avatar?: Avatar }) {
19     if (actor?.avatar?.url) return actor.avatar.url
20
21     if (actor && actor.avatar) {
22       const absoluteAPIUrl = getAbsoluteAPIUrl()
23
24       return absoluteAPIUrl + actor.avatar.path
25     }
26
27     return this.GET_DEFAULT_AVATAR_URL()
28   }
29
30   static GET_DEFAULT_AVATAR_URL () {
31     return window.location.origin + '/client/assets/images/default-avatar.png'
32   }
33
34   static CREATE_BY_STRING (accountName: string, host: string, forceHostname = false) {
35     const absoluteAPIUrl = getAbsoluteAPIUrl()
36     const thisHost = new URL(absoluteAPIUrl).host
37
38     if (host.trim() === thisHost && !forceHostname) return accountName
39
40     return accountName + '@' + host
41   }
42
43   protected constructor (hash: ActorServer) {
44     this.id = hash.id
45     this.url = hash.url
46     this.name = hash.name
47     this.host = hash.host
48     this.followingCount = hash.followingCount
49     this.followersCount = hash.followersCount
50     this.createdAt = new Date(hash.createdAt.toString())
51     this.updatedAt = new Date(hash.updatedAt.toString())
52     this.avatar = hash.avatar
53
54     this.updateComputedAttributes()
55   }
56
57   updateAvatar (newAvatar: Avatar) {
58     this.avatar = newAvatar
59
60     this.updateComputedAttributes()
61   }
62
63   private updateComputedAttributes () {
64     this.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(this)
65   }
66 }