| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { useEffect } from 'react';
- import { ChatTextareaApi } from '../components/useChatTextarea.ts';
- import { ChatExtraContextApi } from '../components/useChatExtraContext.tsx';
- // Extra context when using llama.cpp WebUI from llama-vscode, inside an iframe
- // Ref: https://github.com/ggml-org/llama.cpp/pull/11940
- interface SetTextEvData {
- text: string;
- context: string;
- }
- /**
- * To test it:
- * window.postMessage({ command: 'setText', text: 'Spot the syntax error', context: 'def test()\n return 123' }, '*');
- */
- export const useVSCodeContext = (
- textarea: ChatTextareaApi,
- extraContext: ChatExtraContextApi
- ) => {
- // Accept setText message from a parent window and set inputMsg and extraContext
- useEffect(() => {
- const handleMessage = (event: MessageEvent) => {
- if (event.data?.command === 'setText') {
- const data: SetTextEvData = event.data;
- textarea.setValue(data?.text);
- if (data?.context && data.context.length > 0) {
- extraContext.clearItems();
- extraContext.addItems([
- {
- type: 'context',
- name: 'Extra context',
- content: data.context,
- },
- ]);
- }
- textarea.focus();
- setTimeout(() => {
- textarea.refOnSubmit.current?.();
- }, 10); // wait for setExtraContext to finish
- }
- };
- window.addEventListener('message', handleMessage);
- return () => window.removeEventListener('message', handleMessage);
- }, [textarea, extraContext]);
- // Add a keydown listener that sends the "escapePressed" message to the parent window
- useEffect(() => {
- const handleKeyDown = (event: KeyboardEvent) => {
- if (event.key === 'Escape') {
- window.parent.postMessage({ command: 'escapePressed' }, '*');
- }
- };
- window.addEventListener('keydown', handleKeyDown);
- return () => window.removeEventListener('keydown', handleKeyDown);
- }, []);
- return {};
- };
|