|
import { useEffect, useState } from 'react'; |
|
import { MessageExtraContext } from './types'; |
|
|
|
|
|
|
|
|
|
interface SetTextEvData { |
|
text: string; |
|
context: string; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
export const useVSCodeContext = ( |
|
inputRef: React.RefObject<HTMLTextAreaElement>, |
|
setInputMsg: (text: string) => void |
|
) => { |
|
const [extraContext, setExtraContext] = useState<MessageExtraContext | null>( |
|
null |
|
); |
|
|
|
|
|
useEffect(() => { |
|
const handleMessage = (event: MessageEvent) => { |
|
if (event.data?.command === 'setText') { |
|
const data: SetTextEvData = event.data; |
|
setInputMsg(data?.text); |
|
if (data?.context && data.context.length > 0) { |
|
setExtraContext({ |
|
type: 'context', |
|
content: data.context, |
|
}); |
|
} |
|
inputRef.current?.focus(); |
|
} |
|
}; |
|
|
|
window.addEventListener('message', handleMessage); |
|
return () => window.removeEventListener('message', handleMessage); |
|
}, [inputRef, setInputMsg]); |
|
|
|
|
|
useEffect(() => { |
|
const handleKeyDown = (event: KeyboardEvent) => { |
|
if (event.key === 'Escape') { |
|
window.parent.postMessage({ command: 'escapePressed' }, '*'); |
|
} |
|
}; |
|
|
|
window.addEventListener('keydown', handleKeyDown); |
|
return () => window.removeEventListener('keydown', handleKeyDown); |
|
}, []); |
|
|
|
return { |
|
extraContext, |
|
|
|
clearExtraContext: () => setExtraContext(null), |
|
}; |
|
}; |
|
|