diff --git a/eslint.config.mjs b/eslint.config.mjs index 26afa33a..f1798d8b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -28,15 +28,18 @@ export default [ }, plugins: { "@typescript-eslint": tseslint, - "react": reactPlugin, + react: reactPlugin, "react-hooks": reactHooksPlugin, }, rules: { ...tseslint.configs.recommended.rules, - "@typescript-eslint/no-unused-vars": ["warn", { - argsIgnorePattern: "^_", - varsIgnorePattern: "^_" - }], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-empty-object-type": "off", "react-hooks/rules-of-hooks": "error", diff --git a/stores/auth-store.ts b/stores/auth-store.ts index 637cd093..e9ea638f 100644 --- a/stores/auth-store.ts +++ b/stores/auth-store.ts @@ -741,23 +741,39 @@ export const useAuthStore = create()( } } catch (err) { debug.error(`Failed to restore client for ${accountId}:`, err); - accountStore.updateAccount(accountId, { - isConnected: false, - hasError: true, - errorMessage: err instanceof Error ? err.message : 'Connection failed', - }); - set({ isLoading: false }); - return; } } if (!targetClient) { - accountStore.updateAccount(accountId, { - isConnected: false, - hasError: true, - errorMessage: 'Unable to restore session', - }); + // Cannot restore — remove the stale account and redirect to login + evictAccount(accountId); + accountStore.removeAccount(accountId); + fetch(`/api/auth/session?slot=${targetAccount.cookieSlot}`, { method: 'DELETE' }).catch(() => {}); + + // Restore the previous account if still available + if (state.activeAccountId && state.activeAccountId !== accountId) { + const prevClient = clients.get(state.activeAccountId); + const prevAccount = accountStore.getAccountById(state.activeAccountId); + if (prevClient && prevAccount) { + restoreAccount(state.activeAccountId); + accountStore.setActiveAccount(state.activeAccountId); + set({ + isLoading: false, + serverUrl: prevAccount.serverUrl, + username: prevAccount.username, + client: prevClient, + authMode: prevAccount.authMode, + rememberMe: prevAccount.rememberMe, + connectionLost: false, + activeAccountId: state.activeAccountId, + }); + return; + } + } + set({ isLoading: false }); + // Redirect to login so the user can re-authenticate + replaceWindowLocation(getLocaleLoginPath()); return; } @@ -865,11 +881,11 @@ export const useAuthStore = create()( } } catch (err) { debug.error(`Failed to restore account ${account.id}:`, err); - accountStore.updateAccount(account.id, { - isConnected: false, - hasError: true, - errorMessage: err instanceof Error ? err.message : 'Restore failed', - }); + // Remove unrestorable accounts so the user is prompted to log in + // again rather than seeing a stale error entry forever. + evictAccount(account.id); + accountStore.removeAccount(account.id); + fetch(`/api/auth/session?slot=${account.cookieSlot}`, { method: 'DELETE' }).catch(() => {}); } }