90
90
</template>
91
91
92
92
<script>
93
+ import { getBuilder } from '@nextcloud/browser-storage'
93
94
import { directive as ClickOutside } from 'v-click-outside'
94
95
import PopoverMenu from '../PopoverMenu'
95
96
import { getCurrentUser } from '@nextcloud/auth'
@@ -100,6 +101,20 @@ import Tooltip from '../../directives/Tooltip'
100
101
import usernameToColor from '../../functions/usernameToColor'
101
102
import { userStatus } from '../../mixins'
102
103
104
+ const browserStorage = getBuilder('nextcloud').persist().build()
105
+
106
+ function getUserHasAvatar(userId) {
107
+ const flag = browserStorage.getItem('user-has-avatar.' + userId)
108
+ if (typeof flag === 'string') {
109
+ return Boolean(flag)
110
+ }
111
+ return null
112
+ }
113
+
114
+ function setUserHasAvatar(userId, flag) {
115
+ browserStorage.setItem('user-has-avatar.' + userId, flag)
116
+ }
117
+
103
118
export default {
104
119
name: 'Avatar',
105
120
directives: {
@@ -476,17 +491,34 @@ export default {
476
491
urlGenerator(this.user, this.size * 4) + ' 4x',
477
492
].join(', ')
478
493
494
+ // skip loading
495
+ const userHasAvatar = getUserHasAvatar(this.user)
496
+ if (typeof userHasAvatar === 'boolean') {
497
+ this.isAvatarLoaded = true
498
+ this.avatarUrlLoaded = avatarUrl
499
+ if (!this.isUrlDefined) {
500
+ this.avatarSrcSetLoaded = srcset
501
+ }
502
+ if (userHasAvatar === false) {
503
+ this.userDoesNotExist = true
504
+ }
505
+ return
506
+ }
507
+
479
508
const img = new Image()
480
509
img.onload = () => {
481
510
this.avatarUrlLoaded = avatarUrl
482
511
if (!this.isUrlDefined) {
483
512
this.avatarSrcSetLoaded = srcset
484
513
}
485
514
this.isAvatarLoaded = true
515
+ // re-get to avoid concurrent access
516
+ setUserHasAvatar(this.user, true)
486
517
}
487
518
img.onerror = () => {
488
519
this.userDoesNotExist = true
489
520
this.isAvatarLoaded = true
521
+ setUserHasAvatar(this.user, false)
490
522
}
491
523
492
524
if (!this.isUrlDefined) {
0 commit comments