Fix traveling world name, fix sorting grouped players in same instance

This commit is contained in:
Natsumi
2025-09-29 13:41:12 +13:00
parent feef537cb3
commit 9872cf1d93
6 changed files with 69 additions and 294 deletions
+17 -17
View File
@@ -56,6 +56,13 @@
parse(); parse();
}); });
function currentInstanceId() {
if (typeof props.traveling !== 'undefined' && props.location === 'traveling') {
return props.traveling;
}
return props.location;
}
function parse() { function parse() {
isTraveling.value = false; isTraveling.value = false;
groupName.value = ''; groupName.value = '';
@@ -68,7 +75,7 @@
setText(L, L.instanceName); setText(L, L.instanceName);
getInstanceName(instanceId) getInstanceName(instanceId)
.then((name) => { .then((name) => {
if (name && props.location === L.tag) { if (name && currentInstanceId() === L.tag) {
setText(L, name); setText(L, name);
} }
}) })
@@ -82,7 +89,7 @@
groupName.value = L.groupId; groupName.value = L.groupId;
getGroupName(instanceId) getGroupName(instanceId)
.then((name) => { .then((name) => {
if (name && props.location === L.tag) { if (name && currentInstanceId() === L.tag) {
groupName.value = name; groupName.value = name;
} }
}) })
@@ -114,17 +121,16 @@
text.value = props.hint; text.value = props.hint;
} }
} else if (L.worldId) { } else if (L.worldId) {
if (L.instanceId) {
text.value = `${L.worldId} #${instanceName} ${L.accessTypeName}`;
} else {
text.value = L.worldId;
}
const ref = cachedWorlds.get(L.worldId); const ref = cachedWorlds.get(L.worldId);
if (typeof ref === 'undefined') { if (typeof ref === 'undefined') {
const worldName = L.worldId;
if (L.instanceId) {
text.value = `${worldName} #${instanceName} ${L.accessTypeName}`;
} else {
text.value = worldName;
}
getWorldName(L.worldId) getWorldName(L.worldId)
.then((name) => { .then((name) => {
if (name && props.location === L.tag) { if (name && currentInstanceId() === L.tag) {
if (L.instanceId) { if (L.instanceId) {
text.value = `${name} #${instanceName} ${L.accessTypeName}`; text.value = `${name} #${instanceName} ${L.accessTypeName}`;
} else { } else {
@@ -145,10 +151,7 @@
function handleShowWorldDialog() { function handleShowWorldDialog() {
if (props.link) { if (props.link) {
let instanceId = props.location; let instanceId = currentInstanceId();
if (props.traveling && props.location === 'traveling') {
instanceId = props.traveling;
}
if (!instanceId && props.hint.length === 8) { if (!instanceId && props.hint.length === 8) {
verifyShortName('', props.hint); verifyShortName('', props.hint);
return; return;
@@ -162,10 +165,7 @@
} }
function handleShowGroupDialog() { function handleShowGroupDialog() {
let location = props.location; let location = currentInstanceId();
if (isTraveling.value) {
location = props.traveling;
}
if (!location || !props.link) { if (!location || !props.link) {
return; return;
} }
+10
View File
@@ -40,6 +40,16 @@ function getFriendsSortFunction(sortMethods) {
) { ) {
return 0; return 0;
} }
// sort pending offline to bottom
if (a.pendingOffline && !b.pendingOffline) {
return 1;
}
if (a.pendingOffline && b.pendingOffline) {
return 0;
}
if (!a.pendingOffline && b.pendingOffline) {
return -1;
}
if (a.state !== 'online' || b.state !== 'online') { if (a.state !== 'online' || b.state !== 'online') {
return 0; return 0;
} }
+30 -253
View File
@@ -16,7 +16,6 @@ import {
getUserMemo, getUserMemo,
getWorldName, getWorldName,
migrateMemos, migrateMemos,
removeFromArray,
isRealInstance isRealInstance
} from '../shared/utils'; } from '../shared/utils';
import { useAuthStore } from './auth'; import { useAuthStore } from './auth';
@@ -47,14 +46,6 @@ export const useFriendStore = defineStore('Friend', () => {
const state = reactive({ const state = reactive({
friends: new Map(), friends: new Map(),
onlineFriends_: [],
vipFriends_: [],
activeFriends_: [],
offlineFriends_: [],
sortOnlineFriends: false,
sortVIPFriends: false,
sortActiveFriends: false,
sortOfflineFriends: false,
localFavoriteFriends: new Set(), localFavoriteFriends: new Set(),
isRefreshFriendsLoading: false, isRefreshFriendsLoading: false,
onlineFriendCount: 0, onlineFriendCount: 0,
@@ -125,125 +116,44 @@ export const useFriendStore = defineStore('Friend', () => {
init(); init();
// friends_(array) may not have change records in pinia because does not use action
const onlineFriends_ = computed({
get() {
return state.onlineFriends_;
},
set(value) {
state.onlineFriends_ = value;
}
});
const vipFriends_ = computed({
get() {
return state.vipFriends_;
},
set(value) {
state.vipFriends_ = value;
}
});
const activeFriends_ = computed({
get() {
return state.activeFriends_;
},
set(value) {
state.activeFriends_ = value;
}
});
const offlineFriends_ = computed({
get() {
return state.offlineFriends_;
},
set(value) {
state.offlineFriends_ = value;
}
});
const sortOnlineFriends = computed({
get() {
return state.sortOnlineFriends;
},
set(value) {
state.sortOnlineFriends = value;
}
});
const sortVIPFriends = computed({
get() {
return state.sortVIPFriends;
},
set(value) {
state.sortVIPFriends = value;
}
});
const sortActiveFriends = computed({
get() {
return state.sortActiveFriends;
},
set(value) {
state.sortActiveFriends = value;
}
});
const sortOfflineFriends = computed({
get() {
return state.sortOfflineFriends;
},
set(value) {
state.sortOfflineFriends = value;
}
});
// VIP friends
const vipFriends = computed(() => { const vipFriends = computed(() => {
if (!state.sortVIPFriends) { return Array.from(state.friends.values())
return state.vipFriends_; .filter((f) => f.state === 'online' && f.isVIP)
} .sort(
state.sortVIPFriends = false; getFriendsSortFunction(
appearanceSettingsStore.sidebarSortMethods
state.vipFriends_.sort( )
getFriendsSortFunction(appearanceSettingsStore.sidebarSortMethods)
); );
return state.vipFriends_;
}); });
// Online friends
const onlineFriends = computed(() => { const onlineFriends = computed(() => {
if (!state.sortOnlineFriends) { return Array.from(state.friends.values())
return state.onlineFriends_; .filter((f) => f.state === 'online' && !f.isVIP)
} .sort(
state.sortOnlineFriends = false; getFriendsSortFunction(
appearanceSettingsStore.sidebarSortMethods
state.onlineFriends_.sort( )
getFriendsSortFunction(appearanceSettingsStore.sidebarSortMethods)
); );
return state.onlineFriends_;
}); });
// Active friends
const activeFriends = computed(() => { const activeFriends = computed(() => {
if (!state.sortActiveFriends) { return Array.from(state.friends.values())
return state.activeFriends_; .filter((f) => f.state === 'active')
} .sort(
state.sortActiveFriends = false; getFriendsSortFunction(
appearanceSettingsStore.sidebarSortMethods
state.activeFriends_.sort( )
getFriendsSortFunction(appearanceSettingsStore.sidebarSortMethods)
); );
return state.activeFriends_;
}); });
// Offline friends
const offlineFriends = computed(() => { const offlineFriends = computed(() => {
if (!state.sortOfflineFriends) { return Array.from(state.friends.values())
return state.offlineFriends_; .filter((f) => f.state === 'offline' || !f.state)
} .sort(
state.sortOfflineFriends = false; getFriendsSortFunction(
appearanceSettingsStore.sidebarSortMethods
state.offlineFriends_.sort( )
getFriendsSortFunction(appearanceSettingsStore.sidebarSortMethods)
); );
return state.offlineFriends_;
}); });
const isRefreshFriendsLoading = computed({ const isRefreshFriendsLoading = computed({
@@ -280,14 +190,6 @@ export const useFriendStore = defineStore('Friend', () => {
friendLog.clear(); friendLog.clear();
state.friendLogTable.data = []; state.friendLogTable.data = [];
groupStore.groupInstances = []; groupStore.groupInstances = [];
state.vipFriends_ = [];
state.onlineFriends_ = [];
state.activeFriends_ = [];
state.offlineFriends_ = [];
state.sortVIPFriends = false;
state.sortOnlineFriends = false;
state.sortActiveFriends = false;
state.sortOfflineFriends = false;
state.onlineFriendCount = 0; state.onlineFriendCount = 0;
if (isLoggedIn) { if (isLoggedIn) {
initFriendsList(); initFriendsList();
@@ -402,18 +304,6 @@ export const useFriendStore = defineStore('Friend', () => {
continue; continue;
} }
ctx.isVIP = isVIP; ctx.isVIP = isVIP;
if (ctx.state !== 'online') {
continue;
}
if (ctx.isVIP) {
removeFromArray(state.onlineFriends_, ctx);
state.vipFriends_.push(ctx);
state.sortVIPFriends = true;
} else {
removeFromArray(state.vipFriends_, ctx);
state.onlineFriends_.push(ctx);
state.sortOnlineFriends = true;
}
} }
} }
@@ -491,40 +381,13 @@ export const useFriendStore = defineStore('Friend', () => {
userId: id userId: id
}); });
} }
if (ctx.isVIP) {
state.sortVIPFriends = true;
} else {
state.sortOnlineFriends = true;
}
} }
} }
if (ctx.isVIP !== isVIP) { if (ctx.isVIP !== isVIP) {
ctx.isVIP = isVIP; ctx.isVIP = isVIP;
if (ctx.state === 'online') {
if (ctx.isVIP) {
removeFromArray(state.onlineFriends_, ctx);
state.vipFriends_.push(ctx);
state.sortVIPFriends = true;
} else {
removeFromArray(state.vipFriends_, ctx);
state.onlineFriends_.push(ctx);
state.sortOnlineFriends = true;
}
}
} }
if (typeof ref !== 'undefined' && ctx.name !== ref.displayName) { if (typeof ref !== 'undefined' && ctx.name !== ref.displayName) {
ctx.name = ref.displayName; ctx.name = ref.displayName;
if (ctx.state === 'online') {
if (ctx.isVIP) {
state.sortVIPFriends = true;
} else {
state.sortOnlineFriends = true;
}
} else if (ctx.state === 'active') {
state.sortActiveFriends = true;
} else {
state.sortOfflineFriends = true;
}
} }
} else if ( } else if (
ctx.state === 'online' && ctx.state === 'online' &&
@@ -684,32 +547,6 @@ export const useFriendStore = defineStore('Friend', () => {
ctx.ref.$active_for = Date.now(); ctx.ref.$active_for = Date.now();
} }
} }
if (ctx.state === 'online') {
if (ctx.isVIP) {
removeFromArray(state.vipFriends_, ctx);
} else {
removeFromArray(state.onlineFriends_, ctx);
}
} else if (ctx.state === 'active') {
removeFromArray(state.activeFriends_, ctx);
} else {
removeFromArray(state.offlineFriends_, ctx);
}
if (newState === 'online') {
if (isVIP) {
state.vipFriends_.push(ctx);
state.sortVIPFriends = true;
} else {
state.onlineFriends_.push(ctx);
state.sortOnlineFriends = true;
}
} else if (newState === 'active') {
state.activeFriends_.push(ctx);
state.sortActiveFriends = true;
} else {
state.offlineFriends_.push(ctx);
state.sortOfflineFriends = true;
}
if (ctx.state !== newState) { if (ctx.state !== newState) {
ctx.state = newState; ctx.state = newState;
updateOnlineFriendCoutner(); updateOnlineFriendCoutner();
@@ -729,17 +566,6 @@ export const useFriendStore = defineStore('Friend', () => {
return; return;
} }
state.friends.delete(id); state.friends.delete(id);
if (ctx.state === 'online') {
if (ctx.isVIP) {
removeFromArray(state.vipFriends_, ctx);
} else {
removeFromArray(state.onlineFriends_, ctx);
}
} else if (ctx.state === 'active') {
removeFromArray(state.activeFriends_, ctx);
} else {
removeFromArray(state.offlineFriends_, ctx);
}
} }
/** /**
@@ -824,21 +650,6 @@ export const useFriendStore = defineStore('Friend', () => {
ctx.name = ref.name; ctx.name = ref.name;
} }
state.friends.set(id, ctx); state.friends.set(id, ctx);
if (ctx.state === 'online') {
if (ctx.isVIP) {
state.vipFriends_.push(ctx);
state.sortVIPFriends = true;
} else {
state.onlineFriends_.push(ctx);
state.sortOnlineFriends = true;
}
} else if (ctx.state === 'active') {
state.activeFriends_.push(ctx);
state.sortActiveFriends = true;
} else {
state.offlineFriends_.push(ctx);
state.sortOfflineFriends = true;
}
} }
/** /**
@@ -1033,18 +844,6 @@ export const useFriendStore = defineStore('Friend', () => {
reconnectWebSocket(); reconnectWebSocket();
} }
/**
* @param {string} userId
*/
function updateFriendGPS(userId) {
const ctx = state.friends.get(userId);
if (ctx.isVIP) {
state.sortVIPFriends = true;
} else {
state.sortOnlineFriends = true;
}
}
function updateOnlineFriendCoutner() { function updateOnlineFriendCoutner() {
const onlineFriendCount = const onlineFriendCount =
vipFriends.value.length + onlineFriends.value.length; vipFriends.value.length + onlineFriends.value.length;
@@ -1609,8 +1408,8 @@ export const useFriendStore = defineStore('Friend', () => {
state.friendNumber = state.friends.size + 1; state.friendNumber = state.friends.size + 1;
const friendLogTable = getFriendLogFriendOrder(); const friendLogTable = getFriendLogFriendOrder();
for (let i = friendLogTable.length - 1; i > -1; i--) { for (let i = friendLogTable.length - 1; i > -1; i--) {
const friendLog = friendLogTable[i]; const friendLogEntry = friendLogTable[i];
const ref = friendLog.get(friendLog.id); const ref = friendLog.get(friendLogEntry.id);
if (!ref) { if (!ref) {
continue; continue;
} }
@@ -1620,7 +1419,7 @@ export const useFriendStore = defineStore('Friend', () => {
ref.friendNumber = --state.friendNumber; ref.friendNumber = --state.friendNumber;
friendLog.set(ref.userId, ref); friendLog.set(ref.userId, ref);
database.setFriendLogCurrent(ref); database.setFriendLogCurrent(ref);
const friendRef = state.friends.get(friendLog.id); const friendRef = state.friends.get(friendLogEntry.id);
if (friendRef?.ref) { if (friendRef?.ref) {
friendRef.ref.$friendNumber = ref.friendNumber; friendRef.ref.$friendNumber = ref.friendNumber;
} }
@@ -1743,15 +1542,15 @@ export const useFriendStore = defineStore('Friend', () => {
// will need to apply in reverse order instead // will need to apply in reverse order instead
return; return;
} }
for (const friendLog of friendLogTable) { for (const friendLogEntry of friendLogTable) {
const ref = friendLog.get(friendLog.id); const ref = friendLog.get(friendLogEntry.id);
if (!ref || ref.friendNumber) { if (!ref || ref.friendNumber) {
continue; continue;
} }
ref.friendNumber = ++state.friendNumber; ref.friendNumber = ++state.friendNumber;
friendLog.set(ref.userId, ref); friendLog.set(ref.userId, ref);
database.setFriendLogCurrent(ref); database.setFriendLogCurrent(ref);
const friendRef = state.friends.get(friendLog.id); const friendRef = state.friends.get(friendLogEntry.id);
if (friendRef?.ref) { if (friendRef?.ref) {
friendRef.ref.$friendNumber = ref.friendNumber; friendRef.ref.$friendNumber = ref.friendNumber;
} }
@@ -1773,13 +1572,6 @@ export const useFriendStore = defineStore('Friend', () => {
.catch(() => {}); .catch(() => {});
} }
async function saveSidebarSortOrder() {
state.sortVIPFriends = true;
state.sortOnlineFriends = true;
state.sortActiveFriends = true;
state.sortOfflineFriends = true;
}
async function initFriendsList() { async function initFriendsList() {
const userId = userStore.currentUser.id; const userId = userStore.currentUser.id;
state.isRefreshFriendsLoading = true; state.isRefreshFriendsLoading = true;
@@ -1806,10 +1598,6 @@ export const useFriendStore = defineStore('Friend', () => {
tryApplyFriendOrder(); // once again tryApplyFriendOrder(); // once again
getAllUserStats(); // joinCount, lastSeen, timeSpent getAllUserStats(); // joinCount, lastSeen, timeSpent
state.sortVIPFriends = true;
state.sortOnlineFriends = true;
state.sortActiveFriends = true;
state.sortOfflineFriends = true;
// remove old data from json file and migrate to SQLite (July 2021) // remove old data from json file and migrate to SQLite (July 2021)
if (await VRCXStorage.Get(`${userId}_friendLogUpdatedAt`)) { if (await VRCXStorage.Get(`${userId}_friendLogUpdatedAt`)) {
@@ -1823,21 +1611,12 @@ export const useFriendStore = defineStore('Friend', () => {
state, state,
friends, friends,
onlineFriends_,
vipFriends_,
activeFriends_,
offlineFriends_,
vipFriends, vipFriends,
onlineFriends, onlineFriends,
activeFriends, activeFriends,
offlineFriends, offlineFriends,
sortOnlineFriends,
sortVIPFriends,
sortActiveFriends,
sortOfflineFriends,
localFavoriteFriends, localFavoriteFriends,
isRefreshFriendsLoading, isRefreshFriendsLoading,
onlineFriendCount, onlineFriendCount,
@@ -1854,7 +1633,6 @@ export const useFriendStore = defineStore('Friend', () => {
refreshFriends, refreshFriends,
refreshFriendsList, refreshFriendsList,
updateOnlineFriendCoutner, updateOnlineFriendCoutner,
updateFriendGPS,
getAllUserStats, getAllUserStats,
initFriendLog, initFriendLog,
migrateFriendLog, migrateFriendLog,
@@ -1862,7 +1640,6 @@ export const useFriendStore = defineStore('Friend', () => {
getFriendRequest, getFriendRequest,
userOnFriend, userOnFriend,
confirmDeleteFriend, confirmDeleteFriend,
saveSidebarSortOrder,
updateFriendships, updateFriendships,
updateUserCurrentStatus, updateUserCurrentStatus,
handleFriendAdd, handleFriendAdd,
-2
View File
@@ -1349,7 +1349,6 @@ export const useUserStore = defineStore('User', () => {
}; };
feedStore.addFeed(feed); feedStore.addFeed(feed);
database.addGPSToDatabase(feed); database.addGPSToDatabase(feed);
friendStore.updateFriendGPS(ref.id);
// clear previousLocation after GPS // clear previousLocation after GPS
ref.$previousLocation = ''; ref.$previousLocation = '';
ref.$travelingToTime = Date.now(); ref.$travelingToTime = Date.now();
@@ -1363,7 +1362,6 @@ export const useUserStore = defineStore('User', () => {
// store previous location when user is traveling // store previous location when user is traveling
ref.$previousLocation = props.location[1]; ref.$previousLocation = props.location[1];
ref.$travelingToTime = Date.now(); ref.$travelingToTime = Date.now();
friendStore.updateFriendGPS(ref.id);
} }
let imageMatches = false; let imageMatches = false;
if ( if (
+5 -15
View File
@@ -466,10 +466,7 @@
:model-value="sidebarSortMethod1" :model-value="sidebarSortMethod1"
style="width: 170px" style="width: 170px"
:placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')" :placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')"
@change=" @change="setSidebarSortMethod1($event)">
setSidebarSortMethod1($event);
saveSidebarSortOrder();
">
<el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')"> <el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')">
<el-option <el-option
class="x-friend-item" class="x-friend-item"
@@ -501,17 +498,14 @@
value="Sort by Location"></el-option> value="Sort by Location"></el-option>
</el-option-group> </el-option-group>
</el-select> </el-select>
<el-icon><ArrowRight /></el-icon> <el-icon style="padding: 5px"><ArrowRight /></el-icon>
<el-select <el-select
:model-value="sidebarSortMethod2" :model-value="sidebarSortMethod2"
:disabled="!sidebarSortMethod1" :disabled="!sidebarSortMethod1"
style="width: 170px" style="width: 170px"
clearable clearable
:placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')" :placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')"
@change=" @change="setSidebarSortMethod2($event)">
setSidebarSortMethod2($event);
saveSidebarSortOrder();
">
<el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')"> <el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')">
<el-option <el-option
class="x-friend-item" class="x-friend-item"
@@ -543,17 +537,14 @@
value="Sort by Location"></el-option> value="Sort by Location"></el-option>
</el-option-group> </el-option-group>
</el-select> </el-select>
<el-icon><ArrowRight /></el-icon> <el-icon style="padding: 5px"><ArrowRight /></el-icon>
<el-select <el-select
:model-value="sidebarSortMethod3" :model-value="sidebarSortMethod3"
:disabled="!sidebarSortMethod2" :disabled="!sidebarSortMethod2"
style="width: 170px" style="width: 170px"
clearable clearable
:placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')" :placeholder="t('view.settings.appearance.side_panel.sorting.placeholder')"
@change=" @change="setSidebarSortMethod3($event)">
setSidebarSortMethod3($event);
saveSidebarSortOrder();
">
<el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')"> <el-option-group :label="t('view.settings.appearance.side_panel.sorting.dropdown_header')">
<el-option <el-option
class="x-friend-item" class="x-friend-item"
@@ -1493,7 +1484,6 @@
const { showConsole } = useVrcxStore(); const { showConsole } = useVrcxStore();
const { disableGameLogDialog } = useGameLogStore(); const { disableGameLogDialog } = useGameLogStore();
const { photonLoggingEnabled } = storeToRefs(usePhotonStore()); const { photonLoggingEnabled } = storeToRefs(usePhotonStore());
const { saveSidebarSortOrder } = useFriendStore();
const { cachedWorlds } = useWorldStore(); const { cachedWorlds } = useWorldStore();
const { cachedInstances } = useInstanceStore(); const { cachedInstances } = useInstanceStore();
const { showLaunchOptions } = useLaunchStore(); const { showLaunchOptions } = useLaunchStore();
@@ -175,7 +175,7 @@
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import FriendItem from '../../../components/FriendItem.vue'; import FriendItem from '../../../components/FriendItem.vue';
import configRepository from '../../../service/config'; import configRepository from '../../../service/config';
import { isRealInstance, userImage, userStatusClass } from '../../../shared/utils'; import { isRealInstance, userImage, userStatusClass, getFriendsSortFunction } from '../../../shared/utils';
import { import {
useAdvancedSettingsStore, useAdvancedSettingsStore,
useAppearanceSettingsStore, useAppearanceSettingsStore,
@@ -189,7 +189,7 @@
const { t } = useI18n(); const { t } = useI18n();
const { vipFriends, onlineFriends, activeFriends, offlineFriends } = storeToRefs(useFriendStore()); const { vipFriends, onlineFriends, activeFriends, offlineFriends } = storeToRefs(useFriendStore());
const { isSidebarGroupByInstance, isHideFriendsInSameInstance, isSidebarDivideByFriendGroup } = const { isSidebarGroupByInstance, isHideFriendsInSameInstance, isSidebarDivideByFriendGroup, sidebarSortMethods } =
storeToRefs(useAppearanceSettingsStore()); storeToRefs(useAppearanceSettingsStore());
const { gameLogDisabled } = storeToRefs(useAdvancedSettingsStore()); const { gameLogDisabled } = storeToRefs(useAdvancedSettingsStore());
const { showUserDialog } = useUserStore(); const { showUserDialog } = useUserStore();
@@ -234,7 +234,7 @@
const sortedFriendsList = []; const sortedFriendsList = [];
for (const group of Object.values(friendsList)) { for (const group of Object.values(friendsList)) {
if (group.length > 1) { if (group.length > 1) {
sortedFriendsList.push(group.sort((a, b) => a.ref?.$location_at - b.ref?.$location_at)); sortedFriendsList.push(group.sort(getFriendsSortFunction(sidebarSortMethods.value)));
} }
} }