diff --git a/src/app.js b/src/app.js index aa1ebcf2..f1b17606 100644 --- a/src/app.js +++ b/src/app.js @@ -79,6 +79,7 @@ import ExportFriendsListDialog from './views/dialogs/favoritesDialog/ExportFrien import ExportAvatarsListDialog from './views/dialogs/favoritesDialog/ExportAvatarsListDialog.vue'; import GroupDialog from './views/dialogs/groupDialog/GroupDialog.vue'; import InviteGroupDialog from './views/dialogs/groupDialog/InviteGroupDialog.vue'; +import AvatarDialog from './views/dialogs/avatarDialog/AvatarDialog.vue'; // main app classes import _sharedFeed from './classes/sharedFeed.js'; @@ -240,6 +241,8 @@ console.log(`isLinux: ${LINUX}`); // - group GroupDialog, InviteGroupDialog, + // - avatar + AvatarDialog, // - favorites FriendImportDialog, WorldImportDialog, @@ -1395,14 +1398,14 @@ console.log(`isLinux: ${LINUX}`); return ref; }; - API.$on('AVATAR:IMPOSTER:DELETE', function (args) { - if ( - $app.avatarDialog.visible && - args.params.avatarId === $app.avatarDialog.id - ) { - $app.showAvatarDialog($app.avatarDialog.id); - } - }); + // API.$on('AVATAR:IMPOSTER:DELETE', function (args) { + // if ( + // $app.avatarDialog.visible && + // args.params.avatarId === $app.avatarDialog.id + // ) { + // $app.showAvatarDialog($app.avatarDialog.id); + // } + // }); // #endregion // #region | API: Notification @@ -1838,7 +1841,13 @@ console.log(`isLinux: ${LINUX}`); .finally(() => { this.isPlayerModerationsLoading = false; }) - .then(() => { + .then((res) => { + // 'AVATAR-MODERATION:LIST'; + // TODO: compare with cachedAvatarModerations + this.cachedAvatarModerations = new Map(); + for (var json of res[1]?.json) { + this.applyAvatarModeration(json); + } this.deleteExpiredPlayerModerations(); }); }; @@ -1848,32 +1857,6 @@ console.log(`isLinux: ${LINUX}`); API.cachedAvatarModerations = new Map(); - API.$on('AVATAR-MODERATION', function (args) { - args.ref = this.applyAvatarModeration(args.json); - }); - - API.$on('AVATAR-MODERATION:LIST', function (args) { - // TODO: compare with cachedAvatarModerations - this.cachedAvatarModerations = new Map(); - for (var json of args.json) { - this.applyAvatarModeration(json); - } - }); - - API.$on('AVATAR-MODERATION:DELETE', function (args) { - this.cachedAvatarModerations.delete(args.params.targetAvatarId); - - // update avatar dialog - var D = $app.avatarDialog; - if ( - D.visible && - args.params.avatarModerationType === 'block' && - D.id === args.params.targetAvatarId - ) { - D.isBlocked = false; - } - }); - API.applyAvatarModeration = function (json) { // fix inconsistent Unix time response if (typeof json.created === 'number') { @@ -9329,7 +9312,7 @@ console.log(`isLinux: ${LINUX}`); }) .then((args) => { this.currentInstanceWorld.ref = args.ref; - var { isPC, isQuest, isIos } = this.getAvailablePlatforms( + var { isPC, isQuest, isIos } = $utils.getAvailablePlatforms( args.ref.unityPackages ); this.currentInstanceWorld.isPC = isPC; @@ -9341,7 +9324,7 @@ console.log(`isLinux: ${LINUX}`); ); this.currentInstanceWorld.focusViewDisabled = args.ref?.tags.includes('feature_focus_view_disabled'); - this.checkVRChatCache(args.ref).then((cacheInfo) => { + $utils.checkVRChatCache(args.ref).then((cacheInfo) => { if (cacheInfo.Item1 > 0) { this.currentInstanceWorld.inCache = true; this.currentInstanceWorld.cacheSize = `${( @@ -9361,13 +9344,13 @@ console.log(`isLinux: ${LINUX}`); }) .then((args) => { this.currentInstanceWorld.ref = args.ref; - var { isPC, isQuest, isIos } = this.getAvailablePlatforms( + var { isPC, isQuest, isIos } = $utils.getAvailablePlatforms( args.ref.unityPackages ); this.currentInstanceWorld.isPC = isPC; this.currentInstanceWorld.isQuest = isQuest; this.currentInstanceWorld.isIos = isIos; - this.checkVRChatCache(args.ref).then((cacheInfo) => { + $utils.checkVRChatCache(args.ref).then((cacheInfo) => { if (cacheInfo.Item1 > 0) { this.currentInstanceWorld.inCache = true; this.currentInstanceWorld.cacheSize = `${( @@ -9397,74 +9380,6 @@ console.log(`isLinux: ${LINUX}`); } }; - $app.methods.getAvailablePlatforms = function (unityPackages) { - var isPC = false; - var isQuest = false; - var isIos = false; - if (typeof unityPackages === 'object') { - for (var unityPackage of unityPackages) { - if ( - unityPackage.variant && - unityPackage.variant !== 'standard' && - unityPackage.variant !== 'security' - ) { - continue; - } - if (unityPackage.platform === 'standalonewindows') { - isPC = true; - } else if (unityPackage.platform === 'android') { - isQuest = true; - } else if (unityPackage.platform === 'ios') { - isIos = true; - } - } - } - return { isPC, isQuest, isIos }; - }; - - $app.methods.getPlatformInfo = function (unityPackages) { - var pc = {}; - var android = {}; - var ios = {}; - if (typeof unityPackages === 'object') { - for (var unityPackage of unityPackages) { - if ( - unityPackage.variant && - unityPackage.variant !== 'standard' && - unityPackage.variant !== 'security' - ) { - continue; - } - if (unityPackage.platform === 'standalonewindows') { - if ( - unityPackage.performanceRating === 'None' && - pc.performanceRating - ) { - continue; - } - pc = unityPackage; - } else if (unityPackage.platform === 'android') { - if ( - unityPackage.performanceRating === 'None' && - android.performanceRating - ) { - continue; - } - android = unityPackage; - } else if (unityPackage.platform === 'ios') { - if ( - unityPackage.performanceRating === 'None' && - ios.performanceRating - ) { - continue; - } - ios = unityPackage; - } - } - } - return { pc, android, ios }; - }; - $app.methods.selectCurrentInstanceRow = function (val) { if (val === null) { return; @@ -10128,7 +10043,7 @@ console.log(`isLinux: ${LINUX}`); ) { continue; } - if (!this.compareUnityVersion(unityPackage.unitySortNumber)) { + if (!$utils.compareUnityVersion(unityPackage.unitySortNumber)) { continue; } @@ -10293,7 +10208,7 @@ console.log(`isLinux: ${LINUX}`); D.id ); } - var { isPC, isQuest, isIos } = this.getAvailablePlatforms( + var { isPC, isQuest, isIos } = $utils.getAvailablePlatforms( args.ref.unityPackages ); D.avatarScalingDisabled = args.ref?.tags.includes( @@ -10750,22 +10665,15 @@ console.log(`isLinux: ${LINUX}`); isPC: false, isQuest: false, isIos: false, - treeData: [], bundleSizes: [], platformInfo: {}, - timeSpent: 0, lastUpdated: '', inCache: false, cacheSize: 0, cacheLocked: false, - cachePath: '', - fileAnalysis: {} + cachePath: '' }; - API.$on('LOGOUT', function () { - $app.avatarDialog.visible = false; - }); - API.$on('FAVORITE', function (args) { var { ref } = args; var D = $app.avatarDialog; @@ -10784,13 +10692,10 @@ console.log(`isLinux: ${LINUX}`); }); $app.methods.showAvatarDialog = function (avatarId) { - this.$nextTick(() => $app.adjustDialogZ(this.$refs.avatarDialog.$el)); var D = this.avatarDialog; D.visible = true; D.loading = true; D.id = avatarId; - D.fileAnalysis = {}; - D.treeData = []; D.inCache = false; D.cacheSize = 0; D.cacheLocked = false; @@ -10804,13 +10709,11 @@ console.log(`isLinux: ${LINUX}`); D.lastUpdated = ''; D.bundleSizes = []; D.platformInfo = {}; - D.timeSpent = 0; D.isFavorite = API.cachedFavoritesByObjectId.has(avatarId) || (API.currentUser.$isVRCPlus && this.localAvatarFavoritesList.includes(avatarId)); D.isBlocked = API.cachedAvatarModerations.has(avatarId); - D.memo = ''; var ref2 = API.cachedAvatars.get(avatarId); if (typeof ref2 !== 'undefined') { D.ref = ref2; @@ -10823,18 +10726,6 @@ console.log(`isLinux: ${LINUX}`); return; } } - database.getAvatarTimeSpent(avatarId).then((aviTime) => { - if (D.id === aviTime.avatarId) { - D.timeSpent = aviTime.timeSpent; - if ( - D.id === API.currentUser.currentAvatar && - API.currentUser.$previousAvatarSwapTime - ) { - D.timeSpent += - Date.now() - API.currentUser.$previousAvatarSwapTime; - } - } - }); avatarRequest .getAvatar({ avatarId }) .then((args) => { @@ -10850,13 +10741,13 @@ console.log(`isLinux: ${LINUX}`); if (/quest/.test(ref.tags)) { D.isQuestFallback = true; } - var { isPC, isQuest, isIos } = this.getAvailablePlatforms( + var { isPC, isQuest, isIos } = $utils.getAvailablePlatforms( args.ref.unityPackages ); D.isPC = isPC; D.isQuest = isQuest; D.isIos = isIos; - D.platformInfo = this.getPlatformInfo(args.ref.unityPackages); + D.platformInfo = $utils.getPlatformInfo(args.ref.unityPackages); for (let i = ref.unityPackages.length - 1; i > -1; i--) { var unityPackage = ref.unityPackages[i]; if (unityPackage.variant === 'impostor') { @@ -10872,31 +10763,11 @@ console.log(`isLinux: ${LINUX}`); } }) .catch((err) => { - D.loading = false; D.visible = false; throw err; }) .finally(() => { - D.loading = false; - }); - this.getAvatarMemo(avatarId).then((memo) => { - if (D.id === memo.avatarId) { - D.memo = memo.memo; - } - }); - }; - - $app.methods.selectAvatar = function (id) { - avatarRequest - .selectAvatar({ - avatarId: id - }) - .then((args) => { - this.$message({ - message: 'Avatar changed', - type: 'success' - }); - return args; + this.$nextTick(() => (D.loading = false)); }); }; @@ -10935,192 +10806,6 @@ console.log(`isLinux: ${LINUX}`); }); }; - $app.methods.avatarDialogCommand = function (command) { - var D = this.avatarDialog; - if (D.visible === false) { - return; - } - switch (command) { - case 'Refresh': - this.showAvatarDialog(D.id); - break; - case 'Share': - this.copyAvatarUrl(D.id); - break; - case 'Rename': - this.promptRenameAvatar(D); - break; - case 'Change Image': - this.displayPreviousImages('Avatar', 'Change'); - break; - case 'Previous Images': - this.displayPreviousImages('Avatar', 'Display'); - break; - case 'Change Description': - this.promptChangeAvatarDescription(D); - break; - case 'Change Content Tags': - this.showSetAvatarTagsDialog(D.id); - break; - case 'Download Unity Package': - this.openExternalLink( - this.replaceVrcPackageUrl( - this.avatarDialog.ref.unityPackageUrl - ) - ); - break; - case 'Add Favorite': - this.showFavoriteDialog('avatar', D.id); - break; - default: - this.$confirm(`Continue? ${command}`, 'Confirm', { - confirmButtonText: 'Confirm', - cancelButtonText: 'Cancel', - type: 'info', - callback: (action) => { - if (action !== 'confirm') { - return; - } - switch (command) { - case 'Delete Favorite': - favoriteRequest.deleteFavorite({ - objectId: D.id - }); - break; - case 'Select Fallback Avatar': - avatarRequest - .selectFallbackAvatar({ - avatarId: D.id - }) - .then((args) => { - this.$message({ - message: 'Fallback avatar changed', - type: 'success' - }); - return args; - }); - break; - case 'Block Avatar': - avatarModerationRequest - .sendAvatarModeration({ - avatarModerationType: 'block', - targetAvatarId: D.id - }) - .then((args) => { - this.$message({ - message: 'Avatar blocked', - type: 'success' - }); - return args; - }); - break; - case 'Unblock Avatar': - avatarModerationRequest.deleteAvatarModeration({ - avatarModerationType: 'block', - targetAvatarId: D.id - }); - break; - case 'Make Public': - avatarRequest - .saveAvatar({ - id: D.id, - releaseStatus: 'public' - }) - .then((args) => { - this.$message({ - message: 'Avatar updated to public', - type: 'success' - }); - return args; - }); - break; - case 'Make Private': - avatarRequest - .saveAvatar({ - id: D.id, - releaseStatus: 'private' - }) - .then((args) => { - this.$message({ - message: - 'Avatar updated to private', - type: 'success' - }); - return args; - }); - break; - case 'Delete': - avatarRequest - .deleteAvatar({ - avatarId: D.id - }) - .then((args) => { - this.$message({ - message: 'Avatar deleted', - type: 'success' - }); - D.visible = false; - return args; - }); - break; - case 'Delete Imposter': - avatarRequest - .deleteImposter({ - avatarId: D.id - }) - .then((args) => { - this.$message({ - message: 'Imposter deleted', - type: 'success' - }); - this.showAvatarDialog(D.id); - return args; - }); - break; - case 'Create Imposter': - avatarRequest - .createImposter({ - avatarId: D.id - }) - .then((args) => { - this.$message({ - message: - 'Imposter queued for creation', - type: 'success' - }); - return args; - }); - break; - case 'Regenerate Imposter': - avatarRequest - .deleteImposter({ - avatarId: D.id - }) - .then((args) => { - return args; - }) - .finally(() => { - avatarRequest - .createImposter({ - avatarId: D.id - }) - .then((args) => { - this.$message({ - message: - 'Imposter deleted and queued for creation', - type: 'success' - }); - return args; - }); - }); - break; - } - } - }); - break; - } - }; - $app.methods.checkAvatarCache = function (fileId) { var avatarId = ''; for (var ref of API.cachedAvatars.values()) { @@ -11192,37 +10877,6 @@ console.log(`isLinux: ${LINUX}`); } }; - $app.methods.refreshAvatarDialogTreeData = function () { - var D = this.avatarDialog; - D.treeData = $utils.buildTreeData(D.ref); - }; - - $app.computed.avatarDialogPlatform = function () { - var { ref } = this.avatarDialog; - var platforms = []; - if (ref.unityPackages) { - for (var unityPackage of ref.unityPackages) { - if ( - unityPackage.variant && - unityPackage.variant !== 'standard' && - unityPackage.variant !== 'security' - ) { - continue; - } - var platform = 'PC'; - if (unityPackage.platform === 'standalonewindows') { - platform = 'PC'; - } else if (unityPackage.platform === 'android') { - platform = 'Android'; - } else if (unityPackage.platform) { - ({ platform } = unityPackage); - } - platforms.push(`${platform}/${unityPackage.unityVersion}`); - } - } - return platforms.join(', '); - }; - // #endregion // #region | App: Favorite Dialog @@ -11763,251 +11417,6 @@ console.log(`isLinux: ${LINUX}`); D.visible = true; }; - // #endregion - // #region | App: Set Avatar Tags Dialog - - $app.data.setAvatarTagsDialog = { - visible: false, - loading: false, - ownAvatars: [], - selectedCount: 0, - forceUpdate: 0, - selectedTags: [], - selectedTagsCsv: '', - contentHorror: false, - contentGore: false, - contentViolence: false, - contentAdult: false, - contentSex: false - }; - - $app.methods.showSetAvatarTagsDialog = function (avatarId) { - this.$nextTick(() => - $app.adjustDialogZ(this.$refs.setAvatarTagsDialog.$el) - ); - var D = this.setAvatarTagsDialog; - D.visible = true; - D.loading = false; - D.ownAvatars = []; - D.forceUpdate = 0; - D.selectedTags = []; - D.selectedTagsCsv = ''; - D.contentHorror = false; - D.contentGore = false; - D.contentViolence = false; - D.contentAdult = false; - D.contentSex = false; - var oldTags = this.avatarDialog.ref.tags; - oldTags.forEach((tag) => { - switch (tag) { - case 'content_horror': - D.contentHorror = true; - break; - case 'content_gore': - D.contentGore = true; - break; - case 'content_violence': - D.contentViolence = true; - break; - case 'content_adult': - D.contentAdult = true; - break; - case 'content_sex': - D.contentSex = true; - break; - default: - if (tag.startsWith('content_')) { - D.selectedTags.push(tag.substring(8)); - } - break; - } - }); - for (var ref of API.cachedAvatars.values()) { - if (ref.authorId === API.currentUser.id) { - ref.$selected = false; - ref.$tagString = ''; - if (avatarId === ref.id) { - ref.$selected = true; - var conentTags = []; - ref.tags.forEach((tag) => { - if (tag.startsWith('content_')) { - conentTags.push(tag.substring(8)); - } - }); - for (var i = 0; i < conentTags.length; ++i) { - var tag = conentTags[i]; - if (i < conentTags.length - 1) { - ref.$tagString += `${tag}, `; - } else { - ref.$tagString += tag; - } - } - } - D.ownAvatars.push(ref); - } - } - this.updateAvatarTagsSelection(); - this.updateSelectedAvatarTags(); - }; - - $app.methods.updateSelectedAvatarTags = function () { - var D = this.setAvatarTagsDialog; - if (D.contentHorror) { - if (!D.selectedTags.includes('content_horror')) { - D.selectedTags.push('content_horror'); - } - } else if (D.selectedTags.includes('content_horror')) { - D.selectedTags.splice(D.selectedTags.indexOf('content_horror'), 1); - } - if (D.contentGore) { - if (!D.selectedTags.includes('content_gore')) { - D.selectedTags.push('content_gore'); - } - } else if (D.selectedTags.includes('content_gore')) { - D.selectedTags.splice(D.selectedTags.indexOf('content_gore'), 1); - } - if (D.contentViolence) { - if (!D.selectedTags.includes('content_violence')) { - D.selectedTags.push('content_violence'); - } - } else if (D.selectedTags.includes('content_violence')) { - D.selectedTags.splice( - D.selectedTags.indexOf('content_violence'), - 1 - ); - } - if (D.contentAdult) { - if (!D.selectedTags.includes('content_adult')) { - D.selectedTags.push('content_adult'); - } - } else if (D.selectedTags.includes('content_adult')) { - D.selectedTags.splice(D.selectedTags.indexOf('content_adult'), 1); - } - if (D.contentSex) { - if (!D.selectedTags.includes('content_sex')) { - D.selectedTags.push('content_sex'); - } - } else if (D.selectedTags.includes('content_sex')) { - D.selectedTags.splice(D.selectedTags.indexOf('content_sex'), 1); - } - - D.selectedTagsCsv = D.selectedTags.join(',').replace(/content_/g, ''); - }; - - $app.methods.updateInputAvatarTags = function () { - var D = this.setAvatarTagsDialog; - D.contentHorror = false; - D.contentGore = false; - D.contentViolence = false; - D.contentAdult = false; - D.contentSex = false; - var tags = D.selectedTagsCsv.split(','); - D.selectedTags = []; - for (var tag of tags) { - switch (tag) { - case 'horror': - D.contentHorror = true; - break; - case 'gore': - D.contentGore = true; - break; - case 'violence': - D.contentViolence = true; - break; - case 'adult': - D.contentAdult = true; - break; - case 'sex': - D.contentSex = true; - break; - } - if (!D.selectedTags.includes(`content_${tag}`)) { - D.selectedTags.push(`content_${tag}`); - } - } - }; - - $app.data.avatarContentTags = [ - 'content_horror', - 'content_gore', - 'content_violence', - 'content_adult', - 'content_sex' - ]; - - $app.methods.saveSetAvatarTagsDialog = async function () { - var D = this.setAvatarTagsDialog; - if (D.loading) { - return; - } - D.loading = true; - try { - for (var i = D.ownAvatars.length - 1; i >= 0; --i) { - var ref = D.ownAvatars[i]; - if (!D.visible) { - break; - } - if (!ref.$selected) { - continue; - } - var tags = [...D.selectedTags]; - for (var tag of ref.tags) { - if (!tag.startsWith('content_')) { - tags.push(tag); - } - } - await avatarRequest.saveAvatar({ - id: ref.id, - tags - }); - D.selectedCount--; - } - } catch (err) { - this.$message({ - message: 'Error saving avatar tags', - type: 'error' - }); - } finally { - D.loading = false; - D.visible = false; - } - }; - - $app.methods.updateAvatarTagsSelection = function () { - var D = this.setAvatarTagsDialog; - D.selectedCount = 0; - for (var ref of D.ownAvatars) { - if (ref.$selected) { - D.selectedCount++; - } - ref.$tagString = ''; - var conentTags = []; - ref.tags.forEach((tag) => { - if (tag.startsWith('content_')) { - conentTags.push(tag.substring(8)); - } - }); - for (var i = 0; i < conentTags.length; ++i) { - var tag = conentTags[i]; - if (i < conentTags.length - 1) { - ref.$tagString += `${tag}, `; - } else { - ref.$tagString += tag; - } - } - } - this.setAvatarTagsDialog.forceUpdate++; - }; - - $app.methods.setAvatarTagsSelectToggle = function () { - var D = this.setAvatarTagsDialog; - var allSelected = D.ownAvatars.length === D.selectedCount; - for (var ref of D.ownAvatars) { - ref.$selected = !allSelected; - } - this.updateAvatarTagsSelection(); - }; - // #endregion // #region | App: Notification position @@ -12176,22 +11585,6 @@ console.log(`isLinux: ${LINUX}`); document.getElementById('copy_to_clipboard').remove(); }; - $app.methods.copyAvatarId = function (avatarId) { - this.$message({ - message: 'Avatar ID copied to clipboard', - type: 'success' - }); - this.copyToClipboard(avatarId); - }; - - $app.methods.copyAvatarUrl = function (avatarId) { - this.$message({ - message: 'Avatar URL copied to clipboard', - type: 'success' - }); - this.copyToClipboard(`https://vrchat.com/home/avatar/${avatarId}`); - }; - $app.methods.copyUserId = function (userId) { this.$message({ message: 'User ID copied to clipboard', @@ -14760,7 +14153,7 @@ console.log(`isLinux: ${LINUX}`); D.cacheSize = 0; D.cacheLocked = false; D.cachePath = ''; - this.checkVRChatCache(D.ref).then((cacheInfo) => { + $utils.checkVRChatCache(D.ref).then((cacheInfo) => { if (cacheInfo.Item1 > 0) { D.inCache = true; D.cacheSize = `${(cacheInfo.Item1 / 1048576).toFixed( @@ -14780,7 +14173,7 @@ console.log(`isLinux: ${LINUX}`); D.cacheSize = 0; D.cacheLocked = false; D.cachePath = ''; - this.checkVRChatCache(D.ref).then((cacheInfo) => { + $utils.checkVRChatCache(D.ref).then((cacheInfo) => { if (cacheInfo.Item1 > 0) { D.inCache = true; D.cacheSize = `${(cacheInfo.Item1 / 1048576).toFixed( @@ -14793,50 +14186,6 @@ console.log(`isLinux: ${LINUX}`); } }; - // eslint-disable-next-line require-await - $app.methods.checkVRChatCache = async function (ref) { - if (!ref.unityPackages) { - return { Item1: -1, Item2: false, Item3: '' }; - } - var assetUrl = ''; - var variant = ''; - for (var i = ref.unityPackages.length - 1; i > -1; i--) { - var unityPackage = ref.unityPackages[i]; - if (unityPackage.variant && unityPackage.variant !== 'security') { - continue; - } - if ( - unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) - ) { - assetUrl = unityPackage.assetUrl; - if (unityPackage.variant !== 'standard') { - variant = unityPackage.variant; - } - break; - } - } - if (!assetUrl) { - assetUrl = ref.assetUrl; - } - var id = $utils.extractFileId(assetUrl); - var version = parseInt($utils.extractFileVersion(assetUrl), 10); - var variantVersion = parseInt( - $utils.extractVariantVersion(assetUrl), - 10 - ); - if (!id || !version) { - return { Item1: -1, Item2: false, Item3: '' }; - } - - return AssetBundleManager.CheckVRChatCache( - id, - version, - variant, - variantVersion - ); - }; - $app.methods.getDisplayName = function (userId) { if (userId) { var ref = API.cachedUsers.get(userId); @@ -14848,40 +14197,7 @@ console.log(`isLinux: ${LINUX}`); }; $app.methods.deleteVRChatCache = async function (ref) { - var assetUrl = ''; - var variant = ''; - for (var i = ref.unityPackages.length - 1; i > -1; i--) { - var unityPackage = ref.unityPackages[i]; - if ( - unityPackage.variant && - unityPackage.variant !== 'standard' && - unityPackage.variant !== 'security' - ) { - continue; - } - if ( - unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) - ) { - assetUrl = unityPackage.assetUrl; - if (unityPackage.variant !== 'standard') { - variant = unityPackage.variant; - } - break; - } - } - var id = $utils.extractFileId(assetUrl); - var version = parseInt($utils.extractFileVersion(assetUrl), 10); - var variantVersion = parseInt( - $utils.extractVariantVersion(assetUrl), - 10 - ); - await AssetBundleManager.DeleteCache( - id, - version, - variant, - variantVersion - ); + await $utils.deleteVRChatCache(ref); this.getVRChatCacheSize(); this.updateVRChatWorldCache(); this.updateVRChatAvatarCache(); @@ -15000,7 +14316,7 @@ console.log(`isLinux: ${LINUX}`); } if ( unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) + $utils.compareUnityVersion(unityPackage.unitySortNumber) ) { assetUrl = unityPackage.assetUrl; if (unityPackage.variant !== 'standard') { @@ -15023,7 +14339,7 @@ console.log(`isLinux: ${LINUX}`); var unityPackage = unityPackages[i]; if ( unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) + $utils.compareUnityVersion(unityPackage.unitySortNumber) ) { assetUrl = unityPackage.assetUrl; break; @@ -16213,52 +15529,6 @@ console.log(`isLinux: ${LINUX}`); await configRepository.setInt('VRCX_sidePanelWidth', this.asideWidth); }; - $app.methods.compareUnityVersion = function (unitySortNumber) { - if (!API.cachedConfig.sdkUnityVersion) { - console.error('No cachedConfig.sdkUnityVersion'); - return false; - } - - // 2022.3.6f1 2022 03 06 000 - // 2019.4.31f1 2019 04 31 000 - // 5.3.4p1 5 03 04 010 - // 2019.4.31f1c1 is a thing - var array = API.cachedConfig.sdkUnityVersion.split('.'); - if (array.length < 3) { - console.error('Invalid cachedConfig.sdkUnityVersion'); - return false; - } - var currentUnityVersion = array[0]; - currentUnityVersion += array[1].padStart(2, '0'); - var indexFirstLetter = array[2].search(/[a-zA-Z]/); - if (indexFirstLetter > -1) { - currentUnityVersion += array[2] - .substr(0, indexFirstLetter) - .padStart(2, '0'); - currentUnityVersion += '0'; - var letter = array[2].substr(indexFirstLetter, 1); - if (letter === 'p') { - currentUnityVersion += '1'; - } else { - // f - currentUnityVersion += '0'; - } - currentUnityVersion += '0'; - } else { - // just in case - currentUnityVersion += '000'; - } - // just in case - currentUnityVersion = currentUnityVersion.replace(/\D/g, ''); - - if ( - parseInt(unitySortNumber, 10) <= parseInt(currentUnityVersion, 10) - ) { - return true; - } - return false; - }; - /** * @param {object} user - User Ref Object * @param {boolean} isIcon - is use for icon (about 40x40) @@ -18654,32 +17924,6 @@ console.log(`isLinux: ${LINUX}`); } }; - // use in avatar, user, group dialog - // TODO: better in utils - $app.methods.downloadAndSaveJson = function (fileName, data) { - if (!fileName || !data) { - return; - } - try { - var link = document.createElement('a'); - link.setAttribute( - 'href', - `data:application/json;charset=utf-8,${encodeURIComponent( - JSON.stringify(data, null, 2) - )}` - ); - link.setAttribute('download', `${fileName}.json`); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } catch { - new Noty({ - type: 'error', - text: $app.escapeTag('Failed to download JSON.') - }).show(); - } - }; - $app.methods.setPlayerModeration = function (userId, type) { var D = this.userDialog; AppApi.SetVRChatUserModeration(API.currentUser.id, userId, type).then( @@ -18909,79 +18153,6 @@ console.log(`isLinux: ${LINUX}`); return text.replace(/([^!])\[[^\]]+\]\([^)]+\)/g, '$1'); }; - API.$on('FILE:ANALYSIS', function (args) { - if ( - !$app.avatarDialog.visible || - $app.avatarDialog.id !== args.params.avatarId - ) { - return; - } - var ref = args.json; - if (typeof ref.fileSize !== 'undefined') { - ref._fileSize = `${(ref.fileSize / 1048576).toFixed(2)} MB`; - } - if (typeof ref.uncompressedSize !== 'undefined') { - ref._uncompressedSize = `${(ref.uncompressedSize / 1048576).toFixed( - 2 - )} MB`; - } - if (typeof ref.avatarStats?.totalTextureUsage !== 'undefined') { - ref._totalTextureUsage = `${( - ref.avatarStats.totalTextureUsage / 1048576 - ).toFixed(2)} MB`; - } - $app.avatarDialog.fileAnalysis = $utils.buildTreeData(args.json); - }); - - $app.methods.getAvatarFileAnalysis = function () { - var D = this.avatarDialog; - var avatarId = D.ref.id; - var assetUrl = ''; - var variant = 'security'; - for (let i = D.ref.unityPackages.length - 1; i > -1; i--) { - var unityPackage = D.ref.unityPackages[i]; - if (unityPackage.variant !== 'security') { - continue; - } - if ( - unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) - ) { - assetUrl = unityPackage.assetUrl; - break; - } - } - if (!assetUrl) { - for (let i = D.ref.unityPackages.length - 1; i > -1; i--) { - var unityPackage = D.ref.unityPackages[i]; - if (unityPackage.variant !== 'standard') { - continue; - } - if ( - unityPackage.platform === 'standalonewindows' && - this.compareUnityVersion(unityPackage.unitySortNumber) - ) { - variant = 'standard'; - assetUrl = unityPackage.assetUrl; - break; - } - } - } - if (!assetUrl) { - assetUrl = D.ref.assetUrl; - } - var fileId = $utils.extractFileId(assetUrl); - var version = parseInt($utils.extractFileVersion(assetUrl), 10); - if (!fileId || !version) { - this.$message({ - message: 'File Analysis unavailable', - type: 'error' - }); - return; - } - miscRequest.getFileAnalysis({ fileId, version, variant, avatarId }); - }; - $app.methods.openFolderGeneric = function (path) { AppApi.OpenFolderAndSelectItem(path, true); }; @@ -19630,8 +18801,7 @@ console.log(`isLinux: ${LINUX}`); 'open-folder-generic': this.openFolderGeneric, 'delete-vrchat-cache': this.deleteVRChatCache, 'world-dialog-command': this.worldDialogCommand, - 'refresh-instance-player-count': this.refreshInstancePlayerCount, - 'download-and-save-json': this.downloadAndSaveJson + 'refresh-instance-player-count': this.refreshInstancePlayerCount }; }; @@ -19653,7 +18823,6 @@ console.log(`isLinux: ${LINUX}`); return { 'refresh-instance-player-count': this.refreshInstancePlayerCount, 'update-group-post-search': this.updateGroupPostSearch, - 'download-and-save-json': this.downloadAndSaveJson, 'group-dialog-command': this.groupDialogCommand, 'get-group-dialog-group': this.getGroupDialogGroup, 'clear-image-gallery-select': this.clearImageGallerySelect, @@ -19683,6 +18852,21 @@ console.log(`isLinux: ${LINUX}`); }; }; + $app.computed.avatarDialogBind = function () { + return { + avatarDialog: this.avatarDialog, + hideTooltips: this.hideTooltips, + isGameRunning: this.isGameRunning + }; + }; + + $app.computed.avatarDialogEvent = function () { + return { + openFolderGeneric: this.openFolderGeneric, + deleteVRChatCache: this.deleteVRChatCache + }; + }; + // #endregion // #region | Electron diff --git a/src/app.pug b/src/app.pug index e7bbf7c9..11d34c63 100644 --- a/src/app.pug +++ b/src/app.pug @@ -43,14 +43,14 @@ doctype html include ./mixins/tabs/search.pug +searchTab - favorites-tab(v-bind='favoritesTabBind' v-on='favoritesTabEvent') + FavoritesTab(v-bind='favoritesTabBind' v-on='favoritesTabEvent') //- friendLog include ./mixins/tabs/friendLog.pug +friendLogTab //- moderation - moderation-tab(v-bind='moderationTabBind') + ModerationTab(v-bind='moderationTabBind') //- notification include ./mixins/tabs/notifications.pug @@ -61,25 +61,22 @@ doctype html +profileTab //- friends list - friends-list-tab(v-bind='friendsListTabBind' v-on='friendsListTabEvent') + FriendsListTab(v-bind='friendsListTabBind' v-on='friendsListTabEvent') //- charts keep-alive - charts-tab(v-if='menuActiveIndex === "charts"' v-bind='chartsTabBind' v-on='chartsTabEvent') + ChartsTab(v-if='menuActiveIndex === "charts"' v-bind='chartsTabBind' v-on='chartsTabEvent') //- settings include ./mixins/tabs/settings.pug +settingsTab - side-bar(v-bind='sideBarTabBind' v-on='sideBarTabEvent') + SideBar(v-bind='sideBarTabBind' v-on='sideBarTabEvent') //- ## Dialogs ## -\\ include ./mixins/dialogs/userDialog.pug +userDialog - include ./mixins/dialogs/avatarDialog.pug - +avatarDialog - include ./mixins/dialogs/images.pug +images @@ -107,40 +104,40 @@ doctype html include ./mixins/dialogs/settings.pug +settings - include ./mixins/dialogs/tags.pug - +tags - include ./mixins/dialogs/boops.pug +boops //- previous instances - previous-instances-info-dialog(v-bind='previousInstancesInfoDialogBind' v-on='previousInstancesInfoDialogEvent') + PreviousInstancesInfoDialog(v-bind='previousInstancesInfoDialogBind' v-on='previousInstancesInfoDialogEvent') - previous-instances-user-dialog(v-bind='previousInstancesUserDialogBind' v-on='previousInstancesUserDialogEvent') + PreviousInstancesUserDialog(v-bind='previousInstancesUserDialogBind' v-on='previousInstancesUserDialogEvent') //- favorites - friend-import-dialog(v-bind='friendImportDialogBind' v-on='friendImportDialogEvent') + FriendImportDialog(v-bind='friendImportDialogBind' v-on='friendImportDialogEvent') - world-import-dialog(v-bind='worldImportDialogBind' v-on='worldImportDialogEvent') + WorldImportDialog(v-bind='worldImportDialogBind' v-on='worldImportDialogEvent') - avatar-import-dialog(v-bind='avatarImportDialogBind' v-on='avatarImportDialogEvent') + AvatarImportDialog(v-bind='avatarImportDialogBind' v-on='avatarImportDialogEvent') //- favorites dialog - favorite-dialog(v-bind='favoriteDialogBind' v-on='favoriteDialogEvent') + FavoriteDialog(v-bind='favoriteDialogBind' v-on='favoriteDialogEvent') - export-friends-list-dialog(v-bind='exportFriendsListDialogBind' v-on='exportFriendsListDialogEvent') + ExportFriendsListDialog(v-bind='exportFriendsListDialogBind' v-on='exportFriendsListDialogEvent') - export-avatars-list-dialog(v-bind='exportAvatarsListDialogBind' v-on='exportAvatarsListDialogEvent') + ExportAvatarsListDialog(v-bind='exportAvatarsListDialogBind' v-on='exportAvatarsListDialogEvent') //- launch - launch-dialog(v-bind='launchDialogBind' v-on='launchDialogEvent') + LaunchDialog(v-bind='launchDialogBind' v-on='launchDialogEvent') //- world - world-dialog(v-bind='worldDialogBind' v-on='worldDialogEvent') + WorldDialog(v-bind='worldDialogBind' v-on='worldDialogEvent') //- group GroupDialog(v-bind='groupDialogBind' v-on='groupDialogEvent') InviteGroupDialog(v-bind='inviteGroupDialogBind' v-on='inviteGroupDialogEvent') + //- avatar + AvatarDialog(v-bind='avatarDialogBind' v-on='avatarDialogEvent') + //- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="templateDialog" :visible.sync="templateDialog.visible" :title="$t('dialog.template_dialog.header')" width="450px") diff --git a/src/classes/gameRealtimeLogging.js b/src/classes/gameRealtimeLogging.js index c10d3933..566b35cd 100644 --- a/src/classes/gameRealtimeLogging.js +++ b/src/classes/gameRealtimeLogging.js @@ -1240,7 +1240,7 @@ export default class extends baseClass { platform = 'Desktop'; } this.photonUserSusieCheck(photonId, user, gameLogDate); - this.checkVRChatCache(avatar).then((cacheInfo) => { + $utils.checkVRChatCache(avatar).then((cacheInfo) => { var inCache = false; if (cacheInfo.Item1 > 0) { inCache = true; @@ -1412,7 +1412,7 @@ export default class extends baseClass { ) { avatar.name = this.replaceBioSymbols(avatar.name); avatar.description = this.replaceBioSymbols(avatar.description); - this.checkVRChatCache(avatar).then((cacheInfo) => { + $utils.checkVRChatCache(avatar).then((cacheInfo) => { var inCache = false; if (cacheInfo.Item1 > 0) { inCache = true; diff --git a/src/classes/memos.js b/src/classes/memos.js index 3196a987..503000a4 100644 --- a/src/classes/memos.js +++ b/src/classes/memos.js @@ -95,11 +95,6 @@ export default class extends baseClass { } }, - onAvatarMemoChange() { - var D = this.avatarDialog; - this.saveAvatarMemo(D.id, D.memo); - }, - async getAvatarMemo(avatarId) { try { return await database.getAvatarMemoDB(avatarId); @@ -111,18 +106,6 @@ export default class extends baseClass { memo: '' }; } - }, - - saveAvatarMemo(avatarId, memo) { - if (memo) { - database.setAvatarMemo({ - avatarId, - editedAt: new Date().toJSON(), - memo - }); - } else { - database.deleteAvatarMemo(avatarId); - } } }; } diff --git a/src/classes/prompts.js b/src/classes/prompts.js index 0b482d3c..5da92ee7 100644 --- a/src/classes/prompts.js +++ b/src/classes/prompts.js @@ -362,82 +362,6 @@ export default class extends baseClass { ); }, - promptRenameAvatar(avatar) { - this.$prompt( - $t('prompt.rename_avatar.description'), - $t('prompt.rename_avatar.header'), - { - distinguishCancelAndClose: true, - confirmButtonText: $t('prompt.rename_avatar.ok'), - cancelButtonText: $t('prompt.rename_avatar.cancel'), - inputValue: avatar.ref.name, - inputErrorMessage: $t('prompt.rename_avatar.input_error'), - callback: (action, instance) => { - if ( - action === 'confirm' && - instance.inputValue !== avatar.ref.name - ) { - avatarRequest - .saveAvatar({ - id: avatar.id, - name: instance.inputValue - }) - .then((args) => { - this.$message({ - message: $t( - 'prompt.rename_avatar.message.success' - ), - type: 'success' - }); - return args; - }); - } - } - } - ); - }, - - promptChangeAvatarDescription(avatar) { - this.$prompt( - $t('prompt.change_avatar_description.description'), - $t('prompt.change_avatar_description.header'), - { - distinguishCancelAndClose: true, - confirmButtonText: $t( - 'prompt.change_avatar_description.ok' - ), - cancelButtonText: $t( - 'prompt.change_avatar_description.cancel' - ), - inputValue: avatar.ref.description, - inputErrorMessage: $t( - 'prompt.change_avatar_description.input_error' - ), - callback: (action, instance) => { - if ( - action === 'confirm' && - instance.inputValue !== avatar.ref.description - ) { - avatarRequest - .saveAvatar({ - id: avatar.id, - description: instance.inputValue - }) - .then((args) => { - this.$message({ - message: $t( - 'prompt.change_avatar_description.message.success' - ), - type: 'success' - }); - return args; - }); - } - } - } - ); - }, - promptRenameWorld(world) { this.$prompt( $t('prompt.rename_world.description'), diff --git a/src/classes/request/avatar.js b/src/classes/request/avatar.js index ab34180b..3828ec89 100644 --- a/src/classes/request/avatar.js +++ b/src/classes/request/avatar.js @@ -132,7 +132,7 @@ const avatarReq = { json, params }; - window.API.$emit('AVATAR:IMPOSTER:CREATE', args); + // window.API.$emit('AVATAR:IMPOSTER:CREATE', args); return args; }); }, @@ -149,7 +149,7 @@ const avatarReq = { json, params }; - window.API.$emit('AVATAR:IMPOSTER:DELETE', args); + // window.API.$emit('AVATAR:IMPOSTER:DELETE', args); return args; }); } diff --git a/src/classes/request/avatarModeration.js b/src/classes/request/avatarModeration.js index 4129be8a..adf40ce3 100644 --- a/src/classes/request/avatarModeration.js +++ b/src/classes/request/avatarModeration.js @@ -8,7 +8,7 @@ const avatarModerationReq = { const args = { json }; - window.API.$emit('AVATAR-MODERATION:LIST', args); + // window.API.$emit('AVATAR-MODERATION:LIST', args); return args; }); }, @@ -26,7 +26,7 @@ const avatarModerationReq = { json, params }; - window.API.$emit('AVATAR-MODERATION', args); + // window.API.$emit('AVATAR-MODERATION', args); return args; }); }, diff --git a/src/classes/request/misc.js b/src/classes/request/misc.js index d94797bf..1736fea6 100644 --- a/src/classes/request/misc.js +++ b/src/classes/request/misc.js @@ -69,7 +69,7 @@ const miscReq = { json, params }; - window.API.$emit('FILE:ANALYSIS', args); + // window.API.$emit('FILE:ANALYSIS', args); return args; }); }, diff --git a/src/classes/utils.js b/src/classes/utils.js index 29454691..f8af2b95 100644 --- a/src/classes/utils.js +++ b/src/classes/utils.js @@ -1,6 +1,9 @@ +import Noty from 'noty'; + let echarts = null; -export default { +// messy here, organize later +const _utils = { removeFromArray(array, item) { var { length } = array; for (var i = 0; i < length; ++i) { @@ -483,11 +486,219 @@ export default { } return false; }, - getAuditLogTypeName(auditLogType) { - if (!auditLogType) return ''; - return auditLogType - .replace('group.', '') - .replace(/\./g, ' ') - .replace(/\b\w/g, (l) => l.toUpperCase()); + + compareUnityVersion(unitySortNumber) { + if (!window.API.cachedConfig.sdkUnityVersion) { + console.error('No cachedConfig.sdkUnityVersion'); + return false; + } + + // 2022.3.6f1 2022 03 06 000 + // 2019.4.31f1 2019 04 31 000 + // 5.3.4p1 5 03 04 010 + // 2019.4.31f1c1 is a thing + var array = API.cachedConfig.sdkUnityVersion.split('.'); + if (array.length < 3) { + console.error('Invalid cachedConfig.sdkUnityVersion'); + return false; + } + var currentUnityVersion = array[0]; + currentUnityVersion += array[1].padStart(2, '0'); + var indexFirstLetter = array[2].search(/[a-zA-Z]/); + if (indexFirstLetter > -1) { + currentUnityVersion += array[2] + .substr(0, indexFirstLetter) + .padStart(2, '0'); + currentUnityVersion += '0'; + var letter = array[2].substr(indexFirstLetter, 1); + if (letter === 'p') { + currentUnityVersion += '1'; + } else { + // f + currentUnityVersion += '0'; + } + currentUnityVersion += '0'; + } else { + // just in case + currentUnityVersion += '000'; + } + // just in case + currentUnityVersion = currentUnityVersion.replace(/\D/g, ''); + + if ( + parseInt(unitySortNumber, 10) <= parseInt(currentUnityVersion, 10) + ) { + return true; + } + return false; + }, + async checkVRChatCache(ref) { + if (!ref.unityPackages) { + return { Item1: -1, Item2: false, Item3: '' }; + } + var assetUrl = ''; + var variant = ''; + for (var i = ref.unityPackages.length - 1; i > -1; i--) { + var unityPackage = ref.unityPackages[i]; + if (unityPackage.variant && unityPackage.variant !== 'security') { + continue; + } + if ( + unityPackage.platform === 'standalonewindows' && + _utils.compareUnityVersion(unityPackage.unitySortNumber) + ) { + assetUrl = unityPackage.assetUrl; + if (unityPackage.variant !== 'standard') { + variant = unityPackage.variant; + } + break; + } + } + if (!assetUrl) { + assetUrl = ref.assetUrl; + } + var id = _utils.extractFileId(assetUrl); + var version = parseInt(_utils.extractFileVersion(assetUrl), 10); + var variantVersion = parseInt( + _utils.extractVariantVersion(assetUrl), + 10 + ); + if (!id || !version) { + return { Item1: -1, Item2: false, Item3: '' }; + } + + return AssetBundleManager.CheckVRChatCache( + id, + version, + variant, + variantVersion + ); + }, + async deleteVRChatCache(ref) { + var assetUrl = ''; + var variant = ''; + for (var i = ref.unityPackages.length - 1; i > -1; i--) { + var unityPackage = ref.unityPackages[i]; + if ( + unityPackage.variant && + unityPackage.variant !== 'standard' && + unityPackage.variant !== 'security' + ) { + continue; + } + if ( + unityPackage.platform === 'standalonewindows' && + $utils.compareUnityVersion(unityPackage.unitySortNumber) + ) { + assetUrl = unityPackage.assetUrl; + if (unityPackage.variant !== 'standard') { + variant = unityPackage.variant; + } + break; + } + } + var id = $utils.extractFileId(assetUrl); + var version = parseInt($utils.extractFileVersion(assetUrl), 10); + var variantVersion = parseInt( + $utils.extractVariantVersion(assetUrl), + 10 + ); + await AssetBundleManager.DeleteCache( + id, + version, + variant, + variantVersion + ); + }, + downloadAndSaveJson(fileName, data) { + if (!fileName || !data) { + return; + } + try { + var link = document.createElement('a'); + link.setAttribute( + 'href', + `data:application/json;charset=utf-8,${encodeURIComponent( + JSON.stringify(data, null, 2) + )}` + ); + link.setAttribute('download', `${fileName}.json`); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch { + new Noty({ + type: 'error', + text: $app.escapeTag('Failed to download JSON.') + }).show(); + } + }, + getAvailablePlatforms(unityPackages) { + var isPC = false; + var isQuest = false; + var isIos = false; + if (typeof unityPackages === 'object') { + for (var unityPackage of unityPackages) { + if ( + unityPackage.variant && + unityPackage.variant !== 'standard' && + unityPackage.variant !== 'security' + ) { + continue; + } + if (unityPackage.platform === 'standalonewindows') { + isPC = true; + } else if (unityPackage.platform === 'android') { + isQuest = true; + } else if (unityPackage.platform === 'ios') { + isIos = true; + } + } + } + return { isPC, isQuest, isIos }; + }, + getPlatformInfo(unityPackages) { + var pc = {}; + var android = {}; + var ios = {}; + if (typeof unityPackages === 'object') { + for (var unityPackage of unityPackages) { + if ( + unityPackage.variant && + unityPackage.variant !== 'standard' && + unityPackage.variant !== 'security' + ) { + continue; + } + if (unityPackage.platform === 'standalonewindows') { + if ( + unityPackage.performanceRating === 'None' && + pc.performanceRating + ) { + continue; + } + pc = unityPackage; + } else if (unityPackage.platform === 'android') { + if ( + unityPackage.performanceRating === 'None' && + android.performanceRating + ) { + continue; + } + android = unityPackage; + } else if (unityPackage.platform === 'ios') { + if ( + unityPackage.performanceRating === 'None' && + ios.performanceRating + ) { + continue; + } + ios = unityPackage; + } + } + } + return { pc, android, ios }; } }; + +export default _utils; diff --git a/src/classes/vrcRegistry.js b/src/classes/vrcRegistry.js index 87271b93..52c97484 100644 --- a/src/classes/vrcRegistry.js +++ b/src/classes/vrcRegistry.js @@ -136,7 +136,7 @@ export default class extends baseClass { }, saveVrcRegistryBackupToFile(row) { - this.downloadAndSaveJson(row.name, row.data); + $utils.downloadAndSaveJson(row.name, row.data); }, async openJsonFileSelectorDialogElectron() { diff --git a/src/components/charts/InstanceActivity.vue b/src/components/charts/InstanceActivity.vue index 769d9012..8283e839 100644 --- a/src/components/charts/InstanceActivity.vue +++ b/src/components/charts/InstanceActivity.vue @@ -102,7 +102,7 @@ · -
-
- + @click="showAvatarDialog(favorite.id)" />
- + @click="showAvatarDialog(favorite.id)" />
-
- - + :favorite-friends="favoriteFriends" />
diff --git a/src/components/favorites/FavoritesWorldTab.vue b/src/components/favorites/FavoritesWorldTab.vue index 7bc000e2..96e6adf8 100644 --- a/src/components/favorites/FavoritesWorldTab.vue +++ b/src/components/favorites/FavoritesWorldTab.vue @@ -118,7 +118,7 @@
-
- - -
+
- + {{ $t('side_panel.search_result_more') }} @@ -69,21 +69,21 @@ - + :grouped-by-group-key-favorite-friends="groupedByGroupKeyFavoriteFriends" + @confirm-delete-friend="$emit('confirm-delete-friend', $event)" /> - + @show-group-dialog="$emit('show-group-dialog', $event)" />
diff --git a/src/views/dialogs/avatarDialog/AvatarDialog.vue b/src/views/dialogs/avatarDialog/AvatarDialog.vue new file mode 100644 index 00000000..9bad2ccf --- /dev/null +++ b/src/views/dialogs/avatarDialog/AvatarDialog.vue @@ -0,0 +1,1055 @@ + + + diff --git a/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue b/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue new file mode 100644 index 00000000..0c8dabdb --- /dev/null +++ b/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/src/views/dialogs/groupDialog/GroupDialog.vue b/src/views/dialogs/groupDialog/GroupDialog.vue index 88182f7a..23184e5c 100644 --- a/src/views/dialogs/groupDialog/GroupDialog.vue +++ b/src/views/dialogs/groupDialog/GroupDialog.vue @@ -1242,7 +1242,6 @@ 'get-group-dialog-group-members', 'refresh-instance-player-count', 'update-group-post-search', - 'download-and-save-json', 'set-group-member-sort-order', 'clear-image-gallery-select' ]); @@ -1780,8 +1779,8 @@ function updateGroupPostSearch() { emit('update-group-post-search'); } - function downloadAndSaveJson(filename, data) { - emit('download-and-save-json', filename, data); + function downloadAndSaveJson(fileName, data) { + utils.downloadAndSaveJson(fileName, data); } function clearImageGallerySelect() { emit('clear-image-gallery-select'); diff --git a/src/views/dialogs/groupDialog/GroupMemberModerationDialog.vue b/src/views/dialogs/groupDialog/GroupMemberModerationDialog.vue index 95f781b5..57809ead 100644 --- a/src/views/dialogs/groupDialog/GroupMemberModerationDialog.vue +++ b/src/views/dialogs/groupDialog/GroupMemberModerationDialog.vue @@ -1681,7 +1681,11 @@ } function getAuditLogTypeName(auditLogType) { - return utils.getAuditLogTypeName(auditLogType); + if (!auditLogType) return ''; + return auditLogType + .replace('group.', '') + .replace(/\./g, ' ') + .replace(/\b\w/g, (l) => l.toUpperCase()); } function hasGroupPermission(ref, permission) { diff --git a/src/views/dialogs/world/WorldDialog.vue b/src/views/dialogs/world/WorldDialog.vue index 98267724..4ca91142 100644 --- a/src/views/dialogs/world/WorldDialog.vue +++ b/src/views/dialogs/world/WorldDialog.vue @@ -739,17 +739,17 @@
- - - + + - - {{ $t('view.charts.header') }}
- + :local-favorite-friends="localFavoriteFriends" + @open-previous-instance-info-dialog="$emit('open-previous-instance-info-dialog', $event)" />
diff --git a/src/views/tabs/Favorites.vue b/src/views/tabs/Favorites.vue index f25e2e6e..bb407156 100644 --- a/src/views/tabs/Favorites.vue +++ b/src/views/tabs/Favorites.vue @@ -27,7 +27,7 @@
- - -