diff --git a/.changeset/tiny-beds-flow.md b/.changeset/tiny-beds-flow.md new file mode 100644 index 0000000000..f9b0daa78a --- /dev/null +++ b/.changeset/tiny-beds-flow.md @@ -0,0 +1,5 @@ +--- +"fuels-wallet": minor +--- + +feat: add auto update wallet in background diff --git a/packages/app/.env.example b/packages/app/.env.example index b376a740fe..8048a73076 100644 --- a/packages/app/.env.example +++ b/packages/app/.env.example @@ -1,4 +1,5 @@ VITE_CRX_NAME="Fuel Wallet Development" +VITE_CRX_VERSION_API="https://fuellabs.github.io/fuels-wallet/latest.json" VITE_FUEL_PROVIDER_URL=http://localhost:4000/graphql VITE_FUEL_FAUCET_URL=http://localhost:4040 VITE_MNEMONIC_WORDS=12 diff --git a/packages/app/.env.production b/packages/app/.env.production index a19202b3e1..d12e8e9f8b 100644 --- a/packages/app/.env.production +++ b/packages/app/.env.production @@ -1,4 +1,5 @@ VITE_CRX_NAME="Fuel Wallet" +VITE_CRX_VERSION_API="https://fuellabs.github.io/fuels-wallet/latest.json" VITE_CRX_RELEASE=true VITE_FUEL_PROVIDER_URL=https://beta-5.fuel.network/graphql VITE_FUEL_FAUCET_URL=https://faucet-beta-5.fuel.network/ diff --git a/packages/app/.env.test b/packages/app/.env.test index 9eed15eeed..c834faca71 100644 --- a/packages/app/.env.test +++ b/packages/app/.env.test @@ -1,4 +1,5 @@ VITE_CRX_NAME="Fuel Wallet" +VITE_CRX_VERSION_API="https://fuellabs.github.io/fuels-wallet/latest.json" VITE_FUEL_PROVIDER_URL=http://localhost:4001/graphql VITE_FUEL_FAUCET_URL=http://localhost:4041 VITE_EXPLORER_URL=https://app.fuel.network/ diff --git a/packages/app/env.d.ts b/packages/app/env.d.ts index cbc5223358..b72c694388 100644 --- a/packages/app/env.d.ts +++ b/packages/app/env.d.ts @@ -7,6 +7,7 @@ declare namespace NodeJS { readonly VITE_MNEMONIC_WORDS: string; readonly VITE_ADDR_OWNER: string; readonly VITE_CRX_NAME: string; + readonly VITE_CRX_VERSION_API: string; readonly VITE_CRX_RELEASE: string; readonly VITE_AUTO_LOCK_IN_MINUTES: string; } diff --git a/packages/app/src/config.ts b/packages/app/src/config.ts index 44dff0c38b..637479b43b 100644 --- a/packages/app/src/config.ts +++ b/packages/app/src/config.ts @@ -10,6 +10,7 @@ export const { VITE_DATABASE_VERSION, VITE_CRX_NAME, VITE_CRX, + VITE_CRX_VERSION_API, VITE_AUTO_LOCK_IN_MINUTES, VITE_SENTRY_DSN, VITE_EXPLORER_URL, diff --git a/packages/app/src/systems/CRX/background/actions/autoUpdate.ts b/packages/app/src/systems/CRX/background/actions/autoUpdate.ts new file mode 100644 index 0000000000..109afd8f21 --- /dev/null +++ b/packages/app/src/systems/CRX/background/actions/autoUpdate.ts @@ -0,0 +1,38 @@ +import { compareVersions } from 'compare-versions'; +import { APP_VERSION, VITE_CRX_VERSION_API, WALLET_NAME } from '~/config'; + +// Check if user has any open tab if not return false +async function isOpen() { + // biome-ignore lint/suspicious/noExplicitAny: getContexts is not available on current types + const contexts = await (chrome.runtime as any).getContexts({}); + const isOpen = !!contexts.find(({ contextType }: { contextType: string }) => + ['TAB', 'POPUP'].includes(contextType) + ); + return isOpen; +} + +async function runVersionCheck() { + const latestVersion = await fetch(VITE_CRX_VERSION_API) + .then((res) => res.json()) + // If fails to fetch the version return a empty object + .catch(() => ({})); + const version = latestVersion[WALLET_NAME] || APP_VERSION; + // If app version is greater than the one on the release API ignores the check + if (compareVersions(APP_VERSION, version) > -1) return; + if (await isOpen()) return; + // Request update check and reload if available + console.log('[FUEL WALLET] Checking for updates...'); + chrome.runtime.requestUpdateCheck((details) => { + if (details === 'update_available') { + console.log('[FUEL WALLET] Update available reload application...'); + chrome.runtime.reload(); + } + }); +} + +chrome.alarms.create('autoUpdate', { periodInMinutes: 5 }); +chrome.alarms.onAlarm.addListener(async (alarm) => { + if (alarm.name === 'autoUpdate') { + runVersionCheck(); + } +}); diff --git a/packages/app/src/systems/CRX/background/index.ts b/packages/app/src/systems/CRX/background/index.ts index 0ac7ec82c3..0aaab88dd9 100644 --- a/packages/app/src/systems/CRX/background/index.ts +++ b/packages/app/src/systems/CRX/background/index.ts @@ -1,3 +1,4 @@ +import './actions/autoUpdate'; import './actions/keepAwake'; import './actions/onInstall'; import './communication'; diff --git a/packages/app/src/vite-env.d.ts b/packages/app/src/vite-env.d.ts index fbbba0f8e4..979264c448 100644 --- a/packages/app/src/vite-env.d.ts +++ b/packages/app/src/vite-env.d.ts @@ -6,6 +6,7 @@ interface ImportMetaEnv { readonly VITE_MNEMONIC_WORDS: number; readonly VITE_APP_VERSION: string; readonly VITE_CRX: string; + readonly VITE_CRX_VERSION_API: string; readonly VITE_ADDR_OWNER: string; readonly VITE_CRX_NAME: string; readonly VITE_AUTO_LOCK_IN_MINUTES: number;