Implement centralized data caching system

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>
This commit is contained in:
Trey t
2025-11-12 17:57:21 -06:00
parent d5d16c5c48
commit eeb8a96f20
6 changed files with 707 additions and 10 deletions

View File

@@ -167,6 +167,19 @@ class LoginViewModel: ObservableObject {
// Initialize lookups repository after successful login
LookupsManager.shared.initialize()
// Prefetch all data for caching
Task {
do {
print("Starting data prefetch...")
let prefetchManager = DataPrefetchManager.Companion().getInstance()
_ = try await prefetchManager.prefetchAllData()
print("Data prefetch completed successfully")
} catch {
print("Data prefetch failed: \(error.localizedDescription)")
// Don't block login on prefetch failure
}
}
// Update authentication state AFTER setting verified status
// Small delay to ensure state updates are processed
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
@@ -192,6 +205,9 @@ class LoginViewModel: ObservableObject {
// Clear lookups data on logout
LookupsManager.shared.clear()
// Clear all cached data
DataCache.shared.clearAll()
// Reset state
isAuthenticated = false
isVerified = false