| <script setup lang='ts'> | |
| import { computed, ref } from 'vue' | |
| import { NButton, NInput, NModal, useMessage } from 'naive-ui' | |
| import { fetchVerify } from '@/api' | |
| import { useAuthStore } from '@/store' | |
| import Icon403 from '@/icons/403.vue' | |
| interface Props { | |
| visible: boolean | |
| } | |
| defineProps<Props>() | |
| const authStore = useAuthStore() | |
| const ms = useMessage() | |
| const loading = ref(false) | |
| const token = ref('') | |
| const disabled = computed(() => !token.value.trim() || loading.value) | |
| async function handleVerify() { | |
| const secretKey = token.value.trim() | |
| if (!secretKey) | |
| return | |
| try { | |
| loading.value = true | |
| await fetchVerify(secretKey) | |
| authStore.setToken(secretKey) | |
| ms.success('success') | |
| window.location.reload() | |
| } | |
| catch (error: any) { | |
| ms.error(error.message ?? 'error') | |
| authStore.removeToken() | |
| token.value = '' | |
| } | |
| finally { | |
| loading.value = false | |
| } | |
| } | |
| function handlePress(event: KeyboardEvent) { | |
| if (event.key === 'Enter' && !event.shiftKey) { | |
| event.preventDefault() | |
| handleVerify() | |
| } | |
| } | |
| </script> | |
| <template> | |
| <NModal :show="visible" style="width: 90%; max-width: 640px"> | |
| <div class="p-10 bg-white rounded dark:bg-slate-800"> | |
| <div class="space-y-4"> | |
| <header class="space-y-2"> | |
| <h2 class="text-2xl font-bold text-center text-slate-800 dark:text-neutral-200"> | |
| 403 | |
| </h2> | |
| <p class="text-base text-center text-slate-500 dark:text-slate-500"> | |
| {{ $t('common.unauthorizedTips') }} | |
| </p> | |
| <Icon403 class="w-[200px] m-auto" /> | |
| </header> | |
| <NInput v-model:value="token" type="password" placeholder="" @keypress="handlePress" /> | |
| <NButton | |
| block | |
| type="primary" | |
| :disabled="disabled" | |
| :loading="loading" | |
| @click="handleVerify" | |
| > | |
| {{ $t('common.verify') }} | |
| </NButton> | |
| </div> | |
| </div> | |
| </NModal> | |
| </template> | |