- Remove pagination from all Django REST Framework endpoints
- Update Kotlin API clients to return direct lists instead of paginated responses
- Update iOS ViewModels to handle direct list responses
- Remove ContractorListResponse, DocumentListResponse, and PaginatedResponse models
- Fix contractor form specialty selector loading with improved DataCache access
- Fix contractor sheet presentation to use full screen (.presentationDetents([.large]))
- Improve UI test scrolling to handle lists of any size with smart end detection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major architectural improvements:
- Created APILayer as single entry point for all network operations
- Integrated cache-first reads with automatic cache updates on mutations
- Migrated all shared Kotlin ViewModels to use APILayer instead of direct API calls
- Migrated iOS ViewModels to wrap shared Kotlin ViewModels with StateFlow observation
- Replaced LookupsManager with DataCache for centralized lookup data management
- Added password reset methods to AuthViewModel
- Added task completion and update methods to APILayer
- Added residence user management methods to APILayer
iOS specific changes:
- Updated LoginViewModel, RegisterViewModel, ProfileViewModel to use shared AuthViewModel
- Updated ContractorViewModel, DocumentViewModel to use shared ViewModels
- Updated ResidenceViewModel to use shared ViewModel and APILayer
- Updated TaskViewModel to wrap shared ViewModel with callback-based interface
- Migrated PasswordResetViewModel and VerifyEmailViewModel to shared AuthViewModel
- Migrated AllTasksView, CompleteTaskView, EditTaskView to use APILayer
- Migrated ManageUsersView, ResidenceDetailView to use APILayer
- Migrated JoinResidenceView to use async/await pattern with APILayer
- Removed LookupsManager.swift in favor of DataCache
- Fixed PushNotificationManager @MainActor issue
- Converted all direct API calls to use async/await with proper error handling
Benefits:
- Reduced code duplication between iOS and Android
- Consistent error handling across platforms
- Automatic cache management for better performance
- Centralized network layer for easier testing and maintenance
- Net reduction of ~700 lines of code through shared logic
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit adds a comprehensive caching system that loads all data
on app launch and keeps it in memory, eliminating redundant API calls
when navigating between screens.
Core Implementation:
- DataCache: Singleton holding all app data in StateFlow
- DataPrefetchManager: Loads all data in parallel on app launch
- Automatic cache updates on create/update/delete operations
Features:
- ✅ Instant screen loads from cached data
- ✅ Reduced API calls (no redundant requests)
- ✅ Better UX (no loading spinners on navigation)
- ✅ Offline support (data remains available)
- ✅ Consistent state across all screens
Cache Contents:
- Residences (all + my residences + summaries)
- Tasks (all tasks + tasks by residence)
- Documents (all + by residence)
- Contractors (all)
- Lookup data (categories, priorities, frequencies, statuses)
ViewModels Updated:
- ResidenceViewModel: Uses cache with forceRefresh option
- TaskViewModel: Uses cache with forceRefresh option
- Updates cache on successful create/update/delete
iOS Integration:
- Data prefetch on successful login
- Cache cleared on logout
- Background prefetch doesn't block authentication
Usage:
// Load from cache (instant)
viewModel.loadResidences()
// Force refresh from API
viewModel.loadResidences(forceRefresh: true)
Next Steps:
- Update DocumentViewModel and ContractorViewModel (same pattern)
- Add Android MainActivity integration
- Add pull-to-refresh support
See composeApp/src/commonMain/kotlin/com/example/mycrib/cache/README_CACHING.md
for complete documentation and implementation guide.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>