File size: 1,491 Bytes
eebc40f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { useCallback, useRef } from 'react';

/**
 * Hook pour debouncer les mises à jour
 * Évite les mises à jour excessives
 */
export const useDebouncedUpdates = (delay = 16) => { // 16ms = ~60fps
  const timeoutRef = useRef(null);
  const pendingUpdateRef = useRef(null);
  
  // Fonction debounced pour les mises à jour
  const debouncedUpdate = useCallback((updateFn) => {
    // Stocker la fonction de mise à jour
    pendingUpdateRef.current = updateFn;
    
    // Annuler le timeout précédent
    if (timeoutRef.current) {
      clearTimeout(timeoutRef.current);
    }
    
    // Programmer la mise à jour
    timeoutRef.current = setTimeout(() => {
      if (pendingUpdateRef.current) {
        pendingUpdateRef.current();
        pendingUpdateRef.current = null;
      }
    }, delay);
  }, [delay]);
  
  // Fonction pour forcer une mise à jour immédiate
  const flushUpdate = useCallback(() => {
    if (timeoutRef.current) {
      clearTimeout(timeoutRef.current);
      timeoutRef.current = null;
    }
    if (pendingUpdateRef.current) {
      pendingUpdateRef.current();
      pendingUpdateRef.current = null;
    }
  }, []);
  
  // Fonction pour annuler les mises à jour en attente
  const cancelUpdate = useCallback(() => {
    if (timeoutRef.current) {
      clearTimeout(timeoutRef.current);
      timeoutRef.current = null;
    }
    pendingUpdateRef.current = null;
  }, []);
  
  return {
    debouncedUpdate,
    flushUpdate,
    cancelUpdate
  };
};