File size: 2,677 Bytes
df04e9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { useCallback, useRef } from 'react';
import { useApi } from '@/contexts/ApiContext';

export const useAutoSave = () => {
  const { baseUrl, fetchWithHeaders } = useApi();
  const timeoutRefs = useRef<{ [key: string]: NodeJS.Timeout }>({});
  const configTimeoutRefs = useRef<{ [key: string]: NodeJS.Timeout }>({});

  const savePortAutomatically = useCallback(async (robotType: 'leader' | 'follower', port: string) => {
    if (!port.trim()) return;
    
    try {
      await fetchWithHeaders(`${baseUrl}/save-robot-port`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          robot_type: robotType,
          port: port.trim(),
        }),
      });
      console.log(`Auto-saved ${robotType} port: ${port}`);
    } catch (error) {
      console.error(`Error saving ${robotType} port:`, error);
    }
  }, [baseUrl, fetchWithHeaders]);

  const saveConfigAutomatically = useCallback(async (robotType: 'leader' | 'follower', configName: string) => {
    if (!configName.trim()) return;
    
    try {
      await fetchWithHeaders(`${baseUrl}/save-robot-config`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          robot_type: robotType,
          config_name: configName.trim(),
        }),
      });
      console.log(`Auto-saved ${robotType} config: ${configName}`);
    } catch (error) {
      console.error(`Error saving ${robotType} config:`, error);
    }
  }, [baseUrl, fetchWithHeaders]);

  const debouncedSavePort = useCallback((robotType: 'leader' | 'follower', port: string, delay: number = 1500) => {
    // Clear existing timeout for this robotType
    if (timeoutRefs.current[robotType]) {
      clearTimeout(timeoutRefs.current[robotType]);
    }

    // Set new timeout
    timeoutRefs.current[robotType] = setTimeout(() => {
      savePortAutomatically(robotType, port);
      delete timeoutRefs.current[robotType];
    }, delay);
  }, [savePortAutomatically]);

  const debouncedSaveConfig = useCallback((robotType: 'leader' | 'follower', configName: string, delay: number = 1000) => {
    const key = `${robotType}_config`;
    
    // Clear existing timeout for this robotType config
    if (configTimeoutRefs.current[key]) {
      clearTimeout(configTimeoutRefs.current[key]);
    }

    // Set new timeout
    configTimeoutRefs.current[key] = setTimeout(() => {
      saveConfigAutomatically(robotType, configName);
      delete configTimeoutRefs.current[key];
    }, delay);
  }, [saveConfigAutomatically]);

  return { debouncedSavePort, debouncedSaveConfig };
};