Spaces:
Sleeping
Sleeping
| 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 }; | |
| }; |