From 5d36163eef7230b32003f3a9464253cbd861146d Mon Sep 17 00:00:00 2001 From: Natsumi Date: Mon, 16 Feb 2026 23:43:17 +1100 Subject: [PATCH] Fix avatar time spent and reload dialog when opening same dialog when no dialog is open --- Dotnet/Program.cs | 7 +++++-- src/stores/avatar.js | 8 ++++---- src/stores/group.js | 4 ++-- src/stores/ui.js | 1 + src/stores/user.js | 4 ++-- src/stores/world.js | 10 +++++----- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Dotnet/Program.cs b/Dotnet/Program.cs index 66cfba8a..73488092 100644 --- a/Dotnet/Program.cs +++ b/Dotnet/Program.cs @@ -203,8 +203,11 @@ namespace VRCX } logger.Fatal(e, "Unhandled Exception, program dying"); - MessageBox.Show(e.ToString(), "PLEASE REPORT IN https://vrcx.app/discord", MessageBoxButtons.OK, - MessageBoxIcon.Error); + var result = MessageBox.Show(e.ToString(), $"{Version} crashed, open Discord for support?", MessageBoxButtons.YesNo, MessageBoxIcon.Error); + if (result == DialogResult.Yes) + { + AppApiInstance.OpenLink("https://vrcx.app/discord"); + } Environment.Exit(0); } } diff --git a/src/stores/avatar.js b/src/stores/avatar.js index ab9f85ec..c1aebed1 100644 --- a/src/stores/avatar.js +++ b/src/stores/avatar.js @@ -178,14 +178,14 @@ export const useAvatarStore = defineStore('Avatar', () => { */ function showAvatarDialog(avatarId) { const D = avatarDialog.value; - uiStore.openDialog({ + const isMainDialogOpen = uiStore.openDialog({ type: 'avatar', id: avatarId }); D.visible = true; - if (D.id === avatarId) { + if (isMainDialogOpen && D.id === avatarId) { uiStore.setDialogCrumbLabel('avatar', D.id, D.ref?.name || D.id); - D.loading = false; + nextTick(() => (D.loading = false)); return; } D.loading = true; @@ -213,7 +213,7 @@ export const useAvatarStore = defineStore('Avatar', () => { if (typeof ref2 !== 'undefined') { D.ref = ref2; uiStore.setDialogCrumbLabel('avatar', D.id, D.ref?.name || D.id); - D.loading = false; + nextTick(() => (D.loading = false)); } avatarRequest .getAvatar({ avatarId }) diff --git a/src/stores/group.js b/src/stores/group.js index 36899ea8..cbd9d7a2 100644 --- a/src/stores/group.js +++ b/src/stores/group.js @@ -131,13 +131,13 @@ export const useGroupStore = defineStore('Group', () => { if (!groupId) { return; } - uiStore.openDialog({ + const isMainDialogOpen = uiStore.openDialog({ type: 'group', id: groupId }); const D = groupDialog.value; D.visible = true; - if (D.id === groupId) { + if (isMainDialogOpen && D.id === groupId) { uiStore.setDialogCrumbLabel('group', D.id, D.ref?.name || D.id); instanceStore.applyGroupDialogInstances(); D.loading = false; diff --git a/src/stores/ui.js b/src/stores/ui.js index ca5da20e..773badce 100644 --- a/src/stores/ui.js +++ b/src/stores/ui.js @@ -230,6 +230,7 @@ export const useUiStore = defineStore('Ui', () => { clearDialogCrumbs(); } pushDialogCrumb(type, id, label); + return hadActiveDialog; } // Make sure file drops outside of the screenshot manager don't navigate to the file path dropped. diff --git a/src/stores/user.js b/src/stores/user.js index 8cf76321..290f71f8 100644 --- a/src/stores/user.js +++ b/src/stores/user.js @@ -778,13 +778,13 @@ export const useUserStore = defineStore('User', () => { ) { return; } - uiStore.openDialog({ + const isMainDialogOpen = uiStore.openDialog({ type: 'user', id: userId }); const D = userDialog.value; D.visible = true; - if (D.id === userId) { + if (isMainDialogOpen && D.id === userId) { uiStore.setDialogCrumbLabel( 'user', D.id, diff --git a/src/stores/world.js b/src/stores/world.js index ba7d87bc..0b73f744 100644 --- a/src/stores/world.js +++ b/src/stores/world.js @@ -1,4 +1,4 @@ -import { reactive, shallowReactive, watch } from 'vue'; +import { nextTick, reactive, shallowReactive, watch } from 'vue'; import { defineStore } from 'pinia'; import { toast } from 'vue-sonner'; import { useI18n } from 'vue-i18n'; @@ -82,15 +82,15 @@ export const useWorldStore = defineStore('World', () => { if (L.worldId === '') { return; } - uiStore.openDialog({ + const isMainDialogOpen = uiStore.openDialog({ type: 'world', id: L.worldId }); D.visible = true; - if (D.id === L.worldId) { + if (isMainDialogOpen && D.id === L.worldId) { uiStore.setDialogCrumbLabel('world', D.id, D.ref?.name || D.id); instanceStore.applyWorldDialogInstances(); - D.loading = false; + nextTick(() => (D.loading = false)); return; } L.shortName = shortName; @@ -144,7 +144,7 @@ export const useWorldStore = defineStore('World', () => { worldId: L.worldId }) .catch((err) => { - D.loading = false; + nextTick(() => (D.loading = false)); D.id = null; D.visible = false; uiStore.jumpBackDialogCrumb();