diff --git a/src/components/dialogs/GroupDialog/GroupDialog.vue b/src/components/dialogs/GroupDialog/GroupDialog.vue index 4bcb064f..9ce088b7 100644 --- a/src/components/dialogs/GroupDialog/GroupDialog.vue +++ b/src/components/dialogs/GroupDialog/GroupDialog.vue @@ -368,7 +368,6 @@ :currentlocation="lastLocation.location" :instance="room.ref" :friendcount="room.friendCount" - :show-launch="false" refresh-tooltip="Refresh player count" :on-refresh="() => refreshInstancePlayerCount(room.tag)" /> @@ -1784,9 +1783,7 @@ groupDialogGalleryCurrentName.value = '0'; isGroupGalleryLoading.value = true; const groupId = groupDialog.value.id; - const tasks = (groupDialog.value.ref.galleries || []).map((gallery) => - getGroupGallery(groupId, gallery.id) - ); + const tasks = (groupDialog.value.ref.galleries || []).map((gallery) => getGroupGallery(groupId, gallery.id)); await Promise.allSettled(tasks); isGroupGalleryLoading.value = false; } diff --git a/src/views/Sidebar/components/GroupsSidebar.vue b/src/views/Sidebar/components/GroupsSidebar.vue index 7930db25..0fd8b102 100644 --- a/src/views/Sidebar/components/GroupsSidebar.vue +++ b/src/views/Sidebar/components/GroupsSidebar.vue @@ -30,22 +30,41 @@ @@ -60,15 +79,27 @@ import { computed, nextTick, onMounted, ref, watch } from 'vue'; import { ChevronDown } from 'lucide-vue-next'; import { storeToRefs } from 'pinia'; + import { toast } from 'vue-sonner'; + import { useI18n } from 'vue-i18n'; import { useVirtualizer } from '@tanstack/vue-virtual'; + import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuTrigger + } from '../../../components/ui/context-menu'; import { buildGroupHeaderRow, buildGroupItemRow, estimateGroupRowSize, getGroupId } from '../groupsSidebarUtils'; - import { useAppearanceSettingsStore, useGroupStore } from '../../../stores'; - import { convertFileUrlToImageUrl } from '../../../shared/utils'; + import { checkCanInviteSelf, convertFileUrlToImageUrl, parseLocation } from '../../../shared/utils'; + import { useAppearanceSettingsStore, useGroupStore, useLaunchStore } from '../../../stores'; + import { instanceRequest } from '../../../api'; import BackToTop from '../../../components/BackToTop.vue'; import Location from '../../../components/Location.vue'; + const { t } = useI18n(); + + const launchStore = useLaunchStore(); const { isAgeGatedInstancesVisible } = storeToRefs(useAppearanceSettingsStore()); const { showGroupDialog, sortGroupInstancesByInGame } = useGroupStore(); const { groupInstances } = storeToRefs(useGroupStore()); @@ -164,6 +195,31 @@ groupInstancesCfg.value[groupId].isCollapsed = !groupInstancesCfg.value[groupId].isCollapsed; } + /** + * @param {string} location - Instance location tag + */ + function groupInstanceLaunch(location) { + if (!location) return; + launchStore.showLaunchDialog(location); + } + + /** + * @param {string} location - Instance location tag + */ + function groupInstanceSelfInvite(location) { + if (!location) return; + const L = parseLocation(location); + if (!L.isRealInstance) return; + instanceRequest + .selfInvite({ + instanceId: L.instanceId, + worldId: L.worldId + }) + .then(() => { + toast.success(t('message.invite.self_sent')); + }); + } + onMounted(() => { nextTick(() => { virtualizer.value?.measure?.();