addSavedDestination method

Future<void> addSavedDestination(
  1. String uid,
  2. Map<String, dynamic> destinationData
)

//////////// //////////// Adds a saved destination for a user

Implementation

// II.D - Destination Management
///////////////
/// Adds a saved destination for a user
Future<void> addSavedDestination(String uid, Map<String, dynamic> destinationData) async {
  try {
    // Check if we're offline first
    if (!_isOnline) {
      // Get current user from cache
      final user = await getUser(uid);
      if (user != null) {
        // Add to cached destinations
        final newDestinations = List<Map<String, dynamic>>.from(user.savedDestinations);
        newDestinations.add(destinationData);

        // Update cache and track change
        _updateCache(uid, {'savedDestinations': newDestinations});
        _trackPendingChanges(uid, {'savedDestinations': FieldValue.arrayUnion([destinationData])});

        return; // Return early, change will sync when online
      }
    }

    // Online path
    await _firestore.collection(_collectionPath).doc(uid).update({
      'savedDestinations': FieldValue.arrayUnion([destinationData]),
    });

    // Update cache
    _updateCacheForArrayOperation(uid, 'savedDestinations', destinationData, isAddition: true);

  } catch (e) {
    print('Error adding saved destination: $e');

    if (e is FirebaseException && e.code == 'unavailable') {
      // We're offline, add to cache and track changes
      await getUser(uid); // Ensure user is in cache
      _updateCacheForArrayOperation(uid, 'savedDestinations', destinationData, isAddition: true);
      _trackPendingChanges(uid, {'savedDestinations': FieldValue.arrayUnion([destinationData])});
    } else {
      rethrow;
    }
  }
}