React Integration

Seamlessly integrate webMCP optimization into your React applications. Hooks, components, and patterns for modern React development.

React Integration Features

Powerful hooks and components designed for React applications

React Hook Integration

Seamless hooks for form optimization in React components

  • useWebMCPOptimizer hook
  • useFormAnalytics hook
  • Real-time optimization
  • Error handling & recovery

Component Library

Pre-built React components with webMCP optimization

  • OptimizedForm component
  • SmartInput components
  • Analytics dashboard
  • Performance indicators

State Management

Integration with Redux, Zustand, and Context API

  • Redux middleware
  • Zustand store integration
  • Context providers
  • State persistence

Performance Monitoring

Built-in performance tracking and optimization metrics

  • Real-time metrics
  • Performance profiling
  • Bundle size tracking
  • Render optimization

React Patterns

Choose the right pattern for your React form optimization needs

Controlled Components

Optimize forms with controlled React components

Pros:

  • Full state control
  • Easy validation
  • Real-time updates

Cons:

  • More re-renders
  • Complex state management

Uncontrolled Components

Lightweight optimization with refs and minimal state

Pros:

  • Better performance
  • Less code
  • Minimal re-renders

Cons:

  • Limited control
  • Harder testing

Hybrid Approach

Best of both worlds with selective optimization

Pros:

  • Optimal performance
  • Flexible control
  • Balanced complexity

Cons:

  • More setup
  • Pattern complexity

Implementation Examples

Complete code examples for React integration

Basic React Hook Usage

Simple integration using the useWebMCPOptimizer hook

JavaScript
import React, { useState } from 'react';
import { useWebMCPOptimizer } from '@webmcp/react';

function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: ''
  });

  // Initialize webMCP optimizer
  const { 
    optimizeForm, 
    isOptimizing, 
    optimizationResult, 
    error 
  } = useWebMCPOptimizer({
    model: 'gpt-4o',
    aggressiveness: 'moderate',
    preserveSemantics: true,
    
    // Optimization settings
    settings: {
      enableRealTime: true,
      trackAnalytics: true,
      cacheResults: true
    },
    
    // Event handlers
    onOptimizationComplete: (result) => {
      console.log('Optimization complete:', result);
    },
    onError: (error) => {
      console.error('Optimization failed:', error);
    }
  });

  const handleSubmit = async (e) => {
    e.preventDefault();
    
    try {
      // Get the form element
      const formElement = e.target;
      
      // Optimize the form before submission
      const optimizedForm = await optimizeForm(formElement, {
        contextData: formData,
        userPreferences: {
          language: 'en',
          accessibility: true
        }
      });
      
      // Submit optimized form data
      await submitForm(optimizedForm.data);
      
    } catch (error) {
      console.error('Form submission failed:', error);
    }
  };

  const handleInputChange = (e) => {
    const { name, value } = e.target;
    setFormData(prev => ({
      ...prev,
      [name]: value
    }));
  };

  return (
    <div className="contact-form">
      <form onSubmit={handleSubmit} data-webmcp-optimize="true">
        {/* Form fields */}
        <div className="form-group">
          <label htmlFor="name">Name</label>
          <input
            type="text"
            id="name"
            name="name"
            value={formData.name}
            onChange={handleInputChange}
            data-webmcp-field="name"
            required
          />
        </div>

        <div className="form-group">
          <label htmlFor="email">Email</label>
          <input
            type="email"
            id="email"
            name="email"
            value={formData.email}
            onChange={handleInputChange}
            data-webmcp-field="email"
            required
          />
        </div>

        <div className="form-group">
          <label htmlFor="message">Message</label>
          <textarea
            id="message"
            name="message"
            value={formData.message}
            onChange={handleInputChange}
            data-webmcp-field="message"
            rows={4}
            required
          />
        </div>

        {/* Optimization status */}
        {isOptimizing && (
          <div className="optimization-status">
            <div className="spinner" />
            Optimizing form...
          </div>
        )}

        {optimizationResult && (
          <div className="optimization-result">
            <p>Token reduction: {optimizationResult.tokenReduction}%</p>
            <p>Cost savings: ${optimizationResult.costSavings}</p>
          </div>
        )}

        {error && (
          <div className="error-message">
            Optimization failed: {error.message}
          </div>
        )}

        <button 
          type="submit" 
          disabled={isOptimizing}
          className="submit-button"
        >
          {isOptimizing ? 'Optimizing...' : 'Send Message'}
        </button>
      </form>
    </div>
  );
}

export default ContactForm;

Advanced Component with Analytics

Full-featured form component with analytics and performance tracking

JavaScript
import React, { useState, useEffect, useCallback, useMemo } from 'react';
import { 
  useWebMCPOptimizer, 
  useFormAnalytics, 
  usePerformanceMonitor 
} from '@webmcp/react';

function AdvancedOptimizedForm({ 
  initialData = {},
  onSubmit,
  optimizationConfig = {},
  analyticsConfig = {}
}) {
  const [formData, setFormData] = useState(initialData);
  const [validationErrors, setValidationErrors] = useState({});
  const [submitStatus, setSubmitStatus] = useState('idle');

  // WebMCP Optimizer Hook
  const {
    optimizeForm,
    optimizeField,
    isOptimizing,
    optimizationResult,
    resetOptimization,
    error: optimizationError
  } = useWebMCPOptimizer({
    model: optimizationConfig.model || 'gpt-4o',
    aggressiveness: optimizationConfig.aggressiveness || 'moderate',
    
    // Advanced settings
    settings: {
      enableRealTime: true,
      enablePreemptiveOptimization: true,
      batchOptimization: true,
      cacheResults: true,
      fallbackModel: 'claude-3.5-sonnet',
      
      // Performance settings
      performance: {
        debounceMs: 300,
        throttleMs: 1000,
        maxConcurrentOptimizations: 3
      }
    },

    // Event callbacks
    onOptimizationStart: (fieldName) => {
      console.log(`Starting optimization for: ${fieldName}`);
    },
    
    onOptimizationComplete: (result) => {
      console.log('Optimization complete:', result);
      trackAnalytics('optimization_completed', result);
    },
    
    onOptimizationError: (error, context) => {
      console.error('Optimization error:', error, context);
      trackAnalytics('optimization_failed', { error: error.message, context });
    }
  });

  // Analytics Hook
  const {
    trackEvent,
    trackFieldInteraction,
    trackConversion,
    trackPerformanceMetric,
    analytics: analyticsData
  } = useFormAnalytics({
    formId: 'advanced-contact-form',
    trackUserBehavior: true,
    trackPerformance: true,
    trackConversions: true,
    
    // Custom events
    customEvents: [
      'field_focus',
      'field_blur',
      'validation_error',
      'optimization_triggered'
    ],
    
    // Analytics configuration
    config: {
      sessionTracking: true,
      heatmapTracking: true,
      scrollTracking: true,
      errorTracking: true
    }
  });

  // Performance Monitor Hook
  const {
    startProfiling,
    stopProfiling,
    getMetrics,
    performanceData
  } = usePerformanceMonitor({
    enableRealTimeTracking: true,
    trackRenderPerformance: true,
    trackMemoryUsage: true
  });

  // Memoized validation rules
  const validationRules = useMemo(() => ({
    name: {
      required: true,
      minLength: 2,
      pattern: /^[a-zA-Z\s]+$/,
      message: 'Name must contain only letters and spaces'
    },
    email: {
      required: true,
      pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
      message: 'Please enter a valid email address'
    },
    message: {
      required: true,
      minLength: 10,
      maxLength: 1000,
      message: 'Message must be between 10 and 1000 characters'
    }
  }), []);

  // Debounced field optimization
  const debouncedOptimizeField = useCallback(
    debounce(async (fieldName, value, element) => {
      if (!value || value.length < 3) return;
      
      try {
        startProfiling(`field_optimization_${fieldName}`);
        
        const result = await optimizeField(element, {
          context: formData,
          fieldValue: value,
          validationRules: validationRules[fieldName]
        });
        
        trackAnalytics('field_optimized', {
          fieldName,
          tokenReduction: result.tokenReduction,
          processingTime: result.processingTime
        });
        
      } catch (error) {
        console.error(`Field optimization error for ${fieldName}:`, error);
      } finally {
        stopProfiling(`field_optimization_${fieldName}`);
      }
    }, 500),
    [optimizeField, formData, validationRules, startProfiling, stopProfiling]
  );

  // Form validation
  const validateField = useCallback((name, value) => {
    const rules = validationRules[name];
    if (!rules) return null;

    if (rules.required && !value) {
      return 'This field is required';
    }

    if (rules.minLength && value.length < rules.minLength) {
      return `Minimum length is ${rules.minLength} characters`;
    }

    if (rules.maxLength && value.length > rules.maxLength) {
      return `Maximum length is ${rules.maxLength} characters`;
    }

    if (rules.pattern && !rules.pattern.test(value)) {
      return rules.message || 'Invalid format';
    }

    return null;
  }, [validationRules]);

  // Handle input change with optimization
  const handleInputChange = useCallback(async (e) => {
    const { name, value } = e.target;
    const element = e.target;

    // Update form data
    setFormData(prev => ({
      ...prev,
      [name]: value
    }));

    // Track field interaction
    trackFieldInteraction(name, value, {
      timestamp: Date.now(),
      charactersTyped: value.length,
      timeSpent: Date.now() - (element.dataset.focusTime || Date.now())
    });

    // Validate field
    const error = validateField(name, value);
    setValidationErrors(prev => ({
      ...prev,
      [name]: error
    }));

    // Track validation errors
    if (error) {
      trackEvent('validation_error', { fieldName: name, error });
    }

    // Trigger field optimization
    if (!error && value.length > 2) {
      debouncedOptimizeField(name, value, element);
    }
  }, [validateField, trackFieldInteraction, trackEvent, debouncedOptimizeField]);

  // Handle field focus
  const handleFieldFocus = useCallback((e) => {
    const { name } = e.target;
    e.target.dataset.focusTime = Date.now();
    
    trackEvent('field_focus', { 
      fieldName: name,
      timestamp: Date.now()
    });
  }, [trackEvent]);

  // Handle field blur
  const handleFieldBlur = useCallback((e) => {
    const { name } = e.target;
    const focusTime = parseInt(e.target.dataset.focusTime || '0');
    const timeSpent = Date.now() - focusTime;
    
    trackEvent('field_blur', {
      fieldName: name,
      timeSpent,
      timestamp: Date.now()
    });
  }, [trackEvent]);

  // Handle form submission
  const handleSubmit = useCallback(async (e) => {
    e.preventDefault();
    setSubmitStatus('submitting');

    try {
      startProfiling('form_submission');
      
      // Validate all fields
      const errors = {};
      Object.keys(formData).forEach(field => {
        const error = validateField(field, formData[field]);
        if (error) errors[field] = error;
      });

      if (Object.keys(errors).length > 0) {
        setValidationErrors(errors);
        setSubmitStatus('error');
        trackEvent('form_validation_failed', { errors });
        return;
      }

      // Optimize entire form before submission
      const formElement = e.target;
      const optimizedForm = await optimizeForm(formElement, {
        contextData: formData,
        submissionContext: true,
        preserveValidation: true
      });

      // Submit form with optimized data
      const result = await onSubmit(optimizedForm.data, optimizedForm.metadata);

      // Track successful conversion
      trackConversion('form_submitted', {
        formData: optimizedForm.data,
        optimizationResult: optimizedForm.optimizationResult,
        submissionTime: Date.now()
      });

      setSubmitStatus('success');
      
      // Reset form if needed
      if (result.resetForm) {
        setFormData(initialData);
        setValidationErrors({});
        resetOptimization();
      }

    } catch (error) {
      console.error('Form submission error:', error);
      setSubmitStatus('error');
      trackEvent('form_submission_failed', { 
        error: error.message,
        formData 
      });
    } finally {
      stopProfiling('form_submission');
    }
  }, [
    formData, 
    validateField, 
    optimizeForm, 
    onSubmit, 
    trackConversion, 
    trackEvent,
    initialData,
    resetOptimization,
    startProfiling,
    stopProfiling
  ]);

  // Performance monitoring effect
  useEffect(() => {
    if (performanceData.renderTime > 100) {
      trackPerformanceMetric('slow_render', {
        renderTime: performanceData.renderTime,
        componentName: 'AdvancedOptimizedForm'
      });
    }
  }, [performanceData, trackPerformanceMetric]);

  return (
    <div className="advanced-optimized-form">
      {/* Performance indicators */}
      {performanceData.renderTime > 50 && (
        <div className="performance-warning">
          Slow render detected: {performanceData.renderTime}ms
        </div>
      )}

      {/* Optimization status */}
      {isOptimizing && (
        <div className="optimization-status">
          <div className="spinner" />
          Optimizing form...
        </div>
      )}

      {/* Analytics summary */}
      {analyticsData.interactionCount > 0 && (
        <div className="analytics-summary">
          <p>Interactions: {analyticsData.interactionCount}</p>
          <p>Time spent: {Math.round(analyticsData.timeSpent / 1000)}s</p>
        </div>
      )}

      <form onSubmit={handleSubmit} data-webmcp-optimize="true">
        {/* Form fields */}
        <div className="form-group">
          <label htmlFor="name">Name *</label>
          <input
            type="text"
            id="name"
            name="name"
            value={formData.name || ''}
            onChange={handleInputChange}
            onFocus={handleFieldFocus}
            onBlur={handleFieldBlur}
            data-webmcp-field="name"
            className={validationErrors.name ? 'error' : ''}
            required
          />
          {validationErrors.name && (
            <span className="error-message">{validationErrors.name}</span>
          )}
        </div>

        <div className="form-group">
          <label htmlFor="email">Email *</label>
          <input
            type="email"
            id="email"
            name="email"
            value={formData.email || ''}
            onChange={handleInputChange}
            onFocus={handleFieldFocus}
            onBlur={handleFieldBlur}
            data-webmcp-field="email"
            className={validationErrors.email ? 'error' : ''}
            required
          />
          {validationErrors.email && (
            <span className="error-message">{validationErrors.email}</span>
          )}
        </div>

        <div className="form-group">
          <label htmlFor="message">Message *</label>
          <textarea
            id="message"
            name="message"
            value={formData.message || ''}
            onChange={handleInputChange}
            onFocus={handleFieldFocus}
            onBlur={handleFieldBlur}
            data-webmcp-field="message"
            className={validationErrors.message ? 'error' : ''}
            rows={4}
            required
          />
          {validationErrors.message && (
            <span className="error-message">{validationErrors.message}</span>
          )}
        </div>

        {/* Optimization results */}
        {optimizationResult && (
          <div className="optimization-result">
            <h4>Optimization Results</h4>
            <p>Token reduction: {optimizationResult.tokenReduction}%</p>
            <p>Cost savings: ${optimizationResult.costSavings}</p>
            <p>Processing time: {optimizationResult.processingTime}ms</p>
          </div>
        )}

        {/* Error display */}
        {optimizationError && (
          <div className="error-message">
            Optimization error: {optimizationError.message}
          </div>
        )}

        {/* Submit button */}
        <button 
          type="submit" 
          disabled={isOptimizing || submitStatus === 'submitting'}
          className={`submit-button ${submitStatus}`}
        >
          {submitStatus === 'submitting' ? 'Submitting...' : 
           isOptimizing ? 'Optimizing...' : 
           'Send Message'}
        </button>

        {/* Status messages */}
        {submitStatus === 'success' && (
          <div className="success-message">
            Message sent successfully!
          </div>
        )}

        {submitStatus === 'error' && (
          <div className="error-message">
            Failed to send message. Please try again.
          </div>
        )}
      </form>
    </div>
  );
}

// Utility function for debouncing
function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

export default AdvancedOptimizedForm;

Redux Integration

Integrate webMCP optimization with Redux state management

JavaScript
// redux/webmcpSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { WebMCPProcessor } from '@webmcp/core';

// Async thunk for form optimization
export const optimizeForm = createAsyncThunk(
  'webmcp/optimizeForm',
  async ({ formData, config }, { rejectWithValue, getState }) => {
    try {
      const state = getState();
      const processor = new WebMCPProcessor({
        ...config,
        apiKey: state.auth.apiKey
      });

      const result = await processor.optimize(formData, {
        preserveSemantics: true,
        trackAnalytics: true,
        contextData: state.forms.currentContext
      });

      return result;
    } catch (error) {
      return rejectWithValue({
        message: error.message,
        code: error.code,
        timestamp: Date.now()
      });
    }
  }
);

// Async thunk for batch optimization
export const optimizeBatch = createAsyncThunk(
  'webmcp/optimizeBatch',
  async ({ forms, config }, { rejectWithValue, dispatch }) => {
    try {
      const results = [];
      
      for (const form of forms) {
        dispatch(setCurrentOptimization({ formId: form.id, status: 'processing' }));
        
        const result = await dispatch(optimizeForm({ formData: form.data, config }));
        results.push({ formId: form.id, result: result.payload });
        
        dispatch(setCurrentOptimization({ formId: form.id, status: 'completed' }));
      }
      
      return results;
    } catch (error) {
      return rejectWithValue(error.message);
    }
  }
);

const webmcpSlice = createSlice({
  name: 'webmcp',
  initialState: {
    // Optimization state
    currentOptimization: null,
    optimizationQueue: [],
    optimizationHistory: [],
    
    // Configuration
    config: {
      model: 'gpt-4o',
      aggressiveness: 'moderate',
      cacheResults: true,
      trackAnalytics: true
    },
    
    // Analytics data
    analytics: {
      totalOptimizations: 0,
      totalTokensSaved: 0,
      totalCostSavings: 0,
      averageReduction: 0,
      optimizationsByModel: {}
    },
    
    // Performance metrics
    performance: {
      averageProcessingTime: 0,
      successRate: 0,
      errorRate: 0,
      throughput: 0
    },
    
    // UI state
    isOptimizing: false,
    error: null,
    status: 'idle' // 'idle' | 'loading' | 'succeeded' | 'failed'
  },
  
  reducers: {
    // Configuration actions
    updateConfig: (state, action) => {
      state.config = { ...state.config, ...action.payload };
    },
    
    resetConfig: (state) => {
      state.config = {
        model: 'gpt-4o',
        aggressiveness: 'moderate',
        cacheResults: true,
        trackAnalytics: true
      };
    },
    
    // Queue management
    addToQueue: (state, action) => {
      const { formId, formData, priority = 'normal', timestamp = Date.now() } = action.payload;
      
      state.optimizationQueue.push({
        id: `${formId}_${timestamp}`,
        formId,
        formData,
        priority,
        timestamp,
        status: 'queued'
      });
      
      // Sort by priority and timestamp
      state.optimizationQueue.sort((a, b) => {
        const priorityOrder = { high: 3, normal: 2, low: 1 };
        if (priorityOrder[a.priority] !== priorityOrder[b.priority]) {
          return priorityOrder[b.priority] - priorityOrder[a.priority];
        }
        return a.timestamp - b.timestamp;
      });
    },
    
    removeFromQueue: (state, action) => {
      const { id } = action.payload;
      state.optimizationQueue = state.optimizationQueue.filter(item => item.id !== id);
    },
    
    clearQueue: (state) => {
      state.optimizationQueue = [];
    },
    
    // Current optimization tracking
    setCurrentOptimization: (state, action) => {
      state.currentOptimization = action.payload;
    },
    
    clearCurrentOptimization: (state) => {
      state.currentOptimization = null;
    },
    
    // Analytics updates
    updateAnalytics: (state, action) => {
      const { result } = action.payload;
      
      state.analytics.totalOptimizations += 1;
      state.analytics.totalTokensSaved += result.tokensSaved || 0;
      state.analytics.totalCostSavings += result.costSavings || 0;
      
      // Update model-specific analytics
      const model = result.model || 'unknown';
      if (!state.analytics.optimizationsByModel[model]) {
        state.analytics.optimizationsByModel[model] = {
          count: 0,
          totalReduction: 0,
          totalCostSavings: 0
        };
      }
      
      const modelStats = state.analytics.optimizationsByModel[model];
      modelStats.count += 1;
      modelStats.totalReduction += result.tokenReduction || 0;
      modelStats.totalCostSavings += result.costSavings || 0;
      
      // Calculate averages
      state.analytics.averageReduction = 
        Object.values(state.analytics.optimizationsByModel)
          .reduce((sum, model) => sum + model.totalReduction, 0) / 
        Object.values(state.analytics.optimizationsByModel)
          .reduce((sum, model) => sum + model.count, 0);
    },
    
    // Performance tracking
    updatePerformance: (state, action) => {
      const { processingTime, success } = action.payload;
      
      // Update processing time average
      const totalProcessingTime = state.performance.averageProcessingTime * state.analytics.totalOptimizations;
      state.performance.averageProcessingTime = 
        (totalProcessingTime + processingTime) / (state.analytics.totalOptimizations + 1);
      
      // Update success/error rates
      const totalAttempts = state.analytics.totalOptimizations;
      if (success) {
        state.performance.successRate = 
          (state.performance.successRate * totalAttempts + 1) / (totalAttempts + 1);
      } else {
        state.performance.errorRate = 
          (state.performance.errorRate * totalAttempts + 1) / (totalAttempts + 1);
      }
    },
    
    // Error handling
    clearError: (state) => {
      state.error = null;
    }
  },
  
  extraReducers: (builder) => {
    builder
      // Single form optimization
      .addCase(optimizeForm.pending, (state, action) => {
        state.isOptimizing = true;
        state.status = 'loading';
        state.error = null;
        
        const { formData } = action.meta.arg;
        state.currentOptimization = {
          formId: formData.id || 'unknown',
          status: 'processing',
          startTime: Date.now()
        };
      })
      .addCase(optimizeForm.fulfilled, (state, action) => {
        state.isOptimizing = false;
        state.status = 'succeeded';
        
        const result = action.payload;
        
        // Update optimization history
        state.optimizationHistory.unshift({
          id: `opt_${Date.now()}`,
          formId: state.currentOptimization?.formId,
          result,
          timestamp: Date.now(),
          processingTime: Date.now() - (state.currentOptimization?.startTime || Date.now())
        });
        
        // Keep only last 100 optimizations in history
        if (state.optimizationHistory.length > 100) {
          state.optimizationHistory = state.optimizationHistory.slice(0, 100);
        }
        
        // Update analytics
        webmcpSlice.caseReducers.updateAnalytics(state, { payload: { result } });
        webmcpSlice.caseReducers.updatePerformance(state, { 
          payload: { 
            processingTime: Date.now() - (state.currentOptimization?.startTime || Date.now()),
            success: true 
          }
        });
        
        state.currentOptimization = null;
      })
      .addCase(optimizeForm.rejected, (state, action) => {
        state.isOptimizing = false;
        state.status = 'failed';
        state.error = action.payload;
        
        // Update performance metrics
        webmcpSlice.caseReducers.updatePerformance(state, { 
          payload: { 
            processingTime: Date.now() - (state.currentOptimization?.startTime || Date.now()),
            success: false 
          }
        });
        
        state.currentOptimization = null;
      })
      
      // Batch optimization
      .addCase(optimizeBatch.pending, (state) => {
        state.isOptimizing = true;
        state.status = 'loading';
        state.error = null;
      })
      .addCase(optimizeBatch.fulfilled, (state, action) => {
        state.isOptimizing = false;
        state.status = 'succeeded';
        
        // Process batch results
        action.payload.forEach(({ formId, result }) => {
          state.optimizationHistory.unshift({
            id: `batch_${formId}_${Date.now()}`,
            formId,
            result,
            timestamp: Date.now(),
            batch: true
          });
          
          webmcpSlice.caseReducers.updateAnalytics(state, { payload: { result } });
        });
      })
      .addCase(optimizeBatch.rejected, (state, action) => {
        state.isOptimizing = false;
        state.status = 'failed';
        state.error = action.payload;
      });
  }
});

export const {
  updateConfig,
  resetConfig,
  addToQueue,
  removeFromQueue,
  clearQueue,
  setCurrentOptimization,
  clearCurrentOptimization,
  updateAnalytics,
  updatePerformance,
  clearError
} = webmcpSlice.actions;

// Selectors
export const selectWebMCPState = (state) => state.webmcp;
export const selectIsOptimizing = (state) => state.webmcp.isOptimizing;
export const selectOptimizationQueue = (state) => state.webmcp.optimizationQueue;
export const selectOptimizationHistory = (state) => state.webmcp.optimizationHistory;
export const selectAnalytics = (state) => state.webmcp.analytics;
export const selectPerformance = (state) => state.webmcp.performance;
export const selectConfig = (state) => state.webmcp.config;

export default webmcpSlice.reducer;

// React Hook for Redux Integration
import { useSelector, useDispatch } from 'react-redux';
import { useCallback } from 'react';

export function useWebMCPRedux() {
  const dispatch = useDispatch();
  const webmcpState = useSelector(selectWebMCPState);
  const isOptimizing = useSelector(selectIsOptimizing);
  const analytics = useSelector(selectAnalytics);
  const performance = useSelector(selectPerformance);
  const config = useSelector(selectConfig);

  const optimizeFormWithRedux = useCallback((formData, optimizationConfig = {}) => {
    return dispatch(optimizeForm({ 
      formData, 
      config: { ...config, ...optimizationConfig } 
    }));
  }, [dispatch, config]);

  const optimizeBatchWithRedux = useCallback((forms, optimizationConfig = {}) => {
    return dispatch(optimizeBatch({ 
      forms, 
      config: { ...config, ...optimizationConfig } 
    }));
  }, [dispatch, config]);

  const updateConfiguration = useCallback((newConfig) => {
    dispatch(updateConfig(newConfig));
  }, [dispatch]);

  const addToOptimizationQueue = useCallback((formId, formData, priority) => {
    dispatch(addToQueue({ formId, formData, priority }));
  }, [dispatch]);

  return {
    // State
    ...webmcpState,
    isOptimizing,
    analytics,
    performance,
    config,
    
    // Actions
    optimizeForm: optimizeFormWithRedux,
    optimizeBatch: optimizeBatchWithRedux,
    updateConfig: updateConfiguration,
    addToQueue: addToOptimizationQueue,
    removeFromQueue: (id) => dispatch(removeFromQueue({ id })),
    clearQueue: () => dispatch(clearQueue()),
    clearError: () => dispatch(clearError())
  };
}

Component Library

Pre-built React components for common optimization scenarios

JavaScript
// components/OptimizedForm.jsx
import React, { forwardRef, useImperativeHandle } from 'react';
import { useWebMCPOptimizer, useFormAnalytics } from '@webmcp/react';

const OptimizedForm = forwardRef(({
  children,
  onSubmit,
  onOptimizationComplete,
  optimizationConfig = {},
  analyticsConfig = {},
  className = '',
  ...props
}, ref) => {
  const {
    optimizeForm,
    isOptimizing,
    optimizationResult,
    error: optimizationError,
    resetOptimization
  } = useWebMCPOptimizer({
    ...optimizationConfig,
    onOptimizationComplete: (result) => {
      if (onOptimizationComplete) {
        onOptimizationComplete(result);
      }
    }
  });

  const {
    trackEvent,
    trackConversion,
    analytics
  } = useFormAnalytics(analyticsConfig);

  useImperativeHandle(ref, () => ({
    optimize: async (formElement) => {
      return await optimizeForm(formElement || ref.current);
    },
    reset: () => {
      resetOptimization();
    },
    getAnalytics: () => analytics,
    getOptimizationResult: () => optimizationResult
  }));

  const handleSubmit = async (e) => {
    e.preventDefault();
    
    try {
      trackEvent('form_submission_started');
      
      const optimizedForm = await optimizeForm(e.target);
      
      if (onSubmit) {
        const result = await onSubmit(optimizedForm.data, optimizedForm.metadata);
        
        trackConversion('form_submitted', {
          optimizationResult: optimizedForm.optimizationResult,
          submissionResult: result
        });
      }
    } catch (error) {
      trackEvent('form_submission_failed', { error: error.message });
      throw error;
    }
  };

  return (
    <form
      ref={ref}
      onSubmit={handleSubmit}
      className={`webmcp-optimized-form ${className}`}
      data-webmcp-optimize="true"
      {...props}
    >
      {isOptimizing && (
        <div className="webmcp-optimization-overlay">
          <div className="webmcp-spinner" />
          <span>Optimizing form...</span>
        </div>
      )}
      
      {optimizationError && (
        <div className="webmcp-error">
          Optimization failed: {optimizationError.message}
        </div>
      )}
      
      {optimizationResult && (
        <div className="webmcp-result">
          <span>Token reduction: {optimizationResult.tokenReduction}%</span>
        </div>
      )}
      
      {children}
    </form>
  );
});

// components/SmartInput.jsx
import React, { useState, useEffect, useCallback } from 'react';
import { useWebMCPOptimizer } from '@webmcp/react';

export function SmartInput({
  name,
  value,
  onChange,
  onOptimization,
  optimizeOnBlur = true,
  optimizeOnChange = false,
  debounceMs = 500,
  className = '',
  ...props
}) {
  const [localValue, setLocalValue] = useState(value || '');
  const [isOptimized, setIsOptimized] = useState(false);
  
  const {
    optimizeField,
    isOptimizing,
    optimizationResult
  } = useWebMCPOptimizer({
    onOptimizationComplete: (result) => {
      setIsOptimized(true);
      if (onOptimization) {
        onOptimization(result);
      }
    }
  });

  const debouncedOptimize = useCallback(
    debounce(async (element, fieldValue) => {
      if (fieldValue && fieldValue.length > 2) {
        await optimizeField(element, { fieldValue });
      }
    }, debounceMs),
    [optimizeField, debounceMs]
  );

  const handleChange = (e) => {
    const newValue = e.target.value;
    setLocalValue(newValue);
    setIsOptimized(false);
    
    if (onChange) {
      onChange(e);
    }
    
    if (optimizeOnChange) {
      debouncedOptimize(e.target, newValue);
    }
  };

  const handleBlur = (e) => {
    if (optimizeOnBlur && localValue) {
      optimizeField(e.target, { fieldValue: localValue });
    }
    
    if (props.onBlur) {
      props.onBlur(e);
    }
  };

  useEffect(() => {
    setLocalValue(value || '');
  }, [value]);

  return (
    <div className="webmcp-smart-input-wrapper">
      <input
        {...props}
        name={name}
        value={localValue}
        onChange={handleChange}
        onBlur={handleBlur}
        className={`webmcp-smart-input ${className} ${isOptimized ? 'optimized' : ''} ${isOptimizing ? 'optimizing' : ''}`}
        data-webmcp-field={name}
      />
      
      {isOptimizing && (
        <div className="webmcp-input-spinner" />
      )}
      
      {isOptimized && optimizationResult && (
        <div className="webmcp-input-indicator">
          ✓ {optimizationResult.tokenReduction}% reduction
        </div>
      )}
    </div>
  );
}

// components/AnalyticsDashboard.jsx
import React from 'react';
import { useFormAnalytics } from '@webmcp/react';

export function AnalyticsDashboard({ 
  formId, 
  className = '',
  showRealTime = true,
  showHistorical = true 
}) {
  const { analytics, performanceMetrics } = useFormAnalytics({ 
    formId,
    enableRealTimeTracking: showRealTime 
  });

  if (!analytics) {
    return <div className="webmcp-analytics-loading">Loading analytics...</div>;
  }

  return (
    <div className={`webmcp-analytics-dashboard ${className}`}>
      {showRealTime && (
        <div className="webmcp-analytics-section">
          <h3>Real-time Metrics</h3>
          <div className="webmcp-metrics-grid">
            <div className="webmcp-metric">
              <span className="webmcp-metric-label">Active Users</span>
              <span className="webmcp-metric-value">{analytics.activeUsers}</span>
            </div>
            <div className="webmcp-metric">
              <span className="webmcp-metric-label">Form Interactions</span>
              <span className="webmcp-metric-value">{analytics.interactionCount}</span>
            </div>
            <div className="webmcp-metric">
              <span className="webmcp-metric-label">Avg Session Time</span>
              <span className="webmcp-metric-value">
                {Math.round(analytics.averageSessionTime / 1000)}s
              </span>
            </div>
            <div className="webmcp-metric">
              <span className="webmcp-metric-label">Conversion Rate</span>
              <span className="webmcp-metric-value">
                {(analytics.conversionRate * 100).toFixed(1)}%
              </span>
            </div>
          </div>
        </div>
      )}
      
      {showHistorical && (
        <div className="webmcp-analytics-section">
          <h3>Optimization Performance</h3>
          <div className="webmcp-performance-grid">
            <div className="webmcp-performance-item">
              <span className="webmcp-performance-label">Total Optimizations</span>
              <span className="webmcp-performance-value">
                {analytics.totalOptimizations}
              </span>
            </div>
            <div className="webmcp-performance-item">
              <span className="webmcp-performance-label">Avg Token Reduction</span>
              <span className="webmcp-performance-value">
                {analytics.averageTokenReduction}%
              </span>
            </div>
            <div className="webmcp-performance-item">
              <span className="webmcp-performance-label">Total Cost Savings</span>
              <span className="webmcp-performance-value">
                ${analytics.totalCostSavings.toFixed(2)}
              </span>
            </div>
            <div className="webmcp-performance-item">
              <span className="webmcp-performance-label">Success Rate</span>
              <span className="webmcp-performance-value">
                {(performanceMetrics.successRate * 100).toFixed(1)}%
              </span>
            </div>
          </div>
        </div>
      )}
    </div>
  );
}

// components/OptimizationStatus.jsx
export function OptimizationStatus({ 
  optimizationResult, 
  isOptimizing, 
  error,
  showDetails = false,
  className = '' 
}) {
  if (isOptimizing) {
    return (
      <div className={`webmcp-status optimizing ${className}`}>
        <div className="webmcp-spinner" />
        <span>Optimizing...</span>
      </div>
    );
  }
  
  if (error) {
    return (
      <div className={`webmcp-status error ${className}`}>
        <span>❌ Optimization failed</span>
        {showDetails && (
          <div className="webmcp-error-details">
            {error.message}
          </div>
        )}
      </div>
    );
  }
  
  if (optimizationResult) {
    return (
      <div className={`webmcp-status success ${className}`}>
        <span>✅ Optimized</span>
        {showDetails && (
          <div className="webmcp-result-details">
            <div>Token reduction: {optimizationResult.tokenReduction}%</div>
            <div>Cost savings: ${optimizationResult.costSavings}</div>
            <div>Processing time: {optimizationResult.processingTime}ms</div>
          </div>
        )}
      </div>
    );
  }
  
  return null;
}

// Utility function
function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

export { OptimizedForm };

Best Practices

Follow these guidelines for optimal React integration

Performance

  • Use React.memo for components that don't need frequent re-renders
  • Implement proper dependency arrays in useEffect and useCallback
  • Debounce optimization calls to prevent excessive API requests
  • Use lazy loading for optimization results and analytics data

State Management

  • Keep optimization state separate from form state
  • Use context for global optimization settings
  • Implement proper error boundaries for optimization failures
  • Cache optimization results to improve performance

User Experience

  • Provide clear feedback during optimization processes
  • Show progress indicators for long-running optimizations
  • Implement graceful fallbacks when optimization fails
  • Allow users to bypass optimization if needed

Development

  • Use TypeScript for better type safety
  • Implement comprehensive error handling
  • Write unit tests for optimization hooks
  • Document component props and hook parameters

Ready to Optimize Your React Forms?

Start building optimized React applications with webMCP today