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 };
}