updatePreferences method

Future<void> updatePreferences(
  1. String uid,
  2. Map<String, dynamic> preferences
)

//////////// //////////// Updates user preferences

Implementation

// II.F - Preference Management
///////////////
/// Updates user preferences
Future<void> updatePreferences(String uid, Map<String, dynamic> preferences) async {
  try {
    if (!_isOnline) {
      // Get existing preferences from cache to merge
      final user = await getUser(uid);
      if (user != null) {
        final updatedPrefs = {...user.preferences, ...preferences};

        // Update cache and track change
        _updateCache(uid, {'preferences': updatedPrefs});
        _trackPendingChanges(uid, {'preferences': updatedPrefs});
        return;
      }
    }

    await _firestore.collection(_collectionPath).doc(uid).update({
      'preferences': preferences,
    });

    // Update cache
    if (_userCache.containsKey(uid)) {
      final cachedUser = _userCache[uid]!;
      final updatedPrefs = {...cachedUser.preferences, ...preferences};
      _userCache[uid] = cachedUser.copyWith(preferences: updatedPrefs);
    }
  } catch (e) {
    print('Error updating preferences: $e');

    if (e is FirebaseException && e.code == 'unavailable') {
      // We're offline, update cache and track for later
      if (_userCache.containsKey(uid)) {
        final cachedUser = _userCache[uid]!;
        final updatedPrefs = {...cachedUser.preferences, ...preferences};
        _userCache[uid] = cachedUser.copyWith(preferences: updatedPrefs);
        _trackPendingChanges(uid, {'preferences': updatedPrefs});
      }
    }

    rethrow;
  }
}