Implemented pull-to-refresh functionality across all main screens:
- Home screen: Added RefreshControl to beneficiaries FlatList
- Separated isLoading (initial load) from isRefreshing (pull-to-refresh)
- Only show full screen spinner on initial load, not during refresh
- Pass isRefresh flag to loadBeneficiaries to control loading state
- Chat screen: Added RefreshControl to messages FlatList
- Reset conversation to initial welcome message on refresh
- Stop TTS and voice input during refresh to prevent conflicts
- Clear state cleanly before resetting messages
- Profile screen: Added RefreshControl to ScrollView
- Reload avatar from cloud/cache on refresh
- Graceful error handling if avatar load fails
- Dashboard screen: Enhanced visual feedback on refresh
- Show ActivityIndicator in refresh button when refreshing
- Disable refresh button during refresh to prevent rapid-fire
- Reset isRefreshing state on WebView load completion
Added comprehensive tests (23 test cases) covering:
- RefreshControl integration on all screens
- Loading state differentiation (isLoading vs isRefreshing)
- Error handling during refresh
- User experience (platform colors, visual feedback)
- Integration verification for all implementations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented a reusable useDebounce hook to prevent rapid-fire clicks
on refresh buttons throughout the application.
Changes:
- Created hooks/useDebounce.ts with configurable delay and leading/trailing edge options
- Added comprehensive unit tests in hooks/__tests__/useDebounce.test.ts
- Applied debouncing to dashboard WebView refresh button (app/(tabs)/dashboard.tsx)
- Applied debouncing to beneficiary detail pull-to-refresh (app/(tabs)/beneficiaries/[id]/index.tsx)
- Applied debouncing to equipment screen refresh (app/(tabs)/beneficiaries/[id]/equipment.tsx)
- Applied debouncing to all error retry buttons (components/ui/ErrorMessage.tsx)
- Fixed jest.setup.js to properly mock React Native modules
- Added implementation documentation in docs/DEBOUNCE_IMPLEMENTATION.md
Technical details:
- Default 1-second debounce delay
- Leading edge execution (immediate first call, then debounce)
- Type-safe with TypeScript generics
- Automatic cleanup on component unmount
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
BLE Fix:
- Check if sensor is already connected to target WiFi before sending credentials
- Handle W|fail when sensor uses saved credentials instead of new password
- Return success if sensor is connected to target network even after W|fail
Build Version Indicator:
- Add visible version badge on Dashboard screen (v2.1.0 • 2026-01-27 17:05)
- Green text on dark background in bottom-right corner
- Helps verify which build is running on device
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>