- Add networkErrorRecovery utility with:
- Request timeout handling via AbortController
- Circuit breaker pattern to prevent cascading failures
- Request deduplication for concurrent identical requests
- Enhanced fetch with timeout, circuit breaker, and retry support
- Add useApiWithErrorHandling hooks:
- useApiCall for single API calls with auto error display
- useMutation for mutations with optimistic update support
- useMultipleApiCalls for parallel API execution
- Add ErrorBoundary component:
- Catches React errors in component tree
- Displays fallback UI with retry option
- Supports custom fallback components
- withErrorBoundary HOC for easy wrapping
- Add comprehensive tests (64 passing tests):
- Circuit breaker state transitions
- Request deduplication
- Timeout detection
- Error type classification
- Hook behavior and error handling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add real-time validation for WiFi credentials with password strength indicator
- Add validateRealTime() for immediate UI feedback as user types
- Add parseWiFiErrorResponse() for user-friendly error messages
- Add prepareCredentialsForDevice() for pre-transmission validation
- Block BLE protocol delimiter characters (| and ,) in credentials
- Create WiFiPasswordInput component with strength bar and validation hints
- Update BLEManager with improved error messages and pre-validation
- Update MockBLEManager with simulation scenarios for testing
- Add 62 comprehensive tests for all validation functions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented cache-busting mechanism to prevent stale avatar images
after upload. React Native Image component caches images by URI,
causing old avatars to persist even after successful upload.
Changes:
- Added bustImageCache() utility function in utils/imageUtils.ts
- Appends timestamp query parameter (?t=timestamp) to avatar URLs
- Skips cache-busting for local file://, data: URIs and placeholders
- Applied bustImageCache() to all avatar Image components:
- Beneficiary detail screen (header, edit modal, lightbox)
- Beneficiary list cards on dashboard
- Ensured loadBeneficiary() is called after avatar upload completes
- Added comprehensive unit tests for cache-busting logic
Backend already generates unique URLs with timestamps when uploading
to MinIO, but this ensures frontend always requests fresh images.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>