diff options
author | Chocobozzz <me@florianbigard.com> | 2023-02-13 14:27:35 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2023-02-13 14:27:48 +0100 |
commit | 57d64f30e30b57ba5dc035fcaf38895d775412bd (patch) | |
tree | 596f3f416576598be4d1b640d54df0de401b2ce5 /client | |
parent | 587aa74ac3d8f2e1fdd8754d60c7a8c38ce30b88 (diff) | |
download | PeerTube-57d64f30e30b57ba5dc035fcaf38895d775412bd.tar.gz PeerTube-57d64f30e30b57ba5dc035fcaf38895d775412bd.tar.zst PeerTube-57d64f30e30b57ba5dc035fcaf38895d775412bd.zip |
Improve channel's avatar display performance
Diffstat (limited to 'client')
3 files changed, 52 insertions, 0 deletions
diff --git a/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts index 59814a93d..631444398 100644 --- a/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts +++ b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts | |||
@@ -5,6 +5,7 @@ import { ComponentPagination, hasMoreItems, MarkdownService, User, UserService } | |||
5 | import { Account, AccountService, Video, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main' | 5 | import { Account, AccountService, Video, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main' |
6 | import { MiniatureDisplayOptions } from '@app/shared/shared-video-miniature' | 6 | import { MiniatureDisplayOptions } from '@app/shared/shared-video-miniature' |
7 | import { NSFWPolicyType, VideoSortField } from '@shared/models' | 7 | import { NSFWPolicyType, VideoSortField } from '@shared/models' |
8 | import { SimpleMemoize } from '@app/helpers' | ||
8 | 9 | ||
9 | @Component({ | 10 | @Component({ |
10 | selector: 'my-account-video-channels', | 11 | selector: 'my-account-video-channels', |
@@ -145,6 +146,7 @@ export class AccountVideoChannelsComponent implements OnInit, OnDestroy { | |||
145 | this.loadMoreChannels() | 146 | this.loadMoreChannels() |
146 | } | 147 | } |
147 | 148 | ||
149 | @SimpleMemoize() | ||
148 | getVideoChannelLink (videoChannel: VideoChannel) { | 150 | getVideoChannelLink (videoChannel: VideoChannel) { |
149 | return [ '/c', videoChannel.nameWithHost ] | 151 | return [ '/c', videoChannel.nameWithHost ] |
150 | } | 152 | } |
diff --git a/client/src/app/helpers/utils/index.ts b/client/src/app/helpers/utils/index.ts index f821985c9..afa8f8f5c 100644 --- a/client/src/app/helpers/utils/index.ts +++ b/client/src/app/helpers/utils/index.ts | |||
@@ -2,6 +2,7 @@ export * from './channel' | |||
2 | export * from './date' | 2 | export * from './date' |
3 | export * from './html' | 3 | export * from './html' |
4 | export * from './object' | 4 | export * from './object' |
5 | export * from './simple-memoize' | ||
5 | export * from './dom' | 6 | export * from './dom' |
6 | export * from './upload' | 7 | export * from './upload' |
7 | export * from './url' | 8 | export * from './url' |
diff --git a/client/src/app/helpers/utils/simple-memoize.ts b/client/src/app/helpers/utils/simple-memoize.ts new file mode 100644 index 000000000..e8292793f --- /dev/null +++ b/client/src/app/helpers/utils/simple-memoize.ts | |||
@@ -0,0 +1,49 @@ | |||
1 | /** | ||
2 | * | ||
3 | * Simple memoize only support methods that accept 0 or 1 argument | ||
4 | * You can easily use it adding @SimpleMemoize just above the method name | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | export function SimpleMemoize () { | ||
9 | const store = new Map() | ||
10 | |||
11 | return (_target: object, _propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => { | ||
12 | if (descriptor.value != null) { | ||
13 | descriptor.value = getNewFunction(descriptor.value, store) | ||
14 | return | ||
15 | } | ||
16 | |||
17 | throw new Error('Only put a Memoize() decorator on a method accessor.') | ||
18 | } | ||
19 | } | ||
20 | |||
21 | function getNewFunction (originalMethod: () => void, store: Map<any, any>) { | ||
22 | return function (this: any, ...args: any[]) { | ||
23 | if (args.length > 1) { | ||
24 | throw new Error('Simple memoize only support 0 or 1 argument') | ||
25 | } | ||
26 | |||
27 | let returnedValue: any | ||
28 | |||
29 | if (args.length > 0) { | ||
30 | const hashKey = args[0] | ||
31 | |||
32 | if (store.has(hashKey)) { | ||
33 | returnedValue = store.get(hashKey) | ||
34 | } else { | ||
35 | returnedValue = originalMethod.apply(this, args) | ||
36 | store.set(hashKey, returnedValue) | ||
37 | } | ||
38 | } else { | ||
39 | if (store.has(this)) { | ||
40 | returnedValue = store.get(this) | ||
41 | } else { | ||
42 | returnedValue = originalMethod.apply(this, args) | ||
43 | store.set(this, returnedValue) | ||
44 | } | ||
45 | } | ||
46 | |||
47 | return returnedValue | ||
48 | } | ||
49 | } | ||