SwiftUI Firebase Ordering Platform Development Assistant
Expert assistant for developing a SwiftUI-based iOS ordering platform using Firebase backend, MVVM architecture, and environment-based state management.
Project Architecture
This is a SwiftUI iOS app implementing an ordering platform with the following structure:
MVVM Pattern with SwiftUI
**Models**: Data structures (`MenuItem`, `User`) in `/Models/`**Views**: SwiftUI views in `/Views/` folder**ViewModels**: `@Observable` classes in `/ViewModel/` folder**Components**: Reusable UI components in `/Components/`Key Architectural Patterns
**Environment-Based State Management:**
`CartViewViewModel` is injected as environment object in `TestingOwnOrderingPlatformApp.swift`Access in views via: `@Environment(CartViewViewModel.self) var cartViewModel`**Authentication Flow:**
`MainViewViewModel` handles auth state using Firebase Auth listenersShows `LoginView` when unauthenticated, `TabView` when authenticatedAuth listener set up in `init()`, cleaned up in `stopHandler()`**Navigation Structure:**
```
MainView (auth gate)
├── LoginView (unauthenticated)
└── TabView (authenticated)
├── MenuView (Order tab)
├── CartView (Cart tab)
└── ProfileView (Profile tab)
```
Firebase Integration
Backend Structure
**Authentication**: Firebase Auth with email/password**Database**: Firestore for menu items and user cart dataData Model
**Collections:**
`menuItems`: Menu items with fields: - name, description, price
- isEntree, isAppetizer, isVegetarian
`users/{userId}/cart/current`: User cart document**Cart Data Structure:**
Stored as `[String: Int]` dictionary (menuItemId: quantity)Firestore Operations Patterns
Use `@FirestoreQuery` for real-time data fetchingUse `Firestore.firestore()` for write operationsAlways check authenticated user: `Auth.auth().currentUser?.uid`Use `setData(_:)` for dictionaries, `setData(from:)` for Codable objectsDevelopment Workflows
Build and Run
**Build**: `Cmd+B` in Xcode or Product → Build**Run**: `Cmd+R` in Xcode or Product → Run**Clean Build**: `Cmd+Shift+K` in Xcode**Run Tests**: `Cmd+U` in Xcode or Product → TestAdding New Features
**1. Create New Views:**
Place View in `/Views/` folderCreate ViewModel in `/ViewModel/` using `@Observable`Import required Firebase modules (`FirebaseAuth`, `FirebaseFirestore`)Follow naming: `[ViewName]View` and `[ViewName]ViewModel`**2. Cart Operations:**
Access via environment: `@Environment(CartViewViewModel.self) var cartViewModel`Add items: `cartViewModel.addItemsToCart(menuItemId:count:)`Use `menuItem.id ?? menuItem.name` as fallback identifierAlways call `updateCartItemsToFirebase()` after local updatesCommon Implementation Patterns
Environment Object Access
```swift
@Environment(CartViewViewModel.self) var cartViewModel
```
Firestore Real-Time Queries
```swift
@FirestoreQuery(collectionPath: "menuItems") var menuItems: [MenuItem]
```
Authentication State Check
```swift
guard let userId = Auth.auth().currentUser?.uid else { return }
```
Cart Data Persistence
```swift
// Cart items persisted to Firestore in real-time
// Use menuItem.id ?? menuItem.name as identifier
// Call updateCartItemsToFirebase() after updates
```
Key Configuration
Dependencies
Swift Package Manager with Firebase iOS SDKFirebase modules: Auth, Firestore, Core`GoogleService-Info.plist` must be added to projectFirebase configured in `AppDelegate.application(_:didFinishLaunchingWithOptions:)`Important Constraints
1. **Authentication Required**: Most features require authenticated user session
2. **Real-Time Sync**: Cart state syncs to Firestore in real-time
3. **Environment Injection**: Cart VM must be environment object in app root
4. **ID Fallback**: Always use `menuItem.id ?? menuItem.name` for cart keys
5. **Auth Listener Cleanup**: Always clean up Firebase listeners in ViewModel cleanup
Testing Guidance
Run tests via `Cmd+U` in XcodeTest authentication flows thoroughlyVerify Firestore read/write operationsTest cart state persistence across app launches