collapse offline friends by default, save collapse value (#6937)

This commit is contained in:
Prospector
2026-08-03 07:03:45 +00:00
committed by GitHub
parent 779edf0333
commit 2e43f6a42b
4 changed files with 50 additions and 3 deletions
@@ -17,17 +17,40 @@ import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { useFriends } from '@/composables/use-friends' import { useFriends } from '@/composables/use-friends'
import type { FriendWithUserData } from '@/helpers/friends.ts' import type { FriendWithUserData } from '@/helpers/friends.ts'
import type { ModrinthCredentials } from '@/helpers/mr_auth' import type { ModrinthCredentials } from '@/helpers/mr_auth'
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
import { useTheming } from '@/store/state'
const { formatMessage } = useVIntl() const { formatMessage } = useVIntl()
const { handleError } = injectNotificationManager() const { handleError } = injectNotificationManager()
const formatRelativeTime = useRelativeTime() const formatRelativeTime = useRelativeTime()
const themeStore = useTheming()
const props = defineProps<{ const props = defineProps<{
credentials: ModrinthCredentials | null credentials: ModrinthCredentials | null
signIn: () => void signIn: () => void
}>() }>()
type FriendsSectionCollapsedFlag =
| 'friends_active_collapsed'
| 'friends_online_collapsed'
| 'friends_offline_collapsed'
| 'friends_pending_collapsed'
function isFriendsSectionCollapsed(flag: FriendsSectionCollapsedFlag) {
return themeStore.getFeatureFlag(flag)
}
function setFriendsSectionCollapsed(flag: FriendsSectionCollapsedFlag, collapsed: boolean) {
themeStore.featureFlags[flag] = collapsed
getSettings()
.then((settings) => {
settings.feature_flags[flag] = collapsed
return setSettings(settings)
})
.catch(handleError)
}
const userCredentials = computed(() => props.credentials) const userCredentials = computed(() => props.credentials)
const { const {
friends: userFriends, friends: userFriends,
@@ -331,33 +354,42 @@ const messages = defineMessages({
<FriendsSection <FriendsSection
v-if="activeFriends.length > 0" v-if="activeFriends.length > 0"
:is-searching="!!search" :is-searching="!!search"
open-by-default :open-by-default="!isFriendsSectionCollapsed('friends_active_collapsed')"
:friends="activeFriends" :friends="activeFriends"
:heading="formatMessage(messages.active)" :heading="formatMessage(messages.active)"
:remove-friend="removeFriend" :remove-friend="removeFriend"
@on-open="setFriendsSectionCollapsed('friends_active_collapsed', false)"
@on-close="setFriendsSectionCollapsed('friends_active_collapsed', true)"
/> />
<FriendsSection <FriendsSection
v-if="onlineFriends.length > 0" v-if="onlineFriends.length > 0"
:is-searching="!!search" :is-searching="!!search"
open-by-default :open-by-default="!isFriendsSectionCollapsed('friends_online_collapsed')"
:friends="onlineFriends" :friends="onlineFriends"
:heading="formatMessage(messages.online)" :heading="formatMessage(messages.online)"
:remove-friend="removeFriend" :remove-friend="removeFriend"
@on-open="setFriendsSectionCollapsed('friends_online_collapsed', false)"
@on-close="setFriendsSectionCollapsed('friends_online_collapsed', true)"
/> />
<FriendsSection <FriendsSection
v-if="offlineFriends.length > 0" v-if="offlineFriends.length > 0"
:is-searching="!!search" :is-searching="!!search"
:open-by-default="activeFriends.length + onlineFriends.length < 3" :open-by-default="!isFriendsSectionCollapsed('friends_offline_collapsed')"
:friends="offlineFriends" :friends="offlineFriends"
:heading="formatMessage(messages.offline)" :heading="formatMessage(messages.offline)"
:remove-friend="removeFriend" :remove-friend="removeFriend"
@on-open="setFriendsSectionCollapsed('friends_offline_collapsed', false)"
@on-close="setFriendsSectionCollapsed('friends_offline_collapsed', true)"
/> />
<FriendsSection <FriendsSection
v-if="pendingFriends.length > 0" v-if="pendingFriends.length > 0"
:is-searching="!!search" :is-searching="!!search"
:open-by-default="!isFriendsSectionCollapsed('friends_pending_collapsed')"
:friends="pendingFriends" :friends="pendingFriends"
:heading="formatMessage(messages.pending)" :heading="formatMessage(messages.pending)"
:remove-friend="removeFriend" :remove-friend="removeFriend"
@on-open="setFriendsSectionCollapsed('friends_pending_collapsed', false)"
@on-close="setFriendsSectionCollapsed('friends_pending_collapsed', true)"
/> />
<p v-if="filteredFriends.length === 0 && search" class="text-sm text-secondary my-1 mx-4"> <p v-if="filteredFriends.length === 0 && search" class="text-sm text-secondary my-1 mx-4">
{{ formatMessage(messages.noFriendsMatch, { query: search }) }} {{ formatMessage(messages.noFriendsMatch, { query: search }) }}
@@ -31,6 +31,11 @@ const props = withDefaults(
}, },
) )
const emit = defineEmits<{
onOpen: []
onClose: []
}>()
function createContextMenuOptions(friend: FriendWithUserData) { function createContextMenuOptions(friend: FriendWithUserData) {
if (friend.accepted) { if (friend.accepted) {
return [ return [
@@ -112,6 +117,8 @@ const messages = defineMessages({
? '' ? ''
: ' cursor-pointer hover:brightness-[--hover-brightness] active:scale-[0.98] transition-all') : ' cursor-pointer hover:brightness-[--hover-brightness] active:scale-[0.98] transition-all')
" "
@on-open="emit('onOpen')"
@on-close="emit('onClose')"
> >
<template #title> <template #title>
<h3 class="text-base text-primary font-medium m-0"> <h3 class="text-base text-primary font-medium m-0">
+4
View File
@@ -18,6 +18,10 @@ export const DEFAULT_FEATURE_FLAGS = {
advanced_filters_collapsed: true, advanced_filters_collapsed: true,
always_show_copy_details: false, always_show_copy_details: false,
hide_installed_modpacks: false, hide_installed_modpacks: false,
friends_active_collapsed: false,
friends_online_collapsed: false,
friends_offline_collapsed: true,
friends_pending_collapsed: true,
} }
export const THEME_OPTIONS = ['dark', 'light', 'oled', 'retro', 'system'] as const export const THEME_OPTIONS = ['dark', 'light', 'oled', 'retro', 'system'] as const
+4
View File
@@ -66,6 +66,10 @@ pub enum FeatureFlag {
AdvancedFiltersCollapsed, AdvancedFiltersCollapsed,
AlwaysShowCopyDetails, AlwaysShowCopyDetails,
HideInstalledModpacks, HideInstalledModpacks,
FriendsActiveCollapsed,
FriendsOnlineCollapsed,
FriendsOfflineCollapsed,
FriendsPendingCollapsed,
} }
impl Settings { impl Settings {