{"version":3,"file":"optimistic-ui.mjs","sources":["../../../src/lib/ux/optimistic-ui.ts"],"sourcesContent":["/**\n * @file Optimistic UI Updates\n * @description Optimistic update utilities for React applications.\n * Provides patterns for immediate UI feedback with automatic rollback.\n *\n * Features:\n * - Optimistic state management\n * - Automatic rollback on error\n * - Pending state tracking\n * - Conflict resolution\n * - Retry mechanisms\n * - Undo support\n */\n\n/* eslint-disable @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing, prefer-destructuring */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Optimistic update status\n */\nexport type OptimisticStatus = 'pending' | 'confirmed' | 'failed' | 'rolled-back';\n\n/**\n * Optimistic update entry\n */\nexport interface OptimisticUpdate<T = unknown> {\n  id: string;\n  previousValue: T;\n  optimisticValue: T;\n  status: OptimisticStatus;\n  timestamp: number;\n  retryCount: number;\n  error?: Error;\n}\n\n/**\n * Optimistic update result\n */\nexport interface OptimisticResult<T> {\n  value: T;\n  pending: boolean;\n  error: Error | null;\n  retry: () => Promise<void>;\n  rollback: () => void;\n}\n\n/**\n * Optimistic manager configuration\n */\nexport interface OptimisticConfig {\n  /** Maximum retry attempts */\n  maxRetries: number;\n  /** Retry delay in ms */\n  retryDelay: number;\n  /** Retry backoff multiplier */\n  retryBackoff: number;\n  /** Enable automatic retry on failure */\n  autoRetry: boolean;\n  /** Timeout for optimistic updates in ms */\n  timeout: number;\n  /** Keep history for undo */\n  keepHistory: boolean;\n  /** Maximum history size */\n  maxHistorySize: number;\n  /** Debug mode */\n  debug: boolean;\n}\n\n/**\n * Mutation function type\n */\nexport type MutationFn<T, TArgs extends unknown[] = unknown[]> = (...args: TArgs) => Promise<T>;\n\n/**\n * Optimistic value updater\n */\nexport type OptimisticUpdater<T> = (currentValue: T) => T;\n\n/**\n * Conflict resolver\n */\nexport type ConflictResolver<T> = (localValue: T, serverValue: T, baseValue: T) => T;\n\n/**\n * Update listener\n */\nexport type UpdateListener<T> = (update: OptimisticUpdate<T>) => void;\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: OptimisticConfig = {\n  maxRetries: 3,\n  retryDelay: 1000,\n  retryBackoff: 2,\n  autoRetry: true,\n  timeout: 30000,\n  keepHistory: true,\n  maxHistorySize: 50,\n  debug: false,\n};\n\n// ============================================================================\n// Optimistic Update Manager\n// ============================================================================\n\n/**\n * Manages optimistic updates with rollback support\n */\nexport class OptimisticUpdateManager<T> {\n  private config: OptimisticConfig;\n  private currentValue: T;\n  private updates: Map<string, OptimisticUpdate<T>> = new Map();\n  private history: Array<{ id: string; value: T }> = [];\n  private listeners: Set<UpdateListener<T>> = new Set();\n  private idCounter = 0;\n\n  constructor(initialValue: T, config: Partial<OptimisticConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.currentValue = initialValue;\n  }\n\n  /**\n   * Get the current value (with pending optimistic updates applied)\n   */\n  getValue(): T {\n    return this.currentValue;\n  }\n\n  /**\n   * Get the confirmed value (without pending updates)\n   */\n  getConfirmedValue(): T {\n    let value = this.currentValue;\n\n    // Roll back pending updates to get confirmed value\n    const pendingUpdates = Array.from(this.updates.values())\n      .filter((u) => u.status === 'pending')\n      .reverse();\n\n    for (const update of pendingUpdates) {\n      value = update.previousValue;\n    }\n\n    return value;\n  }\n\n  /**\n   * Apply an optimistic update\n   */\n  async applyUpdate<TArgs extends unknown[]>(\n    updater: OptimisticUpdater<T>,\n    mutation: MutationFn<T, TArgs>,\n    ...args: TArgs\n  ): Promise<OptimisticResult<T>> {\n    const id = this.generateId();\n    const previousValue = this.currentValue;\n    const optimisticValue = updater(this.currentValue);\n\n    // Apply optimistic update immediately\n    this.currentValue = optimisticValue;\n\n    const update: OptimisticUpdate<T> = {\n      id,\n      previousValue,\n      optimisticValue,\n      status: 'pending',\n      timestamp: Date.now(),\n      retryCount: 0,\n    };\n\n    this.updates.set(id, update);\n    this.notifyListeners(update);\n    this.log(`Applied optimistic update: ${id}`);\n\n    // Execute mutation\n    const execute = async (): Promise<void> => {\n      try {\n        const serverValue = await this.executeWithTimeout(mutation(...args), this.config.timeout);\n\n        // Confirm the update\n        update.status = 'confirmed';\n        this.currentValue = serverValue;\n        this.addToHistory(id, serverValue);\n        this.notifyListeners(update);\n        this.log(`Confirmed update: ${id}`);\n      } catch (error) {\n        update.error = error instanceof Error ? error : new Error(String(error));\n        update.status = 'failed';\n        this.notifyListeners(update);\n        this.log(`Update failed: ${id}`, update.error);\n\n        // Auto retry\n        if (this.config.autoRetry && update.retryCount < this.config.maxRetries) {\n          await this.retryUpdate(id, mutation, ...args);\n        } else {\n          // Rollback\n          this.rollbackUpdate(id);\n        }\n      }\n    };\n\n    await execute();\n\n    return {\n      value: this.currentValue,\n      pending: true,\n      error: null,\n      retry: async () => this.retryUpdate(id, mutation, ...args),\n      rollback: () => this.rollbackUpdate(id),\n    };\n  }\n\n  /**\n   * Retry a failed update\n   */\n  async retryUpdate<TArgs extends unknown[]>(\n    id: string,\n    mutation: MutationFn<T, TArgs>,\n    ...args: TArgs\n  ): Promise<void> {\n    const update = this.updates.get(id);\n    if (update?.status !== 'failed') {\n      return;\n    }\n\n    update.retryCount++;\n    update.status = 'pending';\n    update.error = undefined;\n    this.notifyListeners(update);\n\n    const delay = this.calculateRetryDelay(update.retryCount);\n    this.log(`Retrying update ${id} in ${delay}ms (attempt ${update.retryCount})`);\n\n    await this.sleep(delay);\n\n    try {\n      const serverValue = await this.executeWithTimeout(mutation(...args), this.config.timeout);\n\n      update.status = 'confirmed';\n      this.currentValue = serverValue;\n      this.addToHistory(id, serverValue);\n      this.notifyListeners(update);\n      this.log(`Retry successful: ${id}`);\n    } catch (error) {\n      update.error = error instanceof Error ? error : new Error(String(error));\n      update.status = 'failed';\n      this.notifyListeners(update);\n\n      if (update.retryCount < this.config.maxRetries) {\n        await this.retryUpdate(id, mutation, ...args);\n      } else {\n        this.rollbackUpdate(id);\n      }\n    }\n  }\n\n  /**\n   * Rollback an update\n   */\n  rollbackUpdate(id: string): void {\n    const update = this.updates.get(id);\n    if (!update) {\n      return;\n    }\n\n    update.status = 'rolled-back';\n    this.currentValue = update.previousValue;\n    this.notifyListeners(update);\n    this.log(`Rolled back update: ${id}`);\n  }\n\n  /**\n   * Get pending updates\n   */\n  getPendingUpdates(): OptimisticUpdate<T>[] {\n    return Array.from(this.updates.values()).filter((u) => u.status === 'pending');\n  }\n\n  /**\n   * Get failed updates\n   */\n  getFailedUpdates(): OptimisticUpdate<T>[] {\n    return Array.from(this.updates.values()).filter((u) => u.status === 'failed');\n  }\n\n  /**\n   * Check if there are pending updates\n   */\n  hasPendingUpdates(): boolean {\n    return this.getPendingUpdates().length > 0;\n  }\n\n  /**\n   * Undo the last confirmed update\n   */\n  undo(): T | null {\n    if (this.history.length === 0) {\n      return null;\n    }\n\n    const lastEntry = this.history.pop();\n    if (!lastEntry) {\n      return null;\n    }\n\n    this.currentValue = lastEntry.value;\n    this.log(`Undid update: ${lastEntry.id}`);\n    return this.currentValue;\n  }\n\n  /**\n   * Subscribe to update changes\n   */\n  subscribe(listener: UpdateListener<T>): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  /**\n   * Clear all updates\n   */\n  clear(): void {\n    this.updates.clear();\n    this.history = [];\n  }\n\n  /**\n   * Get update statistics\n   */\n  getStats(): {\n    pending: number;\n    confirmed: number;\n    failed: number;\n    rolledBack: number;\n    historySize: number;\n  } {\n    const updates = Array.from(this.updates.values());\n    return {\n      pending: updates.filter((u) => u.status === 'pending').length,\n      confirmed: updates.filter((u) => u.status === 'confirmed').length,\n      failed: updates.filter((u) => u.status === 'failed').length,\n      rolledBack: updates.filter((u) => u.status === 'rolled-back').length,\n      historySize: this.history.length,\n    };\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private async executeWithTimeout<TResult>(\n    promise: Promise<TResult>,\n    timeout: number\n  ): Promise<TResult> {\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        reject(new Error('Operation timed out'));\n      }, timeout);\n\n      promise\n        .then((result) => {\n          clearTimeout(timer);\n          resolve(result);\n        })\n        .catch((error: unknown) => {\n          clearTimeout(timer);\n          reject(error instanceof Error ? error : new Error(String(error)));\n        });\n    });\n  }\n\n  private calculateRetryDelay(retryCount: number): number {\n    return this.config.retryDelay * Math.pow(this.config.retryBackoff, retryCount - 1);\n  }\n\n  private addToHistory(id: string, value: T): void {\n    if (!this.config.keepHistory) {\n      return;\n    }\n\n    this.history.push({ id, value });\n\n    // Trim history\n    while (this.history.length > this.config.maxHistorySize) {\n      this.history.shift();\n    }\n  }\n\n  private notifyListeners(update: OptimisticUpdate<T>): void {\n    this.listeners.forEach((listener) => listener(update));\n  }\n\n  private generateId(): string {\n    return `opt-${Date.now()}-${++this.idCounter}`;\n  }\n\n  private async sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[OptimisticUpdate] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Optimistic List Manager\n// ============================================================================\n\n/**\n * Specialized manager for list operations\n */\nexport class OptimisticListManager<T extends { id: string }> {\n  private manager: OptimisticUpdateManager<T[]>;\n\n  constructor(initialItems: T[], config: Partial<OptimisticConfig> = {}) {\n    this.manager = new OptimisticUpdateManager(initialItems, config);\n  }\n\n  /**\n   * Get current items\n   */\n  getItems(): T[] {\n    return this.manager.getValue();\n  }\n\n  /**\n   * Optimistically add an item\n   */\n  async addItem(item: T, mutation: MutationFn<T[]>): Promise<OptimisticResult<T[]>> {\n    return this.manager.applyUpdate((items) => [...items, item], mutation);\n  }\n\n  /**\n   * Optimistically remove an item\n   */\n  async removeItem(id: string, mutation: MutationFn<T[]>): Promise<OptimisticResult<T[]>> {\n    return this.manager.applyUpdate((items) => items.filter((item) => item.id !== id), mutation);\n  }\n\n  /**\n   * Optimistically update an item\n   */\n  async updateItem(\n    id: string,\n    updates: Partial<T>,\n    mutation: MutationFn<T[]>\n  ): Promise<OptimisticResult<T[]>> {\n    return this.manager.applyUpdate(\n      (items) => items.map((item) => (item.id === id ? { ...item, ...updates } : item)),\n      mutation\n    );\n  }\n\n  /**\n   * Optimistically reorder items\n   */\n  async reorderItems(\n    fromIndex: number,\n    toIndex: number,\n    mutation: MutationFn<T[]>\n  ): Promise<OptimisticResult<T[]>> {\n    return this.manager.applyUpdate((items) => {\n      const result = [...items];\n      const removed = result.splice(fromIndex, 1)[0];\n      if (removed !== undefined) {\n        result.splice(toIndex, 0, removed);\n      }\n      return result;\n    }, mutation);\n  }\n\n  /**\n   * Get pending items (items being added)\n   */\n  getPendingItems(): T[] {\n    const pending = this.manager.getPendingUpdates();\n    const pendingItems: T[] = [];\n\n    for (const update of pending) {\n      const newItems = update.optimisticValue.filter(\n        (item) => !update.previousValue.find((prev) => prev.id === item.id)\n      );\n      pendingItems.push(...newItems);\n    }\n\n    return pendingItems;\n  }\n\n  /**\n   * Check if an item has pending changes\n   */\n  hasItemPending(id: string): boolean {\n    const pending = this.manager.getPendingUpdates();\n    return pending.some((update) => {\n      const prevItem = update.previousValue.find((item) => item.id === id);\n      const optItem = update.optimisticValue.find((item) => item.id === id);\n      return JSON.stringify(prevItem) !== JSON.stringify(optItem);\n    });\n  }\n\n  /**\n   * Subscribe to changes\n   */\n  subscribe(listener: UpdateListener<T[]>): () => void {\n    return this.manager.subscribe(listener);\n  }\n\n  /**\n   * Check if there are pending updates\n   */\n  hasPendingUpdates(): boolean {\n    return this.manager.hasPendingUpdates();\n  }\n\n  /**\n   * Undo last change\n   */\n  undo(): T[] | null {\n    return this.manager.undo();\n  }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Create an optimistic update manager\n */\nexport function createOptimisticManager<T>(\n  initialValue: T,\n  config?: Partial<OptimisticConfig>\n): OptimisticUpdateManager<T> {\n  return new OptimisticUpdateManager(initialValue, config);\n}\n\n/**\n * Create an optimistic list manager\n */\nexport function createOptimisticListManager<T extends { id: string }>(\n  initialItems: T[],\n  config?: Partial<OptimisticConfig>\n): OptimisticListManager<T> {\n  return new OptimisticListManager(initialItems, config);\n}\n\n/**\n * Apply optimistic update to a value\n */\nexport async function applyOptimistic<T, TArgs extends unknown[]>(\n  currentValue: T,\n  updater: OptimisticUpdater<T>,\n  mutation: MutationFn<T, TArgs>,\n  ...args: TArgs\n): Promise<{ value: T; confirmed: boolean; error: Error | null }> {\n  // Apply optimistic update\n  updater(currentValue);\n\n  try {\n    const serverValue = await mutation(...args);\n    return { value: serverValue, confirmed: true, error: null };\n  } catch (error) {\n    return {\n      value: currentValue, // Rollback to original\n      confirmed: false,\n      error: error instanceof Error ? error : new Error(String(error)),\n    };\n  }\n}\n\n/**\n * Merge server and local values with conflict resolution\n */\nexport function mergeWithConflictResolution<T>(\n  localValue: T,\n  serverValue: T,\n  baseValue: T,\n  resolver: ConflictResolver<T>\n): T {\n  // Check if there's actually a conflict\n  const localChanged = JSON.stringify(localValue) !== JSON.stringify(baseValue);\n  const serverChanged = JSON.stringify(serverValue) !== JSON.stringify(baseValue);\n\n  if (!localChanged) {\n    // Local didn't change, use server value\n    return serverValue;\n  }\n\n  if (!serverChanged) {\n    // Server didn't change, use local value\n    return localValue;\n  }\n\n  // Both changed, use resolver\n  return resolver(localValue, serverValue, baseValue);\n}\n\n/**\n * Default conflict resolver (server wins)\n */\nexport function serverWinsResolver<T>(_localValue: T, serverValue: T, _baseValue: T): T {\n  return serverValue;\n}\n\n/**\n * Client wins conflict resolver\n */\nexport function clientWinsResolver<T>(localValue: T, _serverValue: T, _baseValue: T): T {\n  return localValue;\n}\n\n/**\n * Last write wins resolver (based on timestamp)\n */\nexport function lastWriteWinsResolver<T extends { updatedAt?: number | string }>(\n  localValue: T,\n  serverValue: T,\n  _baseValue: T\n): T {\n  const localTime = new Date(localValue.updatedAt || 0).getTime();\n  const serverTime = new Date(serverValue.updatedAt || 0).getTime();\n\n  return localTime > serverTime ? localValue : serverValue;\n}\n"],"names":["DEFAULT_CONFIG","OptimisticUpdateManager","initialValue","config","value","pendingUpdates","u","update","updater","mutation","args","id","previousValue","optimisticValue","serverValue","error","delay","lastEntry","listener","updates","promise","timeout","resolve","reject","timer","result","retryCount","ms","message","OptimisticListManager","initialItems","item","items","fromIndex","toIndex","removed","pending","pendingItems","newItems","prev","prevItem","optItem","createOptimisticManager","createOptimisticListManager","applyOptimistic","currentValue","mergeWithConflictResolution","localValue","baseValue","resolver","localChanged","serverChanged","serverWinsResolver","_localValue","_baseValue","clientWinsResolver","_serverValue","lastWriteWinsResolver","localTime","serverTime"],"mappings":"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"}