diff --git a/packages/cli/src/ui/components/views/ExtensionDetails.test.tsx b/packages/cli/src/ui/components/views/ExtensionDetails.test.tsx index 50947d1127..d7e4fb8ae4 100644 --- a/packages/cli/src/ui/components/views/ExtensionDetails.test.tsx +++ b/packages/cli/src/ui/components/views/ExtensionDetails.test.tsx @@ -108,12 +108,16 @@ describe('ExtensionDetails', () => { }); it('should NOT call onInstall when Enter is pressed and already installed', async () => { + vi.useFakeTimers(); const { stdin } = renderDetails(true); await React.act(async () => { stdin.write('\r'); // Enter }); - // Wait a bit to ensure it's not called - await new Promise((resolve) => setTimeout(resolve, 100)); + // Advance timers to trigger the keypress flush + await React.act(async () => { + vi.runAllTimers(); + }); expect(mockOnInstall).not.toHaveBeenCalled(); + vi.useRealTimers(); }); }); diff --git a/packages/cli/src/ui/components/views/ExtensionDetails.tsx b/packages/cli/src/ui/components/views/ExtensionDetails.tsx index 7135eb1ba4..7ee38c0e54 100644 --- a/packages/cli/src/ui/components/views/ExtensionDetails.tsx +++ b/packages/cli/src/ui/components/views/ExtensionDetails.tsx @@ -5,6 +5,7 @@ */ import type React from 'react'; +import { useState } from 'react'; import { Box, Text } from 'ink'; import type { RegistryExtension } from '../../../config/extensionRegistryClient.js'; import { useKeypress } from '../../hooks/useKeypress.js'; @@ -17,12 +18,10 @@ export interface ExtensionDetailsProps { onBack: () => void; onInstall: ( requestConsentOverride: (consent: string) => Promise, - ) => void; + ) => void | Promise; isInstalled: boolean; } -import { useState } from 'react'; - export function ExtensionDetails({ extension, onBack, @@ -59,7 +58,7 @@ export function ExtensionDetails({ } if (keyMatchers[Command.RETURN](key) && !isInstalled && !isInstalling) { setIsInstalling(true); - onInstall( + void onInstall( (prompt: string) => new Promise((resolve) => { setConsentRequest({ prompt, resolve }); diff --git a/packages/cli/src/ui/components/views/ExtensionRegistryView.tsx b/packages/cli/src/ui/components/views/ExtensionRegistryView.tsx index b939dab089..57178f21c8 100644 --- a/packages/cli/src/ui/components/views/ExtensionRegistryView.tsx +++ b/packages/cli/src/ui/components/views/ExtensionRegistryView.tsx @@ -255,9 +255,9 @@ export function ExtensionRegistryView({ - handleInstall(selectedExtension, requestConsentOverride) - } + onInstall={async (requestConsentOverride) => { + await handleInstall(selectedExtension, requestConsentOverride); + }} isInstalled={installedExtensions.some( (e) => e.name === selectedExtension.extensionName, )}