# πŸ— Project Architecture Comprehensive overview of AgriSense iOS application architecture, design patterns, and system organization. --- ## πŸ“ Architecture Overview AgriSense follows the **MVVM (Model-View-ViewModel)** architecture pattern with additional service layers for complex business logic. The application is built using SwiftUI and follows Apple's modern app development guidelines. ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Presentation Layer β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ SwiftUI Views β”‚ β”‚ β”‚ β”‚ β€’ Dashboard β€’ Marketplace β€’ Crop Management β”‚ β”‚ β”‚ β”‚ β€’ AI Assistant β€’ Community β€’ Profile β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ ↑ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ViewModel Layer β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ @StateObject / @ObservableObject β”‚ β”‚ β”‚ β”‚ β€’ AppState β€’ UserManager β€’ CropManager β”‚ β”‚ β”‚ β”‚ β€’ CartManager β€’ OrderManager β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ ↑ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Service Layer β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β€’ LiveAIService β€’ WeatherService β”‚ β”‚ β”‚ β”‚ β€’ EnhancedTTSService β€’ VoiceTranscription β”‚ β”‚ β”‚ β”‚ β€’ GeminiAIService β€’ MandiPriceService β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ ↑ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Model Layer β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β€’ Crop β€’ User β€’ Order β€’ Product β”‚ β”‚ β”‚ β”‚ β€’ WeatherData β€’ MarketPrice β€’ Community β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ ↑ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Infrastructure Layer β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Firebase β€’ Cloudinary β€’ APIs β€’ Local Storage β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## 🎯 Design Patterns ### 1. MVVM (Model-View-ViewModel) **Purpose**: Separation of concerns, testability, and maintainability **Implementation**: - **Model**: Data structures and business logic - **View**: SwiftUI views with minimal logic - **ViewModel**: Observable objects managing state and business logic **Example**: ```swift // Model struct Crop: Identifiable, Codable { let id: String var name: String var type: CropType var healthStatus: HealthStatus } // ViewModel class CropManager: ObservableObject { @Published var crops: [Crop] = [] @Published var isLoading = false func fetchCrops() async throws { // Business logic } } // View struct CropListView: View { @StateObject private var cropManager = CropManager() var body: some View { List(cropManager.crops) { crop in CropRowView(crop: crop) } } } ``` ### 2. Repository Pattern **Purpose**: Abstract data layer and provide single source of truth **Implementation**: - Managers act as repositories - Centralized data access - Caching strategies **Example**: ```swift class UserManager: ObservableObject { @Published var currentUser: User? private let db = Firestore.firestore() func fetchUser(id: String) async throws -> User { // Fetch from Firebase } func updateUser(_ user: User) async throws { // Update in Firebase } } ``` ### 3. Service Layer Pattern **Purpose**: Encapsulate complex business logic and external integrations **Services**: - `LiveAIService`: AI assistant orchestration - `GeminiAIService`: Gemini API integration - `WeatherService`: Weather data fetching - `EnhancedTTSService`: Text-to-speech - `VoiceTranscriptionService`: Speech-to-text - `MandiPriceService`: Market price data ### 4. Singleton Pattern **Used For**: Shared resources and managers **Examples**: ```swift class LocalizationManager: ObservableObject { static let shared = LocalizationManager() private init() {} } class AudioSessionManager { static let shared = AudioSessionManager() private init() {} } ``` ### 5. Observer Pattern **Implementation**: Combine framework with `@Published` properties ```swift class AppState: ObservableObject { @Published var isAuthenticated = false @Published var isDarkMode = false @Published var selectedLanguage: String = "en" } ``` ### 6. Factory Pattern **Used For**: Model creation and initialization ```swift struct AIContextBuilder { static func buildContext( conversationHistory: [Message], screenContent: String?, cameraFeed: UIImage? ) -> AIContext { // Build and return context } } ``` ### 7. Strategy Pattern **Used For**: AI model selection and fallback ```swift class GeminiAIService { private var modelStrategy: [AIModel] = [ .flash2Experimental, .flash2Thinking, .flash15, .pro15 ] func processWithFallback() async throws -> Response { for model in modelStrategy { do { return try await process(with: model) } catch { continue // Try next model } } throw AIError.allModelsFailed } } ``` --- ## πŸ“ Directory Structure ``` AgriSense(iOS)/ β”œβ”€β”€ Agrisense/ β”‚ β”œβ”€β”€ AgrisenseApp.swift # App entry point β”‚ β”œβ”€β”€ GoogleService-Info.plist # Firebase config β”‚ β”œβ”€β”€ Info.plist # App configuration β”‚ β”‚ β”‚ β”œβ”€β”€ Models/ # Data models & managers β”‚ β”‚ β”œβ”€β”€ Crop.swift β”‚ β”‚ β”œβ”€β”€ UserManager.swift β”‚ β”‚ β”œβ”€β”€ CartManager.swift β”‚ β”‚ β”œβ”€β”€ OrderManager.swift β”‚ β”‚ β”œβ”€β”€ ProductManager.swift β”‚ β”‚ β”œβ”€β”€ CropManager.swift β”‚ β”‚ β”œβ”€β”€ WeatherData.swift β”‚ β”‚ β”œβ”€β”€ MarketPrice.swift β”‚ β”‚ β”œβ”€β”€ AppState.swift β”‚ β”‚ └── ... β”‚ β”‚ β”‚ β”œβ”€β”€ Views/ # SwiftUI views β”‚ β”‚ β”œβ”€β”€ Dashboard/ β”‚ β”‚ β”‚ β”œβ”€β”€ DashboardView.swift β”‚ β”‚ β”‚ β”œβ”€β”€ WeatherCard.swift β”‚ β”‚ β”‚ └── MandiPriceCard.swift β”‚ β”‚ β”œβ”€β”€ Assistant/ β”‚ β”‚ β”‚ β”œβ”€β”€ LiveAIView.swift β”‚ β”‚ β”‚ └── VoiceIndicatorView.swift β”‚ β”‚ β”œβ”€β”€ Marketplace/ β”‚ β”‚ β”‚ β”œβ”€β”€ MarketplaceView.swift β”‚ β”‚ β”‚ β”œβ”€β”€ ProductListView.swift β”‚ β”‚ β”‚ └── CartView.swift β”‚ β”‚ β”œβ”€β”€ Authentication/ β”‚ β”‚ β”œβ”€β”€ Community/ β”‚ β”‚ β”œβ”€β”€ Profile/ β”‚ β”‚ └── Components/ # Reusable components β”‚ β”‚ β”‚ β”œβ”€β”€ Services/ # Business logic services β”‚ β”‚ β”œβ”€β”€ AI/ β”‚ β”‚ β”‚ β”œβ”€β”€ GeminiAIService.swift β”‚ β”‚ β”‚ β”œβ”€β”€ AIModels.swift β”‚ β”‚ β”‚ └── AIContextBuilder.swift β”‚ β”‚ β”œβ”€β”€ LiveAIService.swift β”‚ β”‚ β”œβ”€β”€ EnhancedTTSService.swift β”‚ β”‚ β”œβ”€β”€ VoiceTranscriptionService.swift β”‚ β”‚ β”œβ”€β”€ WakeWordDetectionService.swift β”‚ β”‚ β”œβ”€β”€ WeatherService.swift β”‚ β”‚ β”œβ”€β”€ MandiPriceService.swift β”‚ β”‚ β”œβ”€β”€ CameraService.swift β”‚ β”‚ └── WebSearchService.swift β”‚ β”‚ β”‚ β”œβ”€β”€ Utils/ # Utility classes β”‚ β”‚ β”œβ”€β”€ NetworkMonitor.swift β”‚ β”‚ β”œβ”€β”€ SecureStorage.swift β”‚ β”‚ β”œβ”€β”€ ErrorHandling.swift β”‚ β”‚ β”œβ”€β”€ ImageCompression.swift β”‚ β”‚ β”œβ”€β”€ AudioSessionManager.swift β”‚ β”‚ └── ... β”‚ β”‚ β”‚ β”œβ”€β”€ CoreKit/ # Core functionality β”‚ β”‚ └── LocalizationManager.swift β”‚ β”‚ β”‚ β”œβ”€β”€ Assets.xcassets/ # Images and assets β”‚ └── Localization/ # Multi-language support β”‚ β”œβ”€β”€ en.lproj/ β”‚ β”œβ”€β”€ hi.lproj/ β”‚ β”œβ”€β”€ bn.lproj/ β”‚ β”œβ”€β”€ ta.lproj/ β”‚ └── te.lproj/ β”‚ β”œβ”€β”€ AgrisenseTests/ # Unit tests β”œβ”€β”€ AgrisenseUITests/ # UI tests β”œβ”€β”€ Screenshots/ # App screenshots └── Agrisense.xcodeproj/ # Xcode project ``` --- ## πŸ”„ Data Flow ### Authentication Flow ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LoginView β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ User enters credentials ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ UserManager β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Firebase Auth ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Firebase β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Auth Token ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AppState β”‚ Updates isAuthenticated β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DashboardViewβ”‚ Navigates to main view β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### AI Assistant Flow ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LiveAIView β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ User speaks ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ WakeWordDetection β”‚ Detects "Krishi AI" β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Activates listening ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚VoiceTranscription β”‚ Converts speech to text β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Transcribed text ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LiveAIService β”‚ Orchestrates AI logic β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Builds context ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ GeminiAIService β”‚ Sends to Gemini API β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ AI response ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ EnhancedTTSService β”‚ Converts text to speech β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Plays audio ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LiveAIView β”‚ Updates UI with response β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Crop Management Flow ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AddCropView β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ User adds crop ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CropManager β”‚ Validates input β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Upload image ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Cloudinary β”‚ Returns image URL β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Image URL ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Firestore β”‚ Saves crop data β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Success ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CropManager β”‚ Updates @Published crops β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CropListView β”‚ Displays updated list β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ” Security Architecture ### Layers of Security 1. **Authentication Layer** - Firebase Authentication - Secure token storage - Biometric authentication support 2. **Network Layer** - HTTPS only - Certificate pinning - Request encryption 3. **Data Layer** - Encrypted local storage (Keychain) - Firestore security rules - Input validation 4. **API Layer** - Rate limiting - API key rotation - Request signing See [Security Documentation](Security.md) for details. --- ## ⚑ Performance Optimizations ### 1. Lazy Loading - Images loaded on-demand - Firestore pagination - Lazy stacks in lists ### 2. Caching - Weather data cached (30 min) - Market prices cached (1 hour) - Image caching with URLCache ### 3. Background Processing - Image compression in background - Async/await for network calls - Background tasks for updates ### 4. Memory Management - Weak references for delegates - Image downsampling - Proper deallocation --- ## πŸ§ͺ Testing Architecture ### Unit Tests - Model validation - Manager logic - Utility functions ### UI Tests - User flows - Navigation - Form validation ### Integration Tests - Firebase integration - API communication - Service interactions See [Testing Guide](Testing-Guide.md) for details. --- ## 🌐 Networking Architecture ### API Structure ```swift protocol APIService { func fetch(_ endpoint: String) async throws -> T } class SecureNetworkManager: APIService { private let session: URLSession private let rateLimiter: RateLimiter func fetch(_ endpoint: String) async throws -> T { // Rate limiting try await rateLimiter.checkLimit() // Build request let request = try buildRequest(endpoint) // Execute with retry return try await executeWithRetry(request) } } ``` ### Retry Mechanism ```swift class RetryMechanism { func executeWithRetry( maxAttempts: Int = 3, delay: TimeInterval = 1.0, operation: () async throws -> T ) async throws -> T { for attempt in 1...maxAttempts { do { return try await operation() } catch { if attempt == maxAttempts { throw error } try await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) } } throw NetworkError.maxRetriesExceeded } } ``` --- ## πŸ“± State Management ### Global State ```swift // AppState.swift class AppState: ObservableObject { @Published var isAuthenticated = false @Published var isDarkMode = false @Published var selectedLanguage = "en" @Published var currentUser: User? } ``` ### Feature-Specific State ```swift // CropManager.swift class CropManager: ObservableObject { @Published var crops: [Crop] = [] @Published var isLoading = false @Published var error: Error? } ``` ### View-Local State ```swift // CropDetailView.swift struct CropDetailView: View { @State private var isEditing = false @State private var showAlert = false } ``` --- ## πŸ”Œ Dependency Injection ### Environment Objects ```swift // App level @main struct AgrisenseApp: App { @StateObject private var userManager = UserManager() @StateObject private var appState = AppState() var body: some Scene { WindowGroup { ContentView() .environmentObject(userManager) .environmentObject(appState) } } } // View level struct DashboardView: View { @EnvironmentObject var userManager: UserManager @EnvironmentObject var appState: AppState } ``` --- ## 🎨 UI Architecture ### Component Hierarchy ``` ContentView β”œβ”€β”€ MainTabView β”‚ β”œβ”€β”€ DashboardView β”‚ β”‚ β”œβ”€β”€ WeatherCard β”‚ β”‚ β”œβ”€β”€ MandiPriceCard β”‚ β”‚ └── CropSummaryCard β”‚ β”œβ”€β”€ MarketplaceView β”‚ β”‚ β”œβ”€β”€ ProductGrid β”‚ β”‚ └── CategoryFilter β”‚ β”œβ”€β”€ LiveAIView β”‚ β”‚ β”œβ”€β”€ VoiceIndicator β”‚ β”‚ └── TranscriptView β”‚ β”œβ”€β”€ CommunityView β”‚ └── ProfileView └── Components (Shared) β”œβ”€β”€ CustomButton β”œβ”€β”€ LoadingView β”œβ”€β”€ ErrorView └── ImagePicker ``` --- ## πŸ“Š Analytics & Monitoring ### Event Tracking ```swift enum AnalyticsEvent { case userSignUp case cropAdded case productPurchased case aiQueryMade } class AnalyticsManager { func track(_ event: AnalyticsEvent) { // Firebase Analytics } } ``` --- ## πŸš€ Next Steps - [Code Structure](Code-Structure.md) - Detailed file organization - [Services Architecture](Services-Architecture.md) - Service layer details - [Firebase Integration](Firebase-Integration.md) - Backend integration - [AI & ML Integration](AI-ML-Integration.md) - AI implementation --- **Questions?** Check the [FAQ](FAQ.md) or [create an issue](https://github.com/Athar891/AgrisenseiOS/issues).