| <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('sucess') |
| 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"> |
| 让我看看是不是你😁 |
| </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> |
| |