leLab / src /hooks /useAutoSave.ts
David
save port and calibration config on every change
df04e9d
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 };
};