From b2aecef7d8160280d152a411a79507c3041ec053 Mon Sep 17 00:00:00 2001 From: Hakadao Date: Wed, 15 Nov 2023 01:55:00 +0800 Subject: [PATCH] feat: login qr code --- src/components/Settings/components/Home.vue | 45 +++++++++++++++++---- src/utils/main.ts | 10 +++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/components/Settings/components/Home.vue b/src/components/Settings/components/Home.vue index 4386e566..ff3c3985 100644 --- a/src/components/Settings/components/Home.vue +++ b/src/components/Settings/components/Home.vue @@ -3,8 +3,9 @@ import type { Ref } from 'vue' import { useI18n } from 'vue-i18n' import QRCodeVue from 'qrcode.vue' import SearchPage from './SearchPage.vue' -import { getTVLoginQRCode, grantAccessKey, revokeAccessKey } from '~/utils/authProvider' -import { settings } from '~/logic' +import { getTVLoginQRCode, grantAccessKey, pollTVLoginQRCode, revokeAccessKey } from '~/utils/authProvider' +import { accessKey, settings } from '~/logic' +import { delay } from '~/utils/main' const { t } = useI18n() @@ -22,11 +23,41 @@ function handleRevoke() { revokeAccessKey() } -function setLoginQRCode() { - getTVLoginQRCode().then((res) => { - if (res.code === 0) - loginQRCodeUrl.value = res.data.url - }) +async function setLoginQRCode() { + const res = await getTVLoginQRCode() + if (res.code === 0) { + loginQRCodeUrl.value = res.data.url + + let isSuccess = false + while (true) { + if (isSuccess) + return + + delay(5000) + const pollRes = await pollTVLoginQRCode(res.data.auth_code) + + // 0:成功 + // -3:API校验密匙错误 + // -400:请求错误 + // -404:啥都木有 + // 86038:二维码已失效 + // 86039:二维码尚未确认 + // 86090:二维码已扫码未确认 + + if (pollRes.code === 0) { + isSuccess = true + accessKey.value = pollRes.data.access_token + console.log(pollRes.data, accessKey.value) + } + else if (pollRes.code === 86038) { + await setLoginQRCode() + } + else if (pollRes.code === -3 || pollRes.code === -400 || pollRes.code === -404) { + // eslint-disable-next-line no-alert + alert(pollRes.message) + } + } + } } function handleOpenSearchPageModeSharedSettings() { diff --git a/src/utils/main.ts b/src/utils/main.ts index 9ff671d7..e137ca5e 100644 --- a/src/utils/main.ts +++ b/src/utils/main.ts @@ -97,3 +97,13 @@ export function injectCSS(css: string): HTMLStyleElement { document.documentElement.appendChild(el) return el } + +/** + * delay + * @param time delay time + */ +export function delay(time: number) { + return new Promise((resolve) => { + setTimeout(resolve, time) + }) +}