]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Improve channel's avatar display performance
authorChocobozzz <me@florianbigard.com>
Mon, 13 Feb 2023 13:27:35 +0000 (14:27 +0100)
committerChocobozzz <me@florianbigard.com>
Mon, 13 Feb 2023 13:27:48 +0000 (14:27 +0100)
client/src/app/+accounts/account-video-channels/account-video-channels.component.ts
client/src/app/helpers/utils/index.ts
client/src/app/helpers/utils/simple-memoize.ts [new file with mode: 0644]

index 59814a93d4aca2160486188ea26a96b6d2e97bcb..631444398cc73e889fe1fc0a3966bad150dfb356 100644 (file)
@@ -5,6 +5,7 @@ import { ComponentPagination, hasMoreItems, MarkdownService, User, UserService }
 import { Account, AccountService, Video, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main'
 import { MiniatureDisplayOptions } from '@app/shared/shared-video-miniature'
 import { NSFWPolicyType, VideoSortField } from '@shared/models'
+import { SimpleMemoize } from '@app/helpers'
 
 @Component({
   selector: 'my-account-video-channels',
@@ -145,6 +146,7 @@ export class AccountVideoChannelsComponent implements OnInit, OnDestroy {
     this.loadMoreChannels()
   }
 
+  @SimpleMemoize()
   getVideoChannelLink (videoChannel: VideoChannel) {
     return [ '/c', videoChannel.nameWithHost ]
   }
index f821985c97a36a9f05f1e47debbafe963b89b88b..afa8f8f5c43eb491776914fa73e7c250f5e1bf88 100644 (file)
@@ -2,6 +2,7 @@ export * from './channel'
 export * from './date'
 export * from './html'
 export * from './object'
+export * from './simple-memoize'
 export * from './dom'
 export * from './upload'
 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 (file)
index 0000000..e829279
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ *
+ * Simple memoize only support methods that accept 0 or 1 argument
+ * You can easily use it adding @SimpleMemoize just above the method name
+ *
+ */
+
+export function SimpleMemoize () {
+  const store = new Map()
+
+  return (_target: object, _propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {
+    if (descriptor.value != null) {
+      descriptor.value = getNewFunction(descriptor.value, store)
+      return
+    }
+
+    throw new Error('Only put a Memoize() decorator on a method accessor.')
+  }
+}
+
+function getNewFunction (originalMethod: () => void, store: Map<any, any>) {
+  return function (this: any, ...args: any[]) {
+    if (args.length > 1) {
+      throw new Error('Simple memoize only support 0 or 1 argument')
+    }
+
+    let returnedValue: any
+
+    if (args.length > 0) {
+      const hashKey = args[0]
+
+      if (store.has(hashKey)) {
+        returnedValue = store.get(hashKey)
+      } else {
+        returnedValue = originalMethod.apply(this, args)
+        store.set(hashKey, returnedValue)
+      }
+    } else {
+      if (store.has(this)) {
+        returnedValue = store.get(this)
+      } else {
+        returnedValue = originalMethod.apply(this, args)
+        store.set(this, returnedValue)
+      }
+    }
+
+    return returnedValue
+  }
+}