mirror of
https://github.com/modrinth/code.git
synced 2026-08-25 00:55:25 +00:00
collapse offline friends by default, save collapse value (#6937)
This commit is contained in:
@@ -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">
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ pub enum FeatureFlag {
|
|||||||
AdvancedFiltersCollapsed,
|
AdvancedFiltersCollapsed,
|
||||||
AlwaysShowCopyDetails,
|
AlwaysShowCopyDetails,
|
||||||
HideInstalledModpacks,
|
HideInstalledModpacks,
|
||||||
|
FriendsActiveCollapsed,
|
||||||
|
FriendsOnlineCollapsed,
|
||||||
|
FriendsOfflineCollapsed,
|
||||||
|
FriendsPendingCollapsed,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Settings {
|
impl Settings {
|
||||||
|
|||||||
Reference in New Issue
Block a user