diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 5f52ace..934d635 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -2861,7 +2861,7 @@ export function App(): ReactElement { const persistAccountToggle = async ( nextDraft: RendererSettingsDraft, - refreshBeforePersist?: () => Promise + refreshBeforePersist?: () => ReturnType ): Promise => { const previousDraft = settingsDraft; const previousDirty = settingsDirtyRef.current; @@ -2905,7 +2905,7 @@ export function App(): ReactElement { }; await persistAccountToggle( nextDraft, - enabled ? async () => { await window.rd.checkAccountCredentials({ kind: "debridlink-api", accountId: key.id }); } : undefined + enabled ? () => window.rd.checkAccountCredentials({ kind: "debridlink-api", accountId: key.id }) : undefined ); showToast( enabled @@ -2953,7 +2953,7 @@ export function App(): ReactElement { megaDebridApiDisabledAccountIds: apiDisabledIds, megaDebridWebDisabledAccountIds: webDisabledIds }, enabled - ? async () => { await window.rd.checkAccountCredentials({ kind, accountId }); } + ? () => window.rd.checkAccountCredentials({ kind, accountId }) : undefined ); showToast(enabled ? "Account aktiviert" : "Account deaktiviert", 2000); @@ -3010,7 +3010,7 @@ export function App(): ReactElement { disabledProviders: nextState.disabledProviders, realDebridDisabledAccountIds: nextState.disabledAccountIds }, enabled - ? async () => { await window.rd.checkAccountCredentials({ kind, accountId }); } + ? () => window.rd.checkAccountCredentials({ kind, accountId }) : undefined ); showToast(enabled ? "Account aktiviert" : "Account deaktiviert", 2000); diff --git a/src/renderer/account-ui.ts b/src/renderer/account-ui.ts index 47045bd..ea9fdf2 100644 --- a/src/renderer/account-ui.ts +++ b/src/renderer/account-ui.ts @@ -146,11 +146,14 @@ export async function runOptimisticAccountUpdate( } export async function runAccountEnableRefresh( - refresh: (() => Promise) | undefined, + refresh: (() => Promise<{ valid: boolean; message?: string }>) | undefined, persist: () => Promise ): Promise { if (refresh) { - await refresh(); + const status = await refresh(); + if (!status.valid) { + throw new Error(status.message || "Accountprüfung fehlgeschlagen"); + } } return persist(); } diff --git a/tests/account-ui.test.ts b/tests/account-ui.test.ts index b84bb3f..383c057 100644 --- a/tests/account-ui.test.ts +++ b/tests/account-ui.test.ts @@ -141,7 +141,7 @@ describe("account activation refresh", () => { const events: string[] = []; await runAccountEnableRefresh( - async () => { events.push("check"); }, + async () => { events.push("check"); return { valid: true, message: "Premium aktiv" }; }, async () => { events.push("persist"); } ); @@ -158,4 +158,15 @@ describe("account activation refresh", () => { expect(events).toEqual(["persist"]); }); + + it("does not enable an account whose silent refresh is invalid", async () => { + const events: string[] = []; + + await expect(runAccountEnableRefresh( + async () => { events.push("check"); return { valid: false, message: "Sitzung abgelaufen" }; }, + async () => { events.push("persist"); } + )).rejects.toThrow("Sitzung abgelaufen"); + + expect(events).toEqual(["check"]); + }); });