| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import { useEffect, useState } from 'react';
- import { MessageExtraContext } from './types';
- import { OptimizedTextareaValue } from '../components/ChatScreen';
- // 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: OptimizedTextareaValue) => {
- const [extraContext, setExtraContext] = useState<MessageExtraContext | null>(
- null
- );
- // 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) {
- setExtraContext({
- type: 'context',
- content: data.context,
- });
- }
- textarea.focus();
- }
- };
- window.addEventListener('message', handleMessage);
- return () => window.removeEventListener('message', handleMessage);
- }, [textarea]);
- // 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 {
- extraContext,
- // call once the user message is sent, to clear the extra context
- clearExtraContext: () => setExtraContext(null),
- };
- };
|