This guide explains how to implement and use the hybrid data system that seamlessly combines mock and real-time user data for your ReBin application.
The hybrid data system provides:
- Seamless Integration: Combines mock and real data without breaking existing functionality
- Best Practices: Follows software engineering, design, security, and UX best practices
- Performance Optimized: Includes caching, error handling, and performance monitoring
- User Experience: Maintains rich experience with mock data while adding real user interactions
- Competitive Features: Ensures accurate leaderboards and fair competition
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Frontend Components β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Leaderboard β Achievements β Challenges β Analytics β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Hybrid Data Service β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Data Merging β β’ Error Handling β β’ Performance β
β β’ Caching β β’ Fallback β β’ Monitoring β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data Sources β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Mock Data Service β Real-Time API β Local Storage β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
import { Leaderboard } from './components/Leaderboard';
// Use traditional mock data (existing behavior)
<Leaderboard
timePeriod="7d"
limit={10}
currentUserId="user-123"
/>
// Enable hybrid data mode
<Leaderboard
timePeriod="7d"
limit={10}
currentUserId="user-123"
useHybridData={true}
showDataQuality={true}
/>import { HybridLeaderboard } from "./components/HybridLeaderboard";
import { HybridDataService } from "./lib/services/HybridDataService";
// Create custom hybrid service
const hybridService = new HybridDataService(
realTimeService, // Optional real-time service
logger, // Optional logger
{
enableRealTimeData: true,
enableMockData: true,
mockDataWeight: 0.6, // 60% mock data
realDataWeight: 0.4, // 40% real data
fallbackToMock: true,
cacheTimeout: 30000, // 30 seconds
}
);
<HybridLeaderboard
timePeriod="7d"
limit={20}
currentUserId="user-123"
enableRealTimeUpdates={true}
showDataQuality={true}
/>;- Request: Component requests leaderboard data
- Hybrid Service: Fetches from both mock and real sources
- Data Adapters: Normalize data formats
- Merging: Combine and deduplicate entries
- Ranking: Sort by points with tie-breaking
- Caching: Store result for performance
- Response: Return unified leaderboard
- Error Occurs: Network, API, or data error
- Assessment: Determine severity and impact
- Fallback: Try cached data, then mock data
- User Notification: Show appropriate message
- Recovery: Automatic retry or manual action
interface DataSourceConfig {
enableRealTimeData: boolean; // Enable real-time data fetching
enableMockData: boolean; // Enable mock data fallback
mockDataWeight: number; // Weight for mock data (0-1)
realDataWeight: number; // Weight for real data (0-1)
fallbackToMock: boolean; // Fallback to mock on error
cacheTimeout: number; // Cache TTL in milliseconds
}interface OptimizationConfig {
enableCaching: boolean; // Enable data caching
enableMemoization: boolean; // Enable function memoization
enableCompression: boolean; // Enable data compression
enablePrefetching: boolean; // Enable data prefetching
maxConcurrentRequests: number; // Max concurrent API requests
requestTimeout: number; // Request timeout in ms
}// Existing Leaderboard component with new props
<Leaderboard
timePeriod="7d"
limit={10}
currentUserId="user-123"
useHybridData={true} // NEW: Enable hybrid mode
showDataQuality={true} // NEW: Show data quality indicators
/>// Dedicated hybrid components with full features
<HybridLeaderboard
timePeriod="7d"
limit={20}
currentUserId="user-123"
enableRealTimeUpdates={true}
showDataQuality={true}
className="custom-styles"
/>
<HybridAchievementSystem
userId="user-123"
useHybridData={true}
showProgressBars={true}
showRarityIndicators={true}
enableRealTimeUpdates={true}
/>import { realTimeDataService } from "./lib/services/RealTimeDataService";
// Initialize real-time service
await realTimeDataService.initialize();
// Set up event handlers
realTimeDataService.onLeaderboardUpdate((data) => {
console.log("Leaderboard updated:", data);
// Update UI with new data
});
realTimeDataService.onAchievementUnlocked((achievement) => {
console.log("Achievement unlocked:", achievement);
// Show achievement notification
});
realTimeDataService.onChallengeProgress((challenge) => {
console.log("Challenge progress:", challenge);
// Update challenge UI
});// Trigger manual data refresh
const refreshData = async () => {
try {
await hybridService.clearCache();
await fetchLeaderboard();
} catch (error) {
console.error("Refresh failed:", error);
}
};The system automatically handles errors with multiple fallback strategies:
- Cached Data: Use recently cached data
- Mock Data: Fall back to mock data
- Default State: Show empty/default state
- User Notification: Inform user of issues
import { errorHandlingService } from "./lib/services/ErrorHandlingService";
try {
const data = await hybridService.getHybridLeaderboard(10, "7d", userId);
// Use data
} catch (error) {
const result = await errorHandlingService.handleError(error, {
component: "Leaderboard",
operation: "getLeaderboard",
userId: userId,
});
if (result.success) {
// Use fallback data
setLeaderboard(result.data);
} else {
// Show error state
setError("Unable to load leaderboard");
}
}import { performanceOptimizationService } from "./lib/services/PerformanceOptimizationService";
// Get performance metrics
const metrics =
performanceOptimizationService.getPerformanceMetrics("getLeaderboard");
const average =
performanceOptimizationService.getAveragePerformance("getLeaderboard");
console.log("Average duration:", average.averageDuration);
console.log("Cache hit rate:", average.cacheHitRate);
console.log("Total calls:", average.totalCalls);const cacheStats = performanceOptimizationService.getCacheStats();
console.log("Cache size:", cacheStats.size);
console.log("Cache hit rate:", cacheStats.hitRate);
console.log("Total cache size:", cacheStats.totalSize);import { HybridDataService } from "./lib/services/HybridDataService";
import { MockDataService } from "./lib/mockData";
describe("HybridDataService", () => {
let hybridService: HybridDataService;
beforeEach(() => {
hybridService = new HybridDataService();
});
test("should merge mock and real data", async () => {
const result = await hybridService.getHybridLeaderboard(
10,
"7d",
"user-123"
);
expect(result.entries).toBeDefined();
expect(result.stats.totalEntries).toBeGreaterThan(0);
expect(result.stats.dataQuality).toBeDefined();
});
test("should fallback to mock data on error", async () => {
// Mock real-time service to throw error
const result = await hybridService.getHybridLeaderboard(
10,
"7d",
"user-123"
);
expect(result.entries.length).toBeGreaterThan(0);
expect(result.stats.mockEntries).toBeGreaterThan(0);
});
});import { render, screen, waitFor } from "@testing-library/react";
import { HybridLeaderboard } from "./components/HybridLeaderboard";
test("should render hybrid leaderboard with data quality indicator", async () => {
render(
<HybridLeaderboard
timePeriod="7d"
limit={10}
currentUserId="user-123"
showDataQuality={true}
/>
);
await waitFor(() => {
expect(screen.getByText("Hybrid Leaderboard")).toBeInTheDocument();
expect(screen.getByText(/Data Quality:/)).toBeInTheDocument();
});
});- Real user data is only fetched for authenticated users
- Mock data provides privacy-safe demo experience
- Data sources are clearly indicated to users
- No sensitive information is cached
- All API requests include authentication tokens
- Rate limiting prevents abuse
- Input validation on all data
- Error messages don't expose sensitive information
# .env.local
REACT_APP_API_BASE_URL=http://localhost:8000
REACT_APP_ENABLE_WEBSOCKET=true
REACT_APP_API_KEY=your-api-key
REACT_APP_ENABLE_HYBRID_DATA=true// Production config
const productionConfig = {
enableRealTimeData: true,
enableMockData: false, // Disable mock data in production
mockDataWeight: 0.0, // No mock data weight
realDataWeight: 1.0, // Full real data weight
fallbackToMock: true, // Keep fallback for reliability
cacheTimeout: 60000, // Longer cache in production
enableCompression: true, // Enable compression
maxConcurrentRequests: 10, // Higher concurrency
};Track these key metrics:
- Response Time: Average API response time
- Cache Hit Rate: Percentage of requests served from cache
- Error Rate: Percentage of failed requests
- Data Quality: Ratio of real vs mock data
- User Engagement: Time spent on leaderboards/challenges
// Integrate with error tracking service (e.g., Sentry)
import * as Sentry from "@sentry/react";
errorHandlingService.onError((errorReport) => {
Sentry.captureException(errorReport.error, {
tags: {
component: errorReport.context.component,
operation: errorReport.context.operation,
severity: errorReport.severity.level,
},
extra: errorReport.context.metadata,
});
});- Start with mock data only
- Enable hybrid mode for beta users
- Monitor performance and user feedback
- Gradually increase real data weight
- Clearly indicate data sources
- Show data quality indicators
- Provide fallback explanations
- Handle errors gracefully
- Use caching aggressively
- Implement request throttling
- Monitor memory usage
- Clean up expired data
- Test with both mock and real data
- Simulate network failures
- Test error scenarios
- Validate data integrity
-
Data Not Loading
- Check network connectivity
- Verify API endpoints
- Check authentication tokens
- Review error logs
-
Performance Issues
- Monitor cache hit rates
- Check request throttling
- Review memory usage
- Optimize data queries
-
Real-Time Updates Not Working
- Verify WebSocket connection
- Check event handlers
- Review network configuration
- Test with mock data
// Enable debug mode in development
if (process.env.NODE_ENV === "development") {
hybridService.updateConfig({
enableRealTimeData: true,
enableMockData: true,
mockDataWeight: 0.5,
realDataWeight: 0.5,
});
}When contributing to the hybrid data system:
- Follow the established patterns
- Add comprehensive tests
- Update documentation
- Consider performance impact
- Test with both data sources
This hybrid data system is part of the ReBin project and follows the same licensing terms.