diff --git a/packages/core/src/QubicConnect.ts b/packages/core/src/QubicConnect.ts index 52f2b20..a2b9b06 100644 --- a/packages/core/src/QubicConnect.ts +++ b/packages/core/src/QubicConnect.ts @@ -174,15 +174,22 @@ export class QubicConnect { this.handleRedirectResult(); initGaTrack(this.config.trackGaSettings); + // when state changed, persist user + this.onAuthStateChanged(QubicConnect.persistUser); + // hydrateUser will trigger handleLogin/handleLogout this.hydrateUser() - .then(() => { - this.onAuthStateChanged(QubicConnect.persistUser); + .then(hasSavedUser => { + this.isUserReady = true; + // no stored user and no redirect result or error + if (!hasSavedUser && !this.hasRedirectResult) { + this.handleLogout(null); + } if (!this.user && this.shouldAutoLoginInWalletIab) { this.loginWithWallet(window.ethereum?.isQubic ? 'qubic' : 'metamask'); } }) - .finally(() => { + .catch(() => { this.isUserReady = true; }); } @@ -204,9 +211,9 @@ export class QubicConnect { } } - private async hydrateUser() { + private async hydrateUser(): Promise { const saved = localStorage.getItem(USER_STORAGE_KEY); - if (!saved) return; + if (!saved) return false; try { const user = JSON.parse(saved) as WalletUser; setAccessToken(user.accessToken); @@ -215,23 +222,24 @@ export class QubicConnect { provider.enable(); } if (QubicConnect.ifTokenExpired(user.expiredAt)) { - this.handleLogout(null); - } else { - // login again to get qubicUser data if exists - const { - me: { qubicUser }, - } = await getMe(this.marketRequestGraphql); - - this.handleLogin(null, { - ...user, - qubicUser, - provider, - }); + return false; } + // login again to get qubicUser data if exists + const { + me: { qubicUser }, + } = await getMe(this.marketRequestGraphql); + + this.handleLogin(null, { + ...user, + qubicUser, + provider, + }); + return true; } catch (error) { // ignore error console.warn('can not recover user from localStorage'); } + return false; } private handleUserPurge() { @@ -374,7 +382,9 @@ export class QubicConnect { public async logout(): Promise { try { - await logout(this.fetch); + if (this.accessToken) { + await logout(this.fetch); + } this.handleLogout(null); } catch (error) { if (error instanceof Error) { @@ -502,6 +512,7 @@ export class QubicConnect { return parsedQuery; } + private hasRedirectResult = false; private async handleRedirectResult(): Promise { try { const responsePassToConnect = QubicConnect.getRedirectResultFromUrlAndClearUrl(); @@ -513,6 +524,8 @@ export class QubicConnect { return; } + this.hasRedirectResult = true; + if (responsePassToConnect.action === 'bind') { // handle all bin error message here if ('errorMessage' in responsePassToConnect) {