diff --git a/frontend/src/components/account/OpenAIQuotaResetCell.vue b/frontend/src/components/account/OpenAIQuotaResetCell.vue index 5d3cf64108..d23e297470 100644 --- a/frontend/src/components/account/OpenAIQuotaResetCell.vue +++ b/frontend/src/components/account/OpenAIQuotaResetCell.vue @@ -43,7 +43,7 @@ class="inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[10px] font-medium text-orange-600 transition-colors hover:bg-orange-50 disabled:cursor-not-allowed disabled:opacity-50 dark:text-orange-400 dark:hover:bg-orange-900/30" :disabled="resetting || loading || !canReset" :title="resetButtonTitle" - @click="handleReset" + @click="openResetConfirm" > {{ resetMessage }} + + @@ -90,6 +101,7 @@ import { type OpenAIQuotaUsage, type OpenAIQuotaResetResult } from '@/api/admin/accounts' +import ConfirmDialog from '@/components/common/ConfirmDialog.vue' const props = defineProps<{ account: Account @@ -105,6 +117,7 @@ const resetting = ref(false) const error = ref(null) const data = ref(null) const resetMessage = ref(null) +const showResetConfirm = ref(false) const availableResetCount = computed(() => data.value?.rate_limit_reset_credits?.available_count ?? 0) const canReset = computed(() => availableResetCount.value > 0) @@ -161,7 +174,17 @@ const handleQuery = async () => { } } -const handleReset = async () => { +const openResetConfirm = () => { + if (resetting.value || loading.value) return + if (!canReset.value) { + error.value = t('admin.accounts.openaiQuotaReset.noCreditsAvailable') + return + } + showResetConfirm.value = true +} + +const confirmReset = async () => { + showResetConfirm.value = false if (resetting.value) return if (!canReset.value) { error.value = t('admin.accounts.openaiQuotaReset.noCreditsAvailable') @@ -195,6 +218,7 @@ watch( resetMessage.value = null loading.value = false resetting.value = false + showResetConfirm.value = false } ) diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 0ac93a9811..bfbde93293 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -4126,7 +4126,9 @@ export default { resetTooltipNeedQuery: 'Click Credits first to load the available count', resetTooltipNoCredits: 'No reset credits available', noCreditsAvailable: 'No reset credits available', - resetSuccess: 'Reset {windows} window(s)' + resetSuccess: 'Reset {windows} window(s)', + confirmTitle: 'Confirm Weekly Limit Reset', + confirmMessage: 'This will consume 1 reset credit to immediately restore the current window ({count} remaining). This action cannot be undone. Continue?' }, tier: { free: 'Free', diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts index ec9c51a171..47d0054493 100644 --- a/frontend/src/i18n/locales/zh.ts +++ b/frontend/src/i18n/locales/zh.ts @@ -3414,7 +3414,9 @@ export default { resetTooltipNeedQuery: '先点击「次数」加载剩余重置次数', resetTooltipNoCredits: '没有可用的重置次数', noCreditsAvailable: '没有可用的重置次数', - resetSuccess: '已重置 {windows} 个窗口' + resetSuccess: '已重置 {windows} 个窗口', + confirmTitle: '确认重置周限', + confirmMessage: '将消耗 1 次重置次数立即恢复当前窗口,剩余 {count} 次。此操作不可撤销,确定继续吗?' }, tier: { free: 'Free',