- 删除/重命名/切换正版改为两段式确认,取消可整体复位 - 玩家列表与详情区均提供切换正版按钮 - 默认角色在列表和详情区显示「默认」徽章 - 补 rename/delete/mojang 三组确认文案
This commit is contained in:
1 parent
bc37e5d436
commit
9c92e157a5
3 files changed
+168
-2
No files matched your search
@@ -88,6 +88,18 @@ const messages = defineMessages({
|
|||||||
id: 'app.skin-site.profile-view.mojang-toggled',
|
id: 'app.skin-site.profile-view.mojang-toggled',
|
||||||
defaultMessage: 'Mojang status updated.',
|
defaultMessage: 'Mojang status updated.',
|
||||||
},
|
},
|
||||||
|
deleteConfirm: {
|
||||||
|
id: 'app.skin-site.profile-view.delete-confirm',
|
||||||
|
defaultMessage: 'Delete this player? This cannot be undone.',
|
||||||
|
},
|
||||||
|
mojangConfirm: {
|
||||||
|
id: 'app.skin-site.profile-view.mojang-confirm',
|
||||||
|
defaultMessage: 'Toggle Mojang status for this player?',
|
||||||
|
},
|
||||||
|
renameConfirm: {
|
||||||
|
id: 'app.skin-site.profile-view.rename-confirm',
|
||||||
|
defaultMessage: 'Rename this player?',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
const selectedId = ref<string | null>(null)
|
const selectedId = ref<string | null>(null)
|
||||||
const texture = ref<SkinSitePlayerSkin>({})
|
const texture = ref<SkinSitePlayerSkin>({})
|
||||||
@@ -151,14 +163,18 @@ const showAdd = ref(false)
|
|||||||
const newName = ref('')
|
const newName = ref('')
|
||||||
const renamingId = ref<string | null>(null)
|
const renamingId = ref<string | null>(null)
|
||||||
const renameValue = ref('')
|
const renameValue = ref('')
|
||||||
|
const confirmingRename = ref(false)
|
||||||
const confirmingDeleteId = ref<string | null>(null)
|
const confirmingDeleteId = ref<string | null>(null)
|
||||||
|
const confirmingMojangId = ref<string | null>(null)
|
||||||
|
|
||||||
function resetDialogs() {
|
function resetDialogs() {
|
||||||
showAdd.value = false
|
showAdd.value = false
|
||||||
newName.value = ''
|
newName.value = ''
|
||||||
renamingId.value = null
|
renamingId.value = null
|
||||||
renameValue.value = ''
|
renameValue.value = ''
|
||||||
|
confirmingRename.value = false
|
||||||
confirmingDeleteId.value = null
|
confirmingDeleteId.value = null
|
||||||
|
confirmingMojangId.value = null
|
||||||
}
|
}
|
||||||
|
|
||||||
async function submitAdd() {
|
async function submitAdd() {
|
||||||
@@ -182,11 +198,22 @@ async function submitAdd() {
|
|||||||
function startRename(player: { uuid: string; name: string }) {
|
function startRename(player: { uuid: string; name: string }) {
|
||||||
renamingId.value = player.uuid
|
renamingId.value = player.uuid
|
||||||
renameValue.value = player.name
|
renameValue.value = player.name
|
||||||
|
confirmingRename.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestRename() {
|
||||||
|
const name = renameValue.value.trim()
|
||||||
|
if (!renamingId.value || !name) return
|
||||||
|
confirmingRename.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
async function submitRename() {
|
async function submitRename() {
|
||||||
const name = renameValue.value.trim()
|
const name = renameValue.value.trim()
|
||||||
if (!renamingId.value || !name || busy.value) return
|
if (!renamingId.value || !name || busy.value) return
|
||||||
|
if (!confirmingRename.value) {
|
||||||
|
confirmingRename.value = true
|
||||||
|
return
|
||||||
|
}
|
||||||
busy.value = 'rename'
|
busy.value = 'rename'
|
||||||
try {
|
try {
|
||||||
const res = await skinSiteRenamePlayer(renamingId.value, name)
|
const res = await skinSiteRenamePlayer(renamingId.value, name)
|
||||||
@@ -201,8 +228,17 @@ async function submitRename() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function requestDelete(uuid: string) {
|
||||||
|
if (busy.value) return
|
||||||
|
confirmingDeleteId.value = uuid
|
||||||
|
}
|
||||||
|
|
||||||
async function submitDelete(uuid: string) {
|
async function submitDelete(uuid: string) {
|
||||||
if (busy.value) return
|
if (busy.value) return
|
||||||
|
if (confirmingDeleteId.value !== uuid) {
|
||||||
|
confirmingDeleteId.value = uuid
|
||||||
|
return
|
||||||
|
}
|
||||||
busy.value = 'delete'
|
busy.value = 'delete'
|
||||||
try {
|
try {
|
||||||
const res = await skinSiteDeletePlayer(uuid)
|
const res = await skinSiteDeletePlayer(uuid)
|
||||||
@@ -249,8 +285,17 @@ async function clearDefaultPlayer() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function requestToggleMojang(uuid: string) {
|
||||||
|
if (busy.value) return
|
||||||
|
confirmingMojangId.value = uuid
|
||||||
|
}
|
||||||
|
|
||||||
async function toggleMojang(uuid: string) {
|
async function toggleMojang(uuid: string) {
|
||||||
if (busy.value) return
|
if (busy.value) return
|
||||||
|
if (confirmingMojangId.value !== uuid) {
|
||||||
|
confirmingMojangId.value = uuid
|
||||||
|
return
|
||||||
|
}
|
||||||
busy.value = 'mojang'
|
busy.value = 'mojang'
|
||||||
try {
|
try {
|
||||||
const res = await skinSiteSwitchMojang(uuid)
|
const res = await skinSiteSwitchMojang(uuid)
|
||||||
@@ -377,6 +422,39 @@ watch(signedIn, (value) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="renamingId"
|
||||||
|
class="flex flex-col gap-1.5 rounded-xl bg-button-bg p-2"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="renameValue"
|
||||||
|
type="text"
|
||||||
|
:placeholder="formatMessage(messages.playerNamePlaceholder)"
|
||||||
|
class="w-full rounded-lg border border-solid border-surface-5 bg-bg px-2 py-1 text-xs text-contrast outline-none focus:border-brand"
|
||||||
|
@keyup.enter="submitRename"
|
||||||
|
/>
|
||||||
|
<p v-if="confirmingRename" class="m-0 text-[11px] text-secondary">
|
||||||
|
{{ formatMessage(messages.renameConfirm) }}
|
||||||
|
</p>
|
||||||
|
<div class="flex gap-1.5">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="flex-1 rounded-lg bg-brand px-2 py-1 text-xs font-semibold text-contrast disabled:opacity-50"
|
||||||
|
:disabled="busy === 'rename' || !renameValue.trim()"
|
||||||
|
@click="submitRename"
|
||||||
|
>
|
||||||
|
{{ formatMessage(confirmingRename ? messages.confirm : messages.rename) }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="rounded-lg bg-bg-raised px-2 py-1 text-xs font-semibold text-secondary"
|
||||||
|
@click="resetDialogs"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.cancel) }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div v-if="playersLoading" class="flex items-center gap-2 text-sm text-secondary">
|
<div v-if="playersLoading" class="flex items-center gap-2 text-sm text-secondary">
|
||||||
<SpinnerIcon class="size-4 animate-spin" />
|
<SpinnerIcon class="size-4 animate-spin" />
|
||||||
{{ formatMessage(messages.loading) }}
|
{{ formatMessage(messages.loading) }}
|
||||||
@@ -403,6 +481,12 @@ watch(signedIn, (value) => {
|
|||||||
class="!rounded-md"
|
class="!rounded-md"
|
||||||
/>
|
/>
|
||||||
<span class="min-w-0 flex-1 truncate text-sm font-medium">{{ player.name }}</span>
|
<span class="min-w-0 flex-1 truncate text-sm font-medium">{{ player.name }}</span>
|
||||||
|
<span
|
||||||
|
v-if="defaultUuid === player.uuid"
|
||||||
|
class="shrink-0 rounded bg-brand px-1.5 py-0.5 text-[10px] font-semibold text-contrast"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.isDefault) }}
|
||||||
|
</span>
|
||||||
<span v-if="player.isMojang" class="shrink-0 text-[10px] uppercase text-secondary"
|
<span v-if="player.isMojang" class="shrink-0 text-[10px] uppercase text-secondary"
|
||||||
>Mojang</span
|
>Mojang</span
|
||||||
>
|
>
|
||||||
@@ -411,6 +495,7 @@ watch(signedIn, (value) => {
|
|||||||
v-if="defaultUuid === player.uuid"
|
v-if="defaultUuid === player.uuid"
|
||||||
type="button"
|
type="button"
|
||||||
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-brand"
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-brand"
|
||||||
|
:disabled="busy !== null"
|
||||||
@click.stop="clearDefaultPlayer"
|
@click.stop="clearDefaultPlayer"
|
||||||
>
|
>
|
||||||
{{ formatMessage(messages.clearDefault) }}
|
{{ formatMessage(messages.clearDefault) }}
|
||||||
@@ -419,6 +504,7 @@ watch(signedIn, (value) => {
|
|||||||
v-else
|
v-else
|
||||||
type="button"
|
type="button"
|
||||||
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
||||||
|
:disabled="busy !== null"
|
||||||
@click.stop="setDefaultPlayer(player.uuid)"
|
@click.stop="setDefaultPlayer(player.uuid)"
|
||||||
>
|
>
|
||||||
{{ formatMessage(messages.setDefault) }}
|
{{ formatMessage(messages.setDefault) }}
|
||||||
@@ -426,20 +512,67 @@ watch(signedIn, (value) => {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
||||||
|
:disabled="busy !== null"
|
||||||
@click.stop="startRename(player)"
|
@click.stop="startRename(player)"
|
||||||
>
|
>
|
||||||
{{ formatMessage(messages.rename) }}
|
{{ formatMessage(messages.rename) }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-red hover:bg-bg"
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
||||||
|
:disabled="busy !== null"
|
||||||
|
@click.stop="requestToggleMojang(player.uuid)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.toggleMojang) }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="confirmingDeleteId === player.uuid"
|
||||||
|
type="button"
|
||||||
|
class="rounded bg-red px-1.5 py-0.5 text-[10px] font-semibold text-contrast"
|
||||||
:disabled="busy !== null"
|
:disabled="busy !== null"
|
||||||
@click.stop="submitDelete(player.uuid)"
|
@click.stop="submitDelete(player.uuid)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.confirm) }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else
|
||||||
|
type="button"
|
||||||
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-red hover:bg-bg"
|
||||||
|
:disabled="busy !== null"
|
||||||
|
@click.stop="requestDelete(player.uuid)"
|
||||||
>
|
>
|
||||||
{{ formatMessage(messages.delete) }}
|
{{ formatMessage(messages.delete) }}
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="confirmingDeleteId === player.uuid || confirmingMojangId === player.uuid"
|
||||||
|
type="button"
|
||||||
|
class="rounded px-1.5 py-0.5 text-[10px] font-semibold text-secondary hover:bg-bg"
|
||||||
|
@click.stop="resetDialogs"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.cancel) }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="confirmingDeleteId === player.uuid"
|
||||||
|
class="rounded-lg bg-button-bg px-2 py-1 text-[11px] text-red"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.deleteConfirm) }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="confirmingMojangId === player.uuid"
|
||||||
|
class="rounded-lg bg-button-bg px-2 py-1 text-[11px] text-secondary"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.mojangConfirm) }}
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="ml-1 rounded bg-brand px-1.5 py-0.5 text-[10px] font-semibold text-contrast"
|
||||||
|
:disabled="busy !== null"
|
||||||
|
@click.stop="toggleMojang(player.uuid)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.confirm) }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Preview + texture actions -->
|
<!-- Preview + texture actions -->
|
||||||
@@ -451,10 +584,37 @@ watch(signedIn, (value) => {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
<h3 class="m-0 text-base font-semibold text-contrast">{{ selectedPlayer.name }}</h3>
|
<h3 class="m-0 text-base font-semibold text-contrast">{{ selectedPlayer.name }}</h3>
|
||||||
|
<span
|
||||||
|
v-if="defaultUuid === selectedPlayer.uuid"
|
||||||
|
class="rounded bg-brand px-1.5 py-0.5 text-[10px] font-semibold text-contrast"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.isDefault) }}
|
||||||
|
</span>
|
||||||
<span v-if="selectedPlayer.isMojang" class="text-xs text-secondary">Mojang</span>
|
<span v-if="selectedPlayer.isMojang" class="text-xs text-secondary">Mojang</span>
|
||||||
|
<button
|
||||||
|
v-if="confirmingMojangId === selectedPlayer.uuid"
|
||||||
|
type="button"
|
||||||
|
class="rounded-full bg-brand px-2.5 py-1 text-xs font-semibold text-contrast"
|
||||||
|
:disabled="busy !== null"
|
||||||
|
@click="toggleMojang(selectedPlayer.uuid)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.confirm) }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else
|
||||||
|
type="button"
|
||||||
|
class="rounded-full bg-button-bg px-2.5 py-1 text-xs font-semibold text-secondary hover:brightness-110"
|
||||||
|
:disabled="busy !== null"
|
||||||
|
@click="requestToggleMojang(selectedPlayer.uuid)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.toggleMojang) }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<p v-if="confirmingMojangId === selectedPlayer.uuid" class="m-0 text-xs text-secondary">
|
||||||
|
{{ formatMessage(messages.mojangConfirm) }}
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="relative h-80 w-full overflow-hidden rounded-xl bg-button-bg">
|
<div class="relative h-80 w-full overflow-hidden rounded-xl bg-button-bg">
|
||||||
<div v-if="loadingTexture" class="absolute inset-0 flex items-center justify-center">
|
<div v-if="loadingTexture" class="absolute inset-0 flex items-center justify-center">
|
||||||
|
|||||||
@@ -74,10 +74,12 @@
|
|||||||
"app.skin-site.profile-view.confirm": { "message": "Confirm" },
|
"app.skin-site.profile-view.confirm": { "message": "Confirm" },
|
||||||
"app.skin-site.profile-view.default-set": { "message": "Default player updated." },
|
"app.skin-site.profile-view.default-set": { "message": "Default player updated." },
|
||||||
"app.skin-site.profile-view.delete": { "message": "Delete" },
|
"app.skin-site.profile-view.delete": { "message": "Delete" },
|
||||||
|
"app.skin-site.profile-view.delete-confirm": { "message": "Delete this player? This cannot be undone." },
|
||||||
"app.skin-site.profile-view.deleted": { "message": "Player deleted." },
|
"app.skin-site.profile-view.deleted": { "message": "Player deleted." },
|
||||||
"app.skin-site.profile-view.elytra": { "message": "Elytra" },
|
"app.skin-site.profile-view.elytra": { "message": "Elytra" },
|
||||||
"app.skin-site.profile-view.is-default": { "message": "Default" },
|
"app.skin-site.profile-view.is-default": { "message": "Default" },
|
||||||
"app.skin-site.profile-view.loading": { "message": "Loading players…" },
|
"app.skin-site.profile-view.loading": { "message": "Loading players…" },
|
||||||
|
"app.skin-site.profile-view.mojang-confirm": { "message": "Toggle Mojang status for this player?" },
|
||||||
"app.skin-site.profile-view.mojang-toggled": { "message": "Mojang status updated." },
|
"app.skin-site.profile-view.mojang-toggled": { "message": "Mojang status updated." },
|
||||||
"app.skin-site.profile-view.no-players": { "message": "No players yet." },
|
"app.skin-site.profile-view.no-players": { "message": "No players yet." },
|
||||||
"app.skin-site.profile-view.player-name-placeholder": { "message": "Player name" },
|
"app.skin-site.profile-view.player-name-placeholder": { "message": "Player name" },
|
||||||
@@ -87,6 +89,7 @@
|
|||||||
"app.skin-site.profile-view.remove": { "message": "Remove" },
|
"app.skin-site.profile-view.remove": { "message": "Remove" },
|
||||||
"app.skin-site.profile-view.removed": { "message": "Texture removed." },
|
"app.skin-site.profile-view.removed": { "message": "Texture removed." },
|
||||||
"app.skin-site.profile-view.rename": { "message": "Rename" },
|
"app.skin-site.profile-view.rename": { "message": "Rename" },
|
||||||
|
"app.skin-site.profile-view.rename-confirm": { "message": "Rename this player?" },
|
||||||
"app.skin-site.profile-view.renamed": { "message": "Player renamed." },
|
"app.skin-site.profile-view.renamed": { "message": "Player renamed." },
|
||||||
"app.skin-site.profile-view.select-hint": {
|
"app.skin-site.profile-view.select-hint": {
|
||||||
"message": "Select a player to preview and edit its textures."
|
"message": "Select a player to preview and edit its textures."
|
||||||
|
|||||||
@@ -70,10 +70,12 @@
|
|||||||
"app.skin-site.profile-view.confirm": { "message": "确认" },
|
"app.skin-site.profile-view.confirm": { "message": "确认" },
|
||||||
"app.skin-site.profile-view.default-set": { "message": "默认角色已更新。" },
|
"app.skin-site.profile-view.default-set": { "message": "默认角色已更新。" },
|
||||||
"app.skin-site.profile-view.delete": { "message": "删除" },
|
"app.skin-site.profile-view.delete": { "message": "删除" },
|
||||||
|
"app.skin-site.profile-view.delete-confirm": { "message": "删除此角色?此操作不可撤销。" },
|
||||||
"app.skin-site.profile-view.deleted": { "message": "角色已删除。" },
|
"app.skin-site.profile-view.deleted": { "message": "角色已删除。" },
|
||||||
"app.skin-site.profile-view.elytra": { "message": "鞘翅" },
|
"app.skin-site.profile-view.elytra": { "message": "鞘翅" },
|
||||||
"app.skin-site.profile-view.is-default": { "message": "默认" },
|
"app.skin-site.profile-view.is-default": { "message": "默认" },
|
||||||
"app.skin-site.profile-view.loading": { "message": "正在加载角色…" },
|
"app.skin-site.profile-view.loading": { "message": "正在加载角色…" },
|
||||||
|
"app.skin-site.profile-view.mojang-confirm": { "message": "切换此角色的正版状态?" },
|
||||||
"app.skin-site.profile-view.mojang-toggled": { "message": "正版状态已更新。" },
|
"app.skin-site.profile-view.mojang-toggled": { "message": "正版状态已更新。" },
|
||||||
"app.skin-site.profile-view.no-players": { "message": "暂无角色。" },
|
"app.skin-site.profile-view.no-players": { "message": "暂无角色。" },
|
||||||
"app.skin-site.profile-view.player-name-placeholder": { "message": "角色名" },
|
"app.skin-site.profile-view.player-name-placeholder": { "message": "角色名" },
|
||||||
@@ -83,6 +85,7 @@
|
|||||||
"app.skin-site.profile-view.remove": { "message": "移除" },
|
"app.skin-site.profile-view.remove": { "message": "移除" },
|
||||||
"app.skin-site.profile-view.removed": { "message": "材质已移除。" },
|
"app.skin-site.profile-view.removed": { "message": "材质已移除。" },
|
||||||
"app.skin-site.profile-view.rename": { "message": "重命名" },
|
"app.skin-site.profile-view.rename": { "message": "重命名" },
|
||||||
|
"app.skin-site.profile-view.rename-confirm": { "message": "重命名此角色?" },
|
||||||
"app.skin-site.profile-view.renamed": { "message": "角色已重命名。" },
|
"app.skin-site.profile-view.renamed": { "message": "角色已重命名。" },
|
||||||
"app.skin-site.profile-view.select-hint": {
|
"app.skin-site.profile-view.select-hint": {
|
||||||
"message": "选择角色以预览和修改其材质。"
|
"message": "选择角色以预览和修改其材质。"
|
||||||
|
|||||||
Reference in new issue
Block a user