import * as React from 'react'; import { Box, Text } from '../../ink.js'; import { Select } from '../CustomSelect/select.js'; import { PermissionDialog } from '../permissions/PermissionDialog.js'; type Props = { pluginName: string; pluginDescription?: string; fileExtension: string; onResponse: (response: 'yes' | 'no' | 'never' | 'disable') => void; }; const AUTO_DISMISS_MS = 30_000; export function LspRecommendationMenu({ pluginName, pluginDescription, fileExtension, onResponse }: Props): React.ReactNode { // Use ref to avoid timer reset when onResponse changes const onResponseRef = React.useRef(onResponse); onResponseRef.current = onResponse; // 30-second auto-dismiss timer - counts as ignored (no) React.useEffect(() => { const timeoutId = setTimeout(ref => ref.current('no'), AUTO_DISMISS_MS, onResponseRef); return () => clearTimeout(timeoutId); }, []); function onSelect(value: string): void { switch (value) { case 'yes': onResponse('yes'); break; case 'no': onResponse('no'); break; case 'never': onResponse('never'); break; case 'disable': onResponse('disable'); break; } } const options = [{ label: Yes, install {pluginName} , value: 'yes' }, { label: 'No, not now', value: 'no' }, { label: Never for {pluginName} , value: 'never' }, { label: 'Disable all LSP recommendations', value: 'disable' }]; return LSP provides code intelligence like go-to-definition and error checking Plugin: {pluginName} {pluginDescription && {pluginDescription} } Triggered by: {fileExtension} files Would you like to install this LSP plugin?