add allFavoriteOnlineFriends

This commit is contained in:
pa
2026-02-14 20:30:05 +09:00
parent 2e627ba6f5
commit 0a16b1a4e2
5 changed files with 71 additions and 40 deletions

View File

@@ -67,6 +67,38 @@ export const useFriendStore = defineStore('Friend', () => {
const localFavoriteFriends = reactive(new Set());
const allFavoriteFriendIds = computed(() => {
const favoriteStore = useFavoriteStore();
const set = new Set();
for (const ref of favoriteStore.cachedFavorites.values()) {
if (ref.type === 'friend') {
set.add(ref.favoriteId);
}
}
for (const groupName in favoriteStore.localFriendFavorites) {
const userIds = favoriteStore.localFriendFavorites[groupName];
if (userIds) {
for (const id of userIds) {
set.add(id);
}
}
}
return set;
});
const allFavoriteOnlineFriends = computed(() => {
return Array.from(friends.values())
.filter(
(f) =>
f.state === 'online' && allFavoriteFriendIds.value.has(f.id)
)
.sort(
getFriendsSortFunction(
appearanceSettingsStore.sidebarSortMethods
)
);
});
const isRefreshFriendsLoading = ref(false);
const onlineFriendCount = ref(0);
@@ -1663,6 +1695,8 @@ export const useFriendStore = defineStore('Friend', () => {
offlineFriends,
friendsInSameInstance,
allFavoriteFriendIds,
allFavoriteOnlineFriends,
localFavoriteFriends,
isRefreshFriendsLoading,
onlineFriendCount,

View File

@@ -186,8 +186,8 @@
import BackToTop from '@/components/BackToTop.vue';
import dayjs from 'dayjs';
import { useAppearanceSettingsStore, useFavoriteStore, useFriendStore, useUserStore } from '../../../stores';
import { Popover, PopoverContent, PopoverTrigger } from '../../../components/ui/popover';
import { useAppearanceSettingsStore, useFriendStore, useUserStore } from '../../../stores';
import { parseLocation, timeToText } from '../../../shared/utils';
import { Slider } from '../../../components/ui/slider';
import { Switch } from '../../../components/ui/switch';
@@ -204,31 +204,10 @@
const appearanceSettingsStore = useAppearanceSettingsStore();
const friendStore = useFriendStore();
const favoriteStore = useFavoriteStore();
const { isDarkMode, dtHour12 } = storeToRefs(appearanceSettingsStore);
const { friends } = storeToRefs(friendStore);
const { cachedFavorites, localFriendFavorites } = storeToRefs(favoriteStore);
const { friends, allFavoriteFriendIds } = storeToRefs(friendStore);
const { currentUser } = storeToRefs(useUserStore());
const { t } = useI18n();
// All favorite friends (remote + local)
const allFavoriteFriends = computed(() => {
const set = new Set();
for (const ref of cachedFavorites.value.values()) {
if (ref.type === 'friend') {
set.add(ref.favoriteId);
}
}
for (const group in localFriendFavorites.value) {
const userIds = localFriendFavorites.value[group];
if (userIds) {
for (const id of userIds) {
set.add(id);
}
}
}
return set;
});
const { isDarkMode, dtHour12 } = storeToRefs(appearanceSettingsStore);
const instanceActivityRef = ref(null);
@@ -394,7 +373,7 @@
onMounted(async () => {
try {
getAllDateOfActivity();
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriends, () =>
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriendIds, () =>
handleIntersectionObserver(activityDetailChartRef)
);
await getWorldNameData();
@@ -419,7 +398,7 @@
reloadData = async function () {
isLoading.value = true;
try {
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriends, () =>
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriendIds, () =>
handleIntersectionObserver(activityDetailChartRef)
);
await getWorldNameData();

View File

@@ -142,7 +142,7 @@
const emit = defineEmits(['lookup-user']);
const { friends } = storeToRefs(useFriendStore());
const { friends, allFavoriteFriendIds } = storeToRefs(useFriendStore());
const modalStore = useModalStore();
const { getAllUserStats, getAllUserMutualCount, confirmDeleteFriend, handleFriendDelete } = useFriendStore();
const { randomUserColours } = storeToRefs(useAppearanceSettingsStore());
@@ -286,7 +286,7 @@
}
for (const ctx of friends.value.values()) {
if (!ctx.ref) continue;
if (friendsListSearchFilterVIP.value && !ctx.isVIP) continue;
if (friendsListSearchFilterVIP.value && !allFavoriteFriendIds.value.has(ctx.id)) continue;
if (query) {
let match = false;
if (!match && filters.includes('Display Name') && ctx.ref.displayName) {

View File

@@ -146,8 +146,14 @@
const { t } = useI18n();
const friendStore = useFriendStore();
const { onlineFriends, vipFriends, activeFriends, offlineFriends, friendsInSameInstance } =
storeToRefs(friendStore);
const {
onlineFriends,
allFavoriteOnlineFriends,
allFavoriteFriendIds,
activeFriends,
offlineFriends,
friendsInSameInstance
} = storeToRefs(friendStore);
const SEGMENTED_BASE_OPTIONS = [
{ label: t('view.friends_locations.online'), value: 'online' },
@@ -322,7 +328,7 @@
const filteredFriends = computed(() => {
if (normalizedSearchTerm.value) {
const pools = [
...toEntries(vipFriends.value),
...toEntries(allFavoriteOnlineFriends.value),
...toEntries(onlineFriends.value),
...toEntries(activeFriends.value),
...toEntries(offlineFriends.value)
@@ -349,7 +355,9 @@
.filter((id) => typeof id === 'string' || typeof id === 'number')
);
const remainingOnline = toEntries(onlineFriends.value)
const remainingOnline = toEntries(
onlineFriends.value.filter((f) => !allFavoriteFriendIds.value.has(f.id))
)
.filter((entry) => {
if (!entry?.id) {
return true;
@@ -364,10 +372,10 @@
return [...sameEntries, ...remainingOnline];
}
return toEntries(onlineFriends.value);
return toEntries(onlineFriends.value.filter((f) => !allFavoriteFriendIds.value.has(f.id)));
}
case 'favorite':
return toEntries(vipFriends.value);
return toEntries(allFavoriteOnlineFriends.value);
case 'same-instance':
return sameInstanceEntries.value;
case 'active':

View File

@@ -108,8 +108,14 @@
const { t } = useI18n();
const friendStore = useFriendStore();
const { vipFriends, onlineFriends, activeFriends, offlineFriends, friendsInSameInstance } =
storeToRefs(friendStore);
const {
allFavoriteOnlineFriends,
allFavoriteFriendIds,
onlineFriends,
activeFriends,
offlineFriends,
friendsInSameInstance
} = storeToRefs(friendStore);
const {
isSidebarGroupByInstance,
isHideFriendsInSameInstance,
@@ -157,13 +163,15 @@
return list.filter((item) => !sameInstanceFriendId.value.has(item.id));
}
const onlineFriendsByGroupStatus = computed(() => excludeSameInstance(onlineFriends.value));
const onlineFriendsByGroupStatus = computed(() =>
excludeSameInstance(onlineFriends.value.filter((f) => !allFavoriteFriendIds.value.has(f.id)))
);
const vipFriendsByGroupStatus = computed(() => {
const selectedGroups = sidebarFavoriteGroups.value;
const hasFilter = selectedGroups.length > 0;
if (!hasFilter) {
return excludeSameInstance(vipFriends.value);
return excludeSameInstance(allFavoriteOnlineFriends.value);
}
// Filter to only include VIP friends whose group key is in selectedGroups
const allowedIds = new Set();
@@ -179,7 +187,7 @@
for (const f of remoteFriendsByGroup[key]) allowedIds.add(f.id);
}
}
return excludeSameInstance(vipFriends.value.filter((f) => allowedIds.has(f.id)));
return excludeSameInstance(allFavoriteOnlineFriends.value.filter((f) => allowedIds.has(f.id)));
});
// VIP friends divide by group
@@ -212,7 +220,9 @@
// Filter vipFriends per group, preserving vipFriends sort order
const result = [];
for (const { key, groupName, memberIds } of groups) {
const filteredFriends = excludeSameInstance(vipFriends.value.filter((friend) => memberIds.has(friend.id)));
const filteredFriends = excludeSameInstance(
allFavoriteOnlineFriends.value.filter((friend) => memberIds.has(friend.id))
);
if (filteredFriends.length > 0) {
result.push(filteredFriends.map((item) => ({ groupName, key, ...item })));
}