mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-23 00:33:50 +02:00
* Update Vue devtools
* upgrade vue pinia element-plus vue-i18n, add vite
* fix: i18n
* global components
* change v-deep
* upgrade vue-lazyload
* data table
* update enlint and safe-dialog
* package.json and vite.config.js
* el-icon
* el-message
* vue 2 -> vue3 migration changes
* $pinia
* dialog
* el-popover slot
* lint
* chore
* slot
* scss
* remote state access
* misc
* jsconfig
* el-button size mini -> small
* :model-value
* ElMessageBox
* datatable
* remove v-lazyload
* template #dropdown
* mini -> small
* css
* byebye hideTooltips
* use sass-embedded
* Update SQLite, remove unneeded libraries
* Fix shift remove local avatar favorites
* Electron arm64
* arm64 support
* bye pug
* f-word vite hah
* misc
* remove safe dialog component
* Add self invite to launch dialog
* Fix errors
* Icons 1
* improve localfavorite loading performance
* improve favorites world item performance
* dialog visibility changes for Element Plus
* clear element plus error
* import performance
* revert App.vue hah
* hah
* Revert "Add self invite to launch dialog"
This reverts commit 4801cfad58.
* Toggle self invite/open in-game
* Self invite on launch dialog
* el-button icon
* el-icon
* fix user dialog tab switching logic
* fix PlayerList
* Formatting changes
* More icons
* Fix friend log table
* loading margin
* fix markdown
* fix world dialog tab switching issue
* Fixes and formatting
* fix: global i18n.t export
* fix favorites world tab not working
* Create instance, displayName
* Remove group members sort by userId
* Fix loading dialog tabs on swtich
* Star
* charts console.warn
* wip: fix charts
* wip: fix charts
* wip: charts composables
* fix favorite item tooltip warning
* Fixes and formatting
* Clean up image dialogs
* Remove unused method
* Fix platform/size border
* Fix platform/size border
* $vr
* fix friendExportDialogVisible binding
* ElMessageBox and Settings
* Login formatting
* Rename VR overlay query
* Fix image popover and userdialog badges
* Formatting
* Big buttons
* Fixes, update Cef
* Fix gameLog table nav buttons jumping around while using nav buttons
* Fix z-index
* vr overlay
* vite input add theme
* defineAsyncComponent
* ISO 639-1
* fix i18n
* clean t
* Formatting, fix calendar, rotate arrows
* Show user status when user is offline
* Fix VR overlay
* fix theme and clean up
* split InstanceActivity
* tweak
* Fix VR overlay formatting
* fix scss var
* AppDebug hahahaha
* Years
* remove reactive
* improve perf
* state hah…
* fix user rendering poblems when user object is not yet loaded
* improve perf
* Update avatar/world image uploader, licenses, remove previous images dialog (old images are now deleted)
* improve perf 1
* Suppress stray errors
* fix traveling location display issue
* Fix empty instance creator
* improve friend list refresh performance
* fix main charts
* fix chart
* Fix darkmode
* Fix avatar dialog tags
---------
Co-authored-by: pa <maplenagisa@gmail.com>
155 lines
5.5 KiB
Vue
155 lines
5.5 KiB
Vue
<template>
|
|
<el-dialog
|
|
ref="setAvatarStylesDialog"
|
|
class="x-dialog"
|
|
v-model="setAvatarStylesDialog.visible"
|
|
:title="t('dialog.set_avatar_styles.header')"
|
|
width="400px"
|
|
append-to-body>
|
|
<template v-if="setAvatarStylesDialog.visible">
|
|
<div>
|
|
<span>{{ t('dialog.set_avatar_styles.primary_style') }}</span>
|
|
<el-select
|
|
v-model="setAvatarStylesDialog.primaryStyle"
|
|
:placeholder="t('dialog.set_avatar_styles.select_style')"
|
|
size="small"
|
|
clearable
|
|
style="display: inline-block">
|
|
<el-option
|
|
v-for="(style, index) in setAvatarStylesDialog.availableAvatarStyles"
|
|
:key="index"
|
|
:label="style"
|
|
:value="style"></el-option>
|
|
</el-select>
|
|
</div>
|
|
<br />
|
|
<div>
|
|
<span>{{ t('dialog.set_avatar_styles.secondary_style') }}</span>
|
|
<el-select
|
|
v-model="setAvatarStylesDialog.secondaryStyle"
|
|
:placeholder="t('dialog.set_avatar_styles.select_style')"
|
|
size="small"
|
|
clearable
|
|
style="display: inline-block">
|
|
<el-option
|
|
v-for="(style, index) in setAvatarStylesDialog.availableAvatarStyles"
|
|
:key="index"
|
|
:label="style"
|
|
:value="style"></el-option>
|
|
</el-select>
|
|
</div>
|
|
<br />
|
|
<div style="font-size: 12px; margin-top: 10px">{{ t('dialog.set_world_tags.author_tags') }}<br /></div>
|
|
<el-input
|
|
v-model="setAvatarStylesDialog.authorTags"
|
|
type="textarea"
|
|
size="small"
|
|
show-word-limit
|
|
:autosize="{ minRows: 2, maxRows: 5 }"
|
|
placeholder=""
|
|
style="margin-top: 10px"></el-input>
|
|
</template>
|
|
<template #footer>
|
|
<el-button size="small" @click="setAvatarStylesDialog.visible = false">{{
|
|
t('dialog.set_avatar_styles.cancel')
|
|
}}</el-button>
|
|
<el-button type="primary" size="small" @click="saveSetAvatarStylesDialog">{{
|
|
t('dialog.set_avatar_styles.save')
|
|
}}</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { watch } from 'vue';
|
|
|
|
import { useI18n } from 'vue-i18n';
|
|
import { arraysMatch } from '../../../shared/utils';
|
|
import { avatarRequest } from '../../../api';
|
|
import { useAvatarStore } from '../../../stores';
|
|
|
|
const { t } = useI18n();
|
|
const { applyAvatar } = useAvatarStore();
|
|
|
|
const props = defineProps({
|
|
setAvatarStylesDialog: {
|
|
type: Object,
|
|
required: true
|
|
}
|
|
});
|
|
|
|
watch(
|
|
() => props.setAvatarStylesDialog.visible,
|
|
(newVal) => {
|
|
if (newVal) {
|
|
getAvatarStyles();
|
|
}
|
|
}
|
|
);
|
|
|
|
async function getAvatarStyles() {
|
|
const ref = await avatarRequest.getAvailableAvatarStyles();
|
|
const styles = [];
|
|
const stylesMap = new Map();
|
|
for (const style of ref.json) {
|
|
styles.push(style.styleName);
|
|
stylesMap.set(style.styleName, style.id);
|
|
}
|
|
props.setAvatarStylesDialog.availableAvatarStyles = styles;
|
|
props.setAvatarStylesDialog.availableAvatarStylesMap = stylesMap;
|
|
}
|
|
|
|
function saveSetAvatarStylesDialog() {
|
|
const primaryStyleId =
|
|
props.setAvatarStylesDialog.availableAvatarStylesMap.get(props.setAvatarStylesDialog.primaryStyle) || '';
|
|
const secondaryStyleId =
|
|
props.setAvatarStylesDialog.availableAvatarStylesMap.get(props.setAvatarStylesDialog.secondaryStyle) || '';
|
|
|
|
let tags = [];
|
|
for (const tag of props.setAvatarStylesDialog.initialTags) {
|
|
if (!tag.startsWith('author_tag_')) {
|
|
tags.push(tag);
|
|
}
|
|
}
|
|
const authorTagsArray = props.setAvatarStylesDialog.authorTags.split(',');
|
|
for (const tag of authorTagsArray) {
|
|
if (!tag.trim()) {
|
|
continue;
|
|
}
|
|
let tagName = `author_tag_${tag}`;
|
|
if (!tags.includes(tagName)) {
|
|
tags.push(tagName);
|
|
}
|
|
}
|
|
|
|
if (
|
|
props.setAvatarStylesDialog.initialPrimaryStyle === props.setAvatarStylesDialog.primaryStyle &&
|
|
props.setAvatarStylesDialog.initialSecondaryStyle === props.setAvatarStylesDialog.secondaryStyle &&
|
|
arraysMatch(props.setAvatarStylesDialog.initialTags, tags)
|
|
) {
|
|
props.setAvatarStylesDialog.visible = false;
|
|
return;
|
|
}
|
|
|
|
const params = {
|
|
id: props.setAvatarStylesDialog.avatarId,
|
|
primaryStyle: primaryStyleId,
|
|
secondaryStyle: secondaryStyleId,
|
|
tags
|
|
};
|
|
avatarRequest
|
|
.saveAvatar(params)
|
|
.then((args) => {
|
|
applyAvatar(args.json);
|
|
$message.success(t('dialog.set_avatar_styles.save_success'));
|
|
props.setAvatarStylesDialog.visible = false;
|
|
})
|
|
.catch((error) => {
|
|
$message.error(t('dialog.set_avatar_styles.save_failed'));
|
|
console.error('Error saving avatar styles:', error);
|
|
});
|
|
}
|
|
</script>
|
|
|
|
<style scoped></style>
|