From e69a79304307fd650dfba1f28bdd5788fb79a40e Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 25 Apr 2025 20:54:39 +0200 Subject: [PATCH 1/3] core-app-api: use PublishSubject in OAuthRequestManager Signed-off-by: Vincenzo Scamporlino --- .../OAuthRequestApi/OAuthRequestManager.test.ts | 6 +++--- .../implementations/OAuthRequestApi/OAuthRequestManager.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) 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; From cc119b2158e24ed7db6dabd8b27fa8a797f4a58d Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 25 Apr 2025 20:54:55 +0200 Subject: [PATCH 2/3] core-app-api: changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/ninety-donkeys-shop.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ninety-donkeys-shop.md 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. From b445cfd9ec22732420413824242ed67145fe483d Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 28 Apr 2025 16:37:00 +0200 Subject: [PATCH 3/3] core-app-api: update MockOAuthApi subscribe Signed-off-by: Vincenzo Scamporlino --- .../OAuthRequestApi/MockOAuthApi.ts | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) 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()); } }