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
+34
View File
@@ -67,6 +67,38 @@ export const useFriendStore = defineStore('Friend', () => {
const localFavoriteFriends = reactive(new Set()); 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 isRefreshFriendsLoading = ref(false);
const onlineFriendCount = ref(0); const onlineFriendCount = ref(0);
@@ -1663,6 +1695,8 @@ export const useFriendStore = defineStore('Friend', () => {
offlineFriends, offlineFriends,
friendsInSameInstance, friendsInSameInstance,
allFavoriteFriendIds,
allFavoriteOnlineFriends,
localFavoriteFriends, localFavoriteFriends,
isRefreshFriendsLoading, isRefreshFriendsLoading,
onlineFriendCount, onlineFriendCount,
@@ -186,8 +186,8 @@
import BackToTop from '@/components/BackToTop.vue'; import BackToTop from '@/components/BackToTop.vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useAppearanceSettingsStore, useFavoriteStore, useFriendStore, useUserStore } from '../../../stores';
import { Popover, PopoverContent, PopoverTrigger } from '../../../components/ui/popover'; import { Popover, PopoverContent, PopoverTrigger } from '../../../components/ui/popover';
import { useAppearanceSettingsStore, useFriendStore, useUserStore } from '../../../stores';
import { parseLocation, timeToText } from '../../../shared/utils'; import { parseLocation, timeToText } from '../../../shared/utils';
import { Slider } from '../../../components/ui/slider'; import { Slider } from '../../../components/ui/slider';
import { Switch } from '../../../components/ui/switch'; import { Switch } from '../../../components/ui/switch';
@@ -204,31 +204,10 @@
const appearanceSettingsStore = useAppearanceSettingsStore(); const appearanceSettingsStore = useAppearanceSettingsStore();
const friendStore = useFriendStore(); const friendStore = useFriendStore();
const favoriteStore = useFavoriteStore(); const { friends, allFavoriteFriendIds } = storeToRefs(friendStore);
const { isDarkMode, dtHour12 } = storeToRefs(appearanceSettingsStore);
const { friends } = storeToRefs(friendStore);
const { cachedFavorites, localFriendFavorites } = storeToRefs(favoriteStore);
const { currentUser } = storeToRefs(useUserStore()); const { currentUser } = storeToRefs(useUserStore());
const { t } = useI18n(); const { t } = useI18n();
const { isDarkMode, dtHour12 } = storeToRefs(appearanceSettingsStore);
// 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 instanceActivityRef = ref(null); const instanceActivityRef = ref(null);
@@ -394,7 +373,7 @@
onMounted(async () => { onMounted(async () => {
try { try {
getAllDateOfActivity(); getAllDateOfActivity();
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriends, () => await getActivityData(selectedDate, currentUser, friends, allFavoriteFriendIds, () =>
handleIntersectionObserver(activityDetailChartRef) handleIntersectionObserver(activityDetailChartRef)
); );
await getWorldNameData(); await getWorldNameData();
@@ -419,7 +398,7 @@
reloadData = async function () { reloadData = async function () {
isLoading.value = true; isLoading.value = true;
try { try {
await getActivityData(selectedDate, currentUser, friends, allFavoriteFriends, () => await getActivityData(selectedDate, currentUser, friends, allFavoriteFriendIds, () =>
handleIntersectionObserver(activityDetailChartRef) handleIntersectionObserver(activityDetailChartRef)
); );
await getWorldNameData(); await getWorldNameData();
+2 -2
View File
@@ -142,7 +142,7 @@
const emit = defineEmits(['lookup-user']); const emit = defineEmits(['lookup-user']);
const { friends } = storeToRefs(useFriendStore()); const { friends, allFavoriteFriendIds } = storeToRefs(useFriendStore());
const modalStore = useModalStore(); const modalStore = useModalStore();
const { getAllUserStats, getAllUserMutualCount, confirmDeleteFriend, handleFriendDelete } = useFriendStore(); const { getAllUserStats, getAllUserMutualCount, confirmDeleteFriend, handleFriendDelete } = useFriendStore();
const { randomUserColours } = storeToRefs(useAppearanceSettingsStore()); const { randomUserColours } = storeToRefs(useAppearanceSettingsStore());
@@ -286,7 +286,7 @@
} }
for (const ctx of friends.value.values()) { for (const ctx of friends.value.values()) {
if (!ctx.ref) continue; if (!ctx.ref) continue;
if (friendsListSearchFilterVIP.value && !ctx.isVIP) continue; if (friendsListSearchFilterVIP.value && !allFavoriteFriendIds.value.has(ctx.id)) continue;
if (query) { if (query) {
let match = false; let match = false;
if (!match && filters.includes('Display Name') && ctx.ref.displayName) { if (!match && filters.includes('Display Name') && ctx.ref.displayName) {
@@ -146,8 +146,14 @@
const { t } = useI18n(); const { t } = useI18n();
const friendStore = useFriendStore(); const friendStore = useFriendStore();
const { onlineFriends, vipFriends, activeFriends, offlineFriends, friendsInSameInstance } = const {
storeToRefs(friendStore); onlineFriends,
allFavoriteOnlineFriends,
allFavoriteFriendIds,
activeFriends,
offlineFriends,
friendsInSameInstance
} = storeToRefs(friendStore);
const SEGMENTED_BASE_OPTIONS = [ const SEGMENTED_BASE_OPTIONS = [
{ label: t('view.friends_locations.online'), value: 'online' }, { label: t('view.friends_locations.online'), value: 'online' },
@@ -322,7 +328,7 @@
const filteredFriends = computed(() => { const filteredFriends = computed(() => {
if (normalizedSearchTerm.value) { if (normalizedSearchTerm.value) {
const pools = [ const pools = [
...toEntries(vipFriends.value), ...toEntries(allFavoriteOnlineFriends.value),
...toEntries(onlineFriends.value), ...toEntries(onlineFriends.value),
...toEntries(activeFriends.value), ...toEntries(activeFriends.value),
...toEntries(offlineFriends.value) ...toEntries(offlineFriends.value)
@@ -349,7 +355,9 @@
.filter((id) => typeof id === 'string' || typeof id === 'number') .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) => { .filter((entry) => {
if (!entry?.id) { if (!entry?.id) {
return true; return true;
@@ -364,10 +372,10 @@
return [...sameEntries, ...remainingOnline]; return [...sameEntries, ...remainingOnline];
} }
return toEntries(onlineFriends.value); return toEntries(onlineFriends.value.filter((f) => !allFavoriteFriendIds.value.has(f.id)));
} }
case 'favorite': case 'favorite':
return toEntries(vipFriends.value); return toEntries(allFavoriteOnlineFriends.value);
case 'same-instance': case 'same-instance':
return sameInstanceEntries.value; return sameInstanceEntries.value;
case 'active': case 'active':
@@ -108,8 +108,14 @@
const { t } = useI18n(); const { t } = useI18n();
const friendStore = useFriendStore(); const friendStore = useFriendStore();
const { vipFriends, onlineFriends, activeFriends, offlineFriends, friendsInSameInstance } = const {
storeToRefs(friendStore); allFavoriteOnlineFriends,
allFavoriteFriendIds,
onlineFriends,
activeFriends,
offlineFriends,
friendsInSameInstance
} = storeToRefs(friendStore);
const { const {
isSidebarGroupByInstance, isSidebarGroupByInstance,
isHideFriendsInSameInstance, isHideFriendsInSameInstance,
@@ -157,13 +163,15 @@
return list.filter((item) => !sameInstanceFriendId.value.has(item.id)); 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 vipFriendsByGroupStatus = computed(() => {
const selectedGroups = sidebarFavoriteGroups.value; const selectedGroups = sidebarFavoriteGroups.value;
const hasFilter = selectedGroups.length > 0; const hasFilter = selectedGroups.length > 0;
if (!hasFilter) { if (!hasFilter) {
return excludeSameInstance(vipFriends.value); return excludeSameInstance(allFavoriteOnlineFriends.value);
} }
// Filter to only include VIP friends whose group key is in selectedGroups // Filter to only include VIP friends whose group key is in selectedGroups
const allowedIds = new Set(); const allowedIds = new Set();
@@ -179,7 +187,7 @@
for (const f of remoteFriendsByGroup[key]) allowedIds.add(f.id); 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 // VIP friends divide by group
@@ -212,7 +220,9 @@
// Filter vipFriends per group, preserving vipFriends sort order // Filter vipFriends per group, preserving vipFriends sort order
const result = []; const result = [];
for (const { key, groupName, memberIds } of groups) { 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) { if (filteredFriends.length > 0) {
result.push(filteredFriends.map((item) => ({ groupName, key, ...item }))); result.push(filteredFriends.map((item) => ({ groupName, key, ...item })));
} }