Page MenuHomePhorge

No OneTemporary

Size
10 KB
Referenced Files
None
Subscribers
None
diff --git a/src/components/avatar_list/avatar_list.js b/src/components/avatar_list/avatar_list.js
index 7806fba813..7c0a39ffd9 100644
--- a/src/components/avatar_list/avatar_list.js
+++ b/src/components/avatar_list/avatar_list.js
@@ -1,14 +1,19 @@
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
import { useInstanceStore } from 'src/stores/instance.js'
+import { useUsersStore } from 'src/stores/users.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
const AvatarList = {
- props: ['users'],
+ props: {
+ userIds: Set,
+ },
computed: {
slicedUsers() {
- return this.users ? this.users.slice(0, 15) : []
+ return [...(this.userIds ?? [])]
+ .slice(0, 15)
+ .map((id) => useUsersStore().findUser(id))
},
},
components: {
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 43b0f48069..8c3e594acc 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -1,4 +1,3 @@
-import { uniqBy } from 'lodash'
import { defineAsyncComponent } from 'vue'
import AvatarList from 'src/components/avatar_list/avatar_list.vue'
@@ -179,6 +178,12 @@ const Status = {
useUserHighlightStore().get(this.repeater.screen_name),
)
},
+ favoritedBy() {
+ return useStatusesStore().favs.get(this.mainStatus.id) ?? new Set()
+ },
+ repeatedBy() {
+ return useStatusesStore().repeats.get(this.mainStatus.id) ?? new Set()
+ },
userStyle() {
if (this.noHeading) return
return highlightStyle(useUserHighlightStore().get(this.user.screen_name))
@@ -383,12 +388,10 @@ const Status = {
}
},
combinedFavsAndRepeatsUsers() {
- // Use the status from the global status repository since favs and repeats are saved in it
- const combinedUsers = [].concat(
- this.mainStatus.favoritedBy,
- this.mainStatus.rebloggedBy,
- )
- return uniqBy(combinedUsers, 'id')
+ return new Set([
+ ...this.favoritedBy,
+ ...this.repeatedBy,
+ ])
},
tags() {
return [...this.status.tags]
@@ -403,7 +406,7 @@ const Status = {
return (
!this.hidePostStats &&
this.focused &&
- (this.combinedFavsAndRepeatsUsers.length > 0 ||
+ (this.combinedFavsAndRepeatsUsers.size > 0 ||
this.mainStatus.quotes_count)
)
},
@@ -588,20 +591,18 @@ const Status = {
// refetch repeats when repeat_num is changed in any way
if (
this.focused &&
- this.mainStatus.rebloggedBy &&
- this.mainStatus.rebloggedBy.length !== num
+ this.repeatedBy.size !== num
) {
- useStatusesStore().fetchRepeats(this.status.id)
+ useStatusesStore().fetchRepeats(this.mainStatus.id)
}
},
'mainStatus.fave_num': function (num) {
// refetch favs when fave_num is changed in any way
if (
this.focused &&
- this.mainStatus.favoritedBy &&
- this.mainStatus.favoritedBy.length !== num
+ this.favoritedBy.size !== num
) {
- useStatusesStore().fetchFavs(this.status.id)
+ useStatusesStore().fetchFavs(this.mainStatus.id)
}
},
isSuspendable: function (suspend) {
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 5171f76576..7af4ed84ad 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -464,26 +464,26 @@
>
<div class="stats">
<UserListPopover
- v-if="mainStatus.rebloggedBy && mainStatus.rebloggedBy.length > 0"
- :users="mainStatus.rebloggedBy"
+ v-if="repeatedBy.size > 0"
+ :user-ids="repeatedBy"
>
<div class="stat-count">
<a class="stat-title">{{ $t('status.repeats') }}</a>
<div class="stat-number">
- {{ mainStatus.rebloggedBy.length }}
+ {{ repeatedBy.size }}
</div>
</div>
</UserListPopover>
<UserListPopover
- v-if="mainStatus.favoritedBy && mainStatus.favoritedBy.length > 0"
- :users="mainStatus.favoritedBy"
+ v-if="favoritedBy.size > 0"
+ :user-ids="favoritedBy"
>
<div
class="stat-count"
>
<a class="stat-title">{{ $t('status.favorites') }}</a>
<div class="stat-number">
- {{ mainStatus.favoritedBy.length }}
+ {{ favoritedBy.size }}
</div>
</div>
</UserListPopover>
@@ -501,7 +501,7 @@
</div>
</router-link>
<div class="avatar-row">
- <AvatarList :users="combinedFavsAndRepeatsUsers" />
+ <AvatarList :user-ids="combinedFavsAndRepeatsUsers" />
</div>
</div>
</div>
diff --git a/src/components/user_list_popover/user_list_popover.js b/src/components/user_list_popover/user_list_popover.js
index 84107d6b17..00bce1e9c0 100644
--- a/src/components/user_list_popover/user_list_popover.js
+++ b/src/components/user_list_popover/user_list_popover.js
@@ -4,6 +4,7 @@ import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
import { useInstanceStore } from 'src/stores/instance.js'
import { useMergedConfigStore } from 'src/stores/merged_config.js'
+import { useUsersStore } from 'src/stores/users.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@@ -14,7 +15,9 @@ library.add(faCircleNotch)
const UserListPopover = {
name: 'UserListPopover',
- props: ['users'],
+ props: {
+ userIds: Set
+ },
components: {
UnicodeDomainIndicator,
Popover,
@@ -22,7 +25,7 @@ const UserListPopover = {
},
computed: {
usersCapped() {
- return this.users.slice(0, 16)
+ return [...this.userIds].slice(0, 16).map((id) => useUsersStore().findUser(id))
},
allowNonSquareEmoji() {
return useMergedConfigStore().mergedConfig.nonSquareEmoji
diff --git a/src/components/user_list_popover/user_list_popover.vue b/src/components/user_list_popover/user_list_popover.vue
index 8f774a9b11..b5677bcabf 100644
--- a/src/components/user_list_popover/user_list_popover.vue
+++ b/src/components/user_list_popover/user_list_popover.vue
@@ -9,7 +9,7 @@
</template>
<template #content>
<div class="user-list-popover">
- <template v-if="users.length">
+ <template v-if="userIds.size > 0">
<router-link
v-for="(user) in usersCapped"
:key="user.id"
diff --git a/src/stores/statuses.js b/src/stores/statuses.js
index ceb51ceb68..9df26465fb 100644
--- a/src/stores/statuses.js
+++ b/src/stores/statuses.js
@@ -36,6 +36,8 @@ export const defaultState = () => ({
conversations: new Map(),
favorites: new Set(),
socket: null,
+ favs: new Map(),
+ repeats: new Map(),
})
export const useStatusesStore = defineStore('statuses', {
@@ -189,60 +191,53 @@ export const useStatusesStore = defineStore('statuses', {
id,
credentials: useOAuthStore().token,
}).then(({ data: emojiReactions }) => {
- this.addEmojiReactionsBy({
- id,
- emojiReactions,
- })
+ this.addEmojiReactionsBy(id, emojiReactions)
})
},
fetchFavs(id) {
return fetchFavoritedByUsers({
id,
credentials: useOAuthStore().token,
- }).then(({ data: favoritedByUsers }) =>
- this.addFavs({
- id,
- favoritedByUsers,
- }),
- )
+ }).then((result) => {
+ const users = useUsersStore().addNewUsers(result)
+ return this.addFavs(id, new Set(users.map(({ id }) => id)))
+ })
},
fetchRepeats(id) {
return fetchRebloggedByUsers({
id,
credentials: useOAuthStore().token,
- }).then(({ data: rebloggedByUsers }) =>
- this.addRepeats({
- id,
- rebloggedByUsers,
- }),
- )
+ }).then((result) => {
+ const users = useUsersStore().addNewUsers(result)
+ return this.addRepeats(id, new Set(users.map(({ id }) => id)))
+ })
},
fetchFavsAndRepeats(id) {
return Promise.all([this.fetchFavs(id), this.fetchRepeats(id)])
},
// Updates
- addRepeats({ id, rebloggedByUsers }) {
+ addRepeats(id, users) {
const currentUser = useUsersStore().currentUser
const newStatus = this.allStatuses.get(id)
- newStatus.rebloggedBy = rebloggedByUsers.filter(Boolean)
- // repeats stats can be incorrect based on polling condition, let's update them using the most recent data
- newStatus.repeat_num = newStatus.rebloggedBy.length
- newStatus.repeated = !!newStatus.rebloggedBy.find(
- ({ id }) => currentUser?.id === id,
- )
+ this.repeats.set(id, users)
+
+ // repeats stats can be incorrect based on polling
+ // condition, let's update them using the most recent data
+ newStatus.repeat_num = users.size
+ newStatus.repeated = users.has(currentUser?.id)
},
- addFavs({ id, favoritedByUsers }) {
+ addFavs(id, users) {
const currentUser = useUsersStore().currentUser
const newStatus = this.allStatuses.get(id)
- newStatus.favoritedBy = favoritedByUsers.filter(Boolean)
- // favorites stats can be incorrect based on polling condition, let's update them using the most recent data
- newStatus.fave_num = newStatus.favoritedBy.length
- newStatus.favorited = !!newStatus.favoritedBy.find(
- ({ id }) => currentUser?.id === id,
- )
+ this.favs.set(id, users)
+
+ // favorites stats can be incorrect based on polling
+ // condition, let's update them using the most recent data
+ newStatus.fave_num = users.size
+ newStatus.favorited = users.has(currentUser?.id)
},
- addEmojiReactionsBy({ id, emojiReactions }) {
+ addEmojiReactionsBy(id, emojiReactions) {
const status = this.allStatuses.get(id)
status.emoji_reactions = emojiReactions
},

File Metadata

Mime Type
text/x-diff
Expires
Sun, Aug 30, 5:39 AM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1737782
Default Alt Text
(10 KB)

Event Timeline