import { useRef, useCallback } from 'react'; export interface PendingUpdate { id: string; timestamp: number; data: T; operation: 'create' | 'update' | 'delete' | 'reorder'; } /** * Hook for tracking optimistic updates to prevent re-applying server echoes * * @example * const { addPendingUpdate, isPendingUpdate } = useOptimisticUpdates(); * * // When making an optimistic update * addPendingUpdate({ * id: task.id, * timestamp: Date.now(), * data: updatedTask, * operation: 'update' * }); * * // When receiving server update * if (!isPendingUpdate(task.id, serverTask)) { * // Apply the update * } */ export function useOptimisticUpdates() { const pendingUpdatesRef = useRef>>(new Map()); const addPendingUpdate = useCallback((update: PendingUpdate) => { pendingUpdatesRef.current.set(update.id, update); // Auto-cleanup after 5 seconds setTimeout(() => { pendingUpdatesRef.current.delete(update.id); }, 5000); }, []); const isPendingUpdate = useCallback((id: string, data: T): boolean => { const pending = pendingUpdatesRef.current.get(id); if (!pending) return false; // Compare relevant fields based on operation type return JSON.stringify(pending.data) === JSON.stringify(data); }, []); const removePendingUpdate = useCallback((id: string) => { pendingUpdatesRef.current.delete(id); }, []); return { addPendingUpdate, isPendingUpdate, removePendingUpdate }; }