58 lines
1.1 KiB
Vue
58 lines
1.1 KiB
Vue
<script setup lang="ts">
|
||
|
||
defineProps<{
|
||
loading?: boolean
|
||
}>()
|
||
|
||
const open = ref(false)
|
||
|
||
const emit = defineEmits<{
|
||
(e: 'verify', value: (res: boolean) => void): void
|
||
(e: 'success', value: (res: boolean) => void): void
|
||
}>()
|
||
|
||
const { counter, reset, pause, resume } = useInterval(1000, { controls: true, immediate: false })
|
||
|
||
const count = computed(() => {
|
||
const res = 60 - counter.value
|
||
if (res === 0) {
|
||
pause()
|
||
reset()
|
||
return ''
|
||
}
|
||
if (res === 60) {
|
||
return ''
|
||
}
|
||
return `(${res})`
|
||
})
|
||
|
||
const verify = () => {
|
||
emit('verify', (res) => {
|
||
if (res) {
|
||
success()
|
||
}
|
||
})
|
||
}
|
||
|
||
const success = () => {
|
||
open.value = false
|
||
emit('success', (res) => {
|
||
if (res) {
|
||
resume()
|
||
}
|
||
})
|
||
}
|
||
|
||
</script>
|
||
|
||
<template>
|
||
<!-- <UPopover v-model:open="open" class="h-full" :popper="{ placement: 'top-end' }"> -->
|
||
<Button variant="secondary" :disabled="counter > 0" :loading="loading" @click.prevent="verify">
|
||
发送验证码{{ count }}
|
||
</Button>
|
||
<!-- <template #panel>
|
||
<Captcha width="300px" height="240px" :max-dot="5" @success="success" />
|
||
</template>
|
||
</UPopover> -->
|
||
</template>
|