新增二维码延迟倒计时功能,优化状态管理逻辑,添加旋转动画样式,提升用户体验
This commit is contained in:
@@ -266,6 +266,11 @@ export default {
|
|||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
.notice-text {
|
.notice-text {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ export function useQrCode() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const processSelectRegionResponse = async (state, countdown, data, startCountdown, startLoginPolling, updateStateFromResponse) => {
|
const processSelectRegionResponse = async (state, countdown, data, startCountdown, startLoginPolling, updateStateFromResponse, startQrDelayCountdown, clearQrDelayCountdown) => {
|
||||||
if (data.qrDelaySeconds && data.qrDelaySeconds > 0 && data.mecmachineId) {
|
if (data.qrDelaySeconds && data.qrDelaySeconds > 0 && data.mecmachineId) {
|
||||||
console.log('进入延迟分支')
|
console.log('进入延迟分支')
|
||||||
await updateStateFromResponse(data, true)
|
await updateStateFromResponse(data, true)
|
||||||
@@ -116,8 +116,17 @@ export function useQrCode() {
|
|||||||
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr })
|
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr })
|
||||||
ElMessage.info(`正在准备二维码,请等待 ${data.qrDelaySeconds} 秒...`)
|
ElMessage.info(`正在准备二维码,请等待 ${data.qrDelaySeconds} 秒...`)
|
||||||
|
|
||||||
|
// 启动等待秒数的本地倒计时
|
||||||
|
if (typeof startQrDelayCountdown === 'function') {
|
||||||
|
startQrDelayCountdown(state, data.qrDelaySeconds)
|
||||||
|
}
|
||||||
|
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
state.isWaitingQr = false
|
state.isWaitingQr = false
|
||||||
|
// 清理等待倒计时定时器
|
||||||
|
if (typeof clearQrDelayCountdown === 'function') {
|
||||||
|
clearQrDelayCountdown()
|
||||||
|
}
|
||||||
|
|
||||||
await fetchQrCodeAfterDelay(state, countdown, data.mecmachineId, data.qrCreatedAt, data.qrExpireAt)
|
await fetchQrCodeAfterDelay(state, countdown, data.mecmachineId, data.qrCreatedAt, data.qrExpireAt)
|
||||||
|
|
||||||
@@ -131,6 +140,10 @@ export function useQrCode() {
|
|||||||
await updateStateFromResponse(data)
|
await updateStateFromResponse(data)
|
||||||
state.isWaitingQr = false
|
state.isWaitingQr = false
|
||||||
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr, qrInfo: !!state.qrInfo })
|
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr, qrInfo: !!state.qrInfo })
|
||||||
|
// 进入立即分支时,确保清理等待倒计时(如果之前存在)
|
||||||
|
if (typeof clearQrDelayCountdown === 'function') {
|
||||||
|
clearQrDelayCountdown()
|
||||||
|
}
|
||||||
|
|
||||||
if (state.qrInfo && state.qrInfo.url) {
|
if (state.qrInfo && state.qrInfo.url) {
|
||||||
const isUrlValid = await validateQrCodeUrl(state.qrInfo.url)
|
const isUrlValid = await validateQrCodeUrl(state.qrInfo.url)
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ export function useTimers() {
|
|||||||
loginPoll: null,
|
loginPoll: null,
|
||||||
countdown: null,
|
countdown: null,
|
||||||
refreshCooldown: null,
|
refreshCooldown: null,
|
||||||
progressPoll: null
|
progressPoll: null,
|
||||||
|
qrDelay: null
|
||||||
})
|
})
|
||||||
|
|
||||||
const clearTimer = (name) => {
|
const clearTimer = (name) => {
|
||||||
@@ -98,6 +99,24 @@ export function useTimers() {
|
|||||||
}, 1000)
|
}, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const startQrDelayCountdown = (state, seconds = null) => {
|
||||||
|
clearTimer('qrDelay')
|
||||||
|
if (seconds !== null) {
|
||||||
|
state.qrDelaySeconds = seconds
|
||||||
|
}
|
||||||
|
timers.qrDelay = setInterval(() => {
|
||||||
|
if (state.qrDelaySeconds > 0) {
|
||||||
|
state.qrDelaySeconds--
|
||||||
|
} else {
|
||||||
|
clearTimer('qrDelay')
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
const clearQrDelayCountdown = () => {
|
||||||
|
clearTimer('qrDelay')
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
countdown,
|
countdown,
|
||||||
refreshCooldown,
|
refreshCooldown,
|
||||||
@@ -107,6 +126,8 @@ export function useTimers() {
|
|||||||
startCountdown,
|
startCountdown,
|
||||||
startLoginPolling,
|
startLoginPolling,
|
||||||
startProgressPolling,
|
startProgressPolling,
|
||||||
startRefreshCooldown
|
startRefreshCooldown,
|
||||||
|
startQrDelayCountdown,
|
||||||
|
clearQrDelayCountdown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -263,7 +263,9 @@ export default {
|
|||||||
startCountdown,
|
startCountdown,
|
||||||
startLoginPolling,
|
startLoginPolling,
|
||||||
startRefreshCooldown,
|
startRefreshCooldown,
|
||||||
startProgressPolling
|
startProgressPolling,
|
||||||
|
startQrDelayCountdown,
|
||||||
|
clearQrDelayCountdown
|
||||||
} = useTimers()
|
} = useTimers()
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -311,7 +313,9 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
updateStateFromResponse
|
updateStateFromResponse,
|
||||||
|
startQrDelayCountdown,
|
||||||
|
clearQrDelayCountdown
|
||||||
)
|
)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('处理选择区域失败:', error)
|
console.error('处理选择区域失败:', error)
|
||||||
|
|||||||
Reference in New Issue
Block a user