diff --git a/packages/mask/background/services/backup/google_drive.ts b/packages/mask/background/services/backup/google_drive.ts index a5c2c0f32a59..67e50b4e3312 100644 --- a/packages/mask/background/services/backup/google_drive.ts +++ b/packages/mask/background/services/backup/google_drive.ts @@ -1,10 +1,10 @@ +import { checkAndRequestPermission } from '../../../shared/helpers/index.js' + /* eslint-disable @typescript-eslint/ban-ts-comment */ export async function getAccessToken(interactive = false) { - const contained = await browser.permissions.contains({ permissions: ['identity'] }) - if (!contained) { - const granted = await browser.permissions.request({ origins: ['identity'] }) - if (!granted) return - } + const granted = await checkAndRequestPermission() + if (!granted) return + return new Promise((resolve, reject) => { // @ts-expect-error chrome.identity.getAuthToken({ interactive }, (token, error) => { diff --git a/packages/mask/dashboard/components/GoogleDriveLogin.tsx b/packages/mask/dashboard/components/GoogleDriveLogin.tsx index b1a809451c01..9ed045f16eae 100644 --- a/packages/mask/dashboard/components/GoogleDriveLogin.tsx +++ b/packages/mask/dashboard/components/GoogleDriveLogin.tsx @@ -4,9 +4,10 @@ import { ActionButton, makeStyles, useCustomSnackbar } from '@masknet/theme' import { GoogleDriveClient } from '@masknet/web3-providers' import { Box, Typography } from '@mui/material' import { memo, useMemo } from 'react' +import { useAsyncFn } from 'react-use' import { UserContext } from '../../shared-ui/index.js' +import { checkAndRequestPermission } from '../../shared/helpers/index.js' import { clearGoogleDriveAccessToken, getGoogleDriveAccessToken } from '../utils/api.js' -import { useAsyncFn } from 'react-use' const useStyles = makeStyles()((theme) => ({ container: { @@ -38,6 +39,9 @@ export const GoogleDriveLogin = memo(function GoogleDriveLogin() { const [{ loading }, login] = useAsyncFn(async () => { try { + const granted = await checkAndRequestPermission() + if (!granted) return + const userInfo = await googleDriveClient.login(true) updateUser({ googleAccount: userInfo.email || '', diff --git a/packages/mask/shared/helpers/checkAndRequestIdentityPermission.ts b/packages/mask/shared/helpers/checkAndRequestIdentityPermission.ts new file mode 100644 index 000000000000..b3c4f2a45d0d --- /dev/null +++ b/packages/mask/shared/helpers/checkAndRequestIdentityPermission.ts @@ -0,0 +1,10 @@ +import type { Manifest } from 'webextension-polyfill' + +export async function checkAndRequestPermission() { + const contained = await browser.permissions.contains({ permissions: ['identity'] }) + if (!contained) { + const granted = await browser.permissions.request({ permissions: ['identity' as Manifest.OptionalPermission] }) + if (!granted) return + } + return true +} diff --git a/packages/mask/shared/helpers/index.ts b/packages/mask/shared/helpers/index.ts index 483d4de6435d..66661353b28d 100644 --- a/packages/mask/shared/helpers/index.ts +++ b/packages/mask/shared/helpers/index.ts @@ -1,2 +1,3 @@ export * from './download.js' export * from './formatTokenBalance.js' +export * from './checkAndRequestIdentityPermission.js'