File size: 1,904 Bytes
c2c8c8d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import { useCallback, useRef, useEffect } from 'react';
import { useWebSocket } from './useWebSocket';
import { useEditorStore } from '@/stores/editorStore';
import { useAIStore } from '@/stores/aiStore';
import { useSettingsStore } from '@/stores/settingsStore';
export function useCodeCompletion() {
const { socket } = useWebSocket();
const { setCompletionSuggestion } = useAIStore();
const aiCompletions = useSettingsStore((s) => s.aiCompletions);
const timerRef = useRef<ReturnType<typeof setTimeout>>();
useEffect(() => {
if (!socket) return;
const handleResult = (data: { suggestion: string }) => {
if (data.suggestion) {
setCompletionSuggestion(data.suggestion);
}
};
socket.on('completion:result', handleResult);
return () => { socket.off('completion:result', handleResult); };
}, [socket, setCompletionSuggestion]);
const requestCompletion = useCallback(
(filePath: string, prefix: string, suffix: string, language: string) => {
if (!aiCompletions || !socket) return;
if (timerRef.current) clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
const editorState = useEditorStore.getState();
const recentFiles = editorState.recentFiles
.filter((f) => f !== filePath)
.slice(0, 3)
.map((f) => {
const file = editorState.openFiles[f];
return file ? { path: f, content: file.content } : null;
})
.filter(Boolean);
socket.emit('completion:request', {
filePath,
prefix,
suffix,
language,
contextFiles: recentFiles,
});
}, 500);
},
[socket, aiCompletions]
);
const dismissCompletion = useCallback(() => {
setCompletionSuggestion(null);
}, [setCompletionSuggestion]);
return { requestCompletion, dismissCompletion };
}
|