diff --git a/src/localization/en.json b/src/localization/en.json index d7ad68ef..1e9ba295 100644 --- a/src/localization/en.json +++ b/src/localization/en.json @@ -84,7 +84,17 @@ "online": "ONLINE", "active": "ACTIVE", "offline": "OFFLINE", - "pending_offline": "Pending Offline" + "pending_offline": "Pending Offline", + "settings": { + "group_by_instance": "Group by Instance", + "split_favorite_friends": "Show Favorite Groups", + "hide_friends_in_same_instance": "Hide Grouped Friends", + "sort_primary": "Sort by", + "sort_secondary": "Then by", + "sort_tertiary": "Then by", + "favorite_groups": "Favorite Groups", + "favorite_groups_placeholder": "All Groups" + } }, "view": { "login": { @@ -635,7 +645,6 @@ "yellow": "Yellow" }, "side_panel": { - "header": "Side Panel", "sorting": { "header": "Sort Order", "alphabetical": "Alphabetical", @@ -646,13 +655,7 @@ "last_seen": "Last Seen", "time_in_instance": "Time in Instance", "placeholder": "Sort Order" - }, - "group_by_instance": "Group by Instance", - "group_by_instance_tooltip": "Enabling this will group friends by instance when there is more than one friend in the same instance.", - "hide_friends_in_same_instance": "Hide Friends in Same Instance", - "hide_friends_in_same_instance_tooltip": "Hide Friends from Friend List When They Are in the Same Instance.", - "split_favorite_friends": "Split Favorite Friends", - "split_favorite_friends_tooltip": "Separate favorite friends into their individual groups." + } }, "user_dialog": { "header": "User Dialog", diff --git a/src/stores/favorite.js b/src/stores/favorite.js index 82b9955d..166db828 100644 --- a/src/stores/favorite.js +++ b/src/stores/favorite.js @@ -292,9 +292,12 @@ export const useFavoriteStore = defineStore('Favorite', () => { if ( args.params.type === 'friend' && - generalSettingsStore.localFavoriteFriendsGroups.includes( - 'friend:' + args.params.tags - ) + (!generalSettingsStore.localFavoriteFriendsGroups.some( + (key) => !key.startsWith('local:') + ) || + generalSettingsStore.localFavoriteFriendsGroups.includes( + 'friend:' + args.params.tags + )) ) { friendStore.updateLocalFavoriteFriends(); } @@ -793,17 +796,19 @@ export const useFavoriteStore = defineStore('Favorite', () => { }; cachedFavorites.set(ref.id, ref); cachedFavoritesByObjectId.set(ref.favoriteId, ref); + ref.$groupKey = `${ref.type}:${String(ref.tags[0])}`; if ( ref.type === 'friend' && - (generalSettingsStore.localFavoriteFriendsGroups.length === 0 || + (!generalSettingsStore.localFavoriteFriendsGroups.some( + (key) => !key.startsWith('local:') + ) || generalSettingsStore.localFavoriteFriendsGroups.includes( - ref.groupKey + ref.$groupKey )) ) { friendStore.localFavoriteFriends.add(ref.favoriteId); friendStore.updateSidebarFavorites(); } - ref.$groupKey = `${ref.type}:${String(ref.tags[0])}`; if (!isFavoriteLoading.value) { countFavoriteGroups(); } @@ -1551,13 +1556,7 @@ export const useFavoriteStore = defineStore('Favorite', () => { if (userDialog.visible && userDialog.id === userId) { userDialog.isFavorite = true; } - if ( - generalSettingsStore.localFavoriteFriendsGroups.includes( - `local:${group}` - ) - ) { - friendStore.updateLocalFavoriteFriends(); - } + friendStore.updateLocalFavoriteFriends(); } /** @@ -1612,13 +1611,7 @@ export const useFavoriteStore = defineStore('Favorite', () => { getCachedFavoritesByObjectId(userId) || isInAnyLocalFriendGroup(userId); } - if ( - generalSettingsStore.localFavoriteFriendsGroups.includes( - `local:${group}` - ) - ) { - friendStore.updateLocalFavoriteFriends(); - } + friendStore.updateLocalFavoriteFriends(); } /** @@ -1627,13 +1620,7 @@ export const useFavoriteStore = defineStore('Favorite', () => { function deleteLocalFriendFavoriteGroup(group) { delete localFriendFavorites[group]; database.deleteFriendFavoriteGroup(group); - if ( - generalSettingsStore.localFavoriteFriendsGroups.includes( - `local:${group}` - ) - ) { - friendStore.updateLocalFavoriteFriends(); - } + friendStore.updateLocalFavoriteFriends(); } /** @@ -1701,6 +1688,7 @@ export const useFavoriteStore = defineStore('Favorite', () => { } replaceReactiveObject(localFriendFavorites, localFavorites); + friendStore.updateLocalFavoriteFriends(); } /** diff --git a/src/stores/friend.js b/src/stores/friend.js index 83acbc87..2de5b56a 100644 --- a/src/stores/friend.js +++ b/src/stores/friend.js @@ -305,26 +305,25 @@ export const useFriendStore = defineStore('Friend', () => { function updateLocalFavoriteFriends() { const favoriteStore = useFavoriteStore(); localFavoriteFriends.clear(); + const groups = generalSettingsStore.localFavoriteFriendsGroups; + const hasRemoteGroupFilter = groups.some( + (key) => !key.startsWith('local:') + ); + // Remote favorites: filter by selected remote groups for (const ref of favoriteStore.cachedFavorites.values()) { if ( ref.type === 'friend' && - (generalSettingsStore.localFavoriteFriendsGroups.includes( - ref.$groupKey - ) || - generalSettingsStore.localFavoriteFriendsGroups.length === - 0) + (!hasRemoteGroupFilter || groups.includes(ref.$groupKey)) ) { localFavoriteFriends.add(ref.favoriteId); } } - for (const selectedKey of generalSettingsStore.localFavoriteFriendsGroups) { - if (selectedKey.startsWith('local:')) { - const groupName = selectedKey.slice(6); - const userIds = favoriteStore.localFriendFavorites[groupName]; - if (userIds) { - for (let i = 0; i < userIds.length; ++i) { - localFavoriteFriends.add(userIds[i]); - } + // Local favorites: always include all + for (const groupName in favoriteStore.localFriendFavorites) { + const userIds = favoriteStore.localFriendFavorites[groupName]; + if (userIds) { + for (let i = 0; i < userIds.length; ++i) { + localFavoriteFriends.add(userIds[i]); } } } diff --git a/src/stores/settings/appearance.js b/src/stores/settings/appearance.js index 3df47c68..7ae2d7ea 100644 --- a/src/stores/settings/appearance.js +++ b/src/stores/settings/appearance.js @@ -77,6 +77,7 @@ export const useAppearanceSettingsStore = defineStore( const isSidebarGroupByInstance = ref(true); const isHideFriendsInSameInstance = ref(false); const isSidebarDivideByFriendGroup = ref(false); + const sidebarFavoriteGroups = ref([]); const hideUserNotes = ref(false); const hideUserMemos = ref(false); const hideUnfriends = ref(false); @@ -150,6 +151,7 @@ export const useAppearanceSettingsStore = defineStore( isSidebarGroupByInstanceConfig, isHideFriendsInSameInstanceConfig, isSidebarDivideByFriendGroupConfig, + sidebarFavoriteGroupsConfig, hideUserNotesConfig, hideUserMemosConfig, hideUnfriendsConfig, @@ -205,6 +207,7 @@ export const useAppearanceSettingsStore = defineStore( 'VRCX_sidebarDivideByFriendGroup', true ), + configRepository.getString('VRCX_sidebarFavoriteGroups', '[]'), configRepository.getBool('VRCX_hideUserNotes', false), configRepository.getBool('VRCX_hideUserMemos', false), configRepository.getBool('VRCX_hideUnfriends', false), @@ -293,6 +296,9 @@ export const useAppearanceSettingsStore = defineStore( isHideFriendsInSameInstanceConfig; isSidebarDivideByFriendGroup.value = isSidebarDivideByFriendGroupConfig; + sidebarFavoriteGroups.value = JSON.parse( + sidebarFavoriteGroupsConfig + ); hideUserNotes.value = hideUserNotesConfig; hideUserMemos.value = hideUserMemosConfig; hideUnfriends.value = hideUnfriendsConfig; @@ -701,6 +707,16 @@ export const useAppearanceSettingsStore = defineStore( isSidebarDivideByFriendGroup.value ); } + /** + * @param {string[]} value + */ + function setSidebarFavoriteGroups(value) { + sidebarFavoriteGroups.value = value; + configRepository.setString( + 'VRCX_sidebarFavoriteGroups', + JSON.stringify(value) + ); + } function setHideUserNotes() { hideUserNotes.value = !hideUserNotes.value; configRepository.setBool('VRCX_hideUserNotes', hideUserNotes.value); @@ -958,6 +974,7 @@ export const useAppearanceSettingsStore = defineStore( isSidebarGroupByInstance, isHideFriendsInSameInstance, isSidebarDivideByFriendGroup, + sidebarFavoriteGroups, hideUserNotes, hideUserMemos, hideUnfriends, @@ -995,6 +1012,7 @@ export const useAppearanceSettingsStore = defineStore( setIsSidebarGroupByInstance, setIsHideFriendsInSameInstance, setIsSidebarDivideByFriendGroup, + setSidebarFavoriteGroups, setHideUserNotes, setHideUserMemos, setHideUnfriends, diff --git a/src/views/Settings/components/Tabs/AppearanceTab.vue b/src/views/Settings/components/Tabs/AppearanceTab.vue index dda4b1e1..4518ddc6 100644 --- a/src/views/Settings/components/Tabs/AppearanceTab.vue +++ b/src/views/Settings/components/Tabs/AppearanceTab.vue @@ -224,123 +224,7 @@ :value="dtIsoFormat" @change="setDtIsoFormat" /> -
+ -