diff --git a/.changeset/ninety-donkeys-shop.md b/.changeset/ninety-donkeys-shop.md new file mode 100644 index 0000000000..53e78afc6a --- /dev/null +++ b/.changeset/ninety-donkeys-shop.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Fixed an issue causing `OAuthRequestDialog` to re-render on mount. diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts index 193c474361..b5261bd1e2 100644 --- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts +++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts @@ -17,11 +17,19 @@ import { OAuthRequestApi, OAuthRequesterOptions, + PendingOAuthRequest, } from '@backstage/core-plugin-api'; import { OAuthRequestManager } from './OAuthRequestManager'; export default class MockOAuthApi implements OAuthRequestApi { private readonly real = new OAuthRequestManager(); + private requests: PendingOAuthRequest[] = []; + + constructor() { + this.authRequest$().subscribe(requests => { + this.requests = requests; + }); + } createAuthRequester(options: OAuthRequesterOptions) { return this.real.createAuthRequester(options); @@ -34,25 +42,12 @@ export default class MockOAuthApi implements OAuthRequestApi { async triggerAll() { await Promise.resolve(); // Wait a tick to allow new requests to get forwarded - return new Promise(resolve => { - const subscription = this.authRequest$().subscribe(requests => { - subscription.unsubscribe(); - Promise.all(requests.map(request => request.trigger())).then(() => - resolve(), - ); - }); - }); + return Promise.all(this.requests.map(request => request.trigger())); } async rejectAll() { await Promise.resolve(); // Wait a tick to allow new requests to get forwarded - return new Promise(resolve => { - const subscription = this.authRequest$().subscribe(requests => { - subscription.unsubscribe(); - requests.map(request => request.reject()); - resolve(); - }); - }); + this.requests.forEach(request => request.reject()); } } diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts index 4dd6af715e..226ca5eb28 100644 --- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts +++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts @@ -34,12 +34,12 @@ describe('OAuthRequestManager', () => { expect(reqSpy).toHaveBeenCalledTimes(0); await 'a tick'; - expect(reqSpy).toHaveBeenCalledTimes(2); + expect(reqSpy).toHaveBeenCalledTimes(1); expect(reqSpy).toHaveBeenLastCalledWith([]); const req = requester(new Set(['my-scope'])); - expect(reqSpy).toHaveBeenCalledTimes(3); + expect(reqSpy).toHaveBeenCalledTimes(2); expect(reqSpy).toHaveBeenLastCalledWith([ expect.objectContaining({ reject: expect.any(Function), @@ -51,7 +51,7 @@ describe('OAuthRequestManager', () => { 'not yet', ); - const [request] = reqSpy.mock.calls[2][0]; + const [request] = reqSpy.mock.calls[1][0]; request.trigger(); await expect(req).resolves.toBe('hello'); diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts index 5d467be7b4..0f7ad0f2c7 100644 --- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts +++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts @@ -22,7 +22,7 @@ import { } from '@backstage/core-plugin-api'; import { Observable } from '@backstage/types'; import { OAuthPendingRequests, PendingRequest } from './OAuthPendingRequests'; -import { BehaviorSubject } from '../../../lib/subjects'; +import { PublishSubject } from '../../../lib/subjects'; /** * The OAuthRequestManager is an implementation of the OAuthRequestApi. @@ -34,7 +34,7 @@ import { BehaviorSubject } from '../../../lib/subjects'; * @public */ export class OAuthRequestManager implements OAuthRequestApi { - private readonly subject = new BehaviorSubject([]); + private readonly subject = new PublishSubject(); private currentRequests: PendingOAuthRequest[] = []; private handlerCount = 0;