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