updateUserWithFiles method

Future<AppUser> updateUserWithFiles({
  1. Map<String, dynamic>? data,
  2. String? email,
  3. String? password,
  4. Map<String, dynamic>? files,
})

Update current user with file uploads

Example:

// Update only avatar
final newAvatar = await MultipartFile.fromFile('path/to/new_avatar.jpg');
await db.auth.updateUserWithFiles(
  files: {'avatar': newAvatar}
);

// Update bio and avatar
await db.auth.updateUserWithFiles(
  data: {'bio': 'Updated bio'},
  files: {'avatar': newAvatar}
);

// Update multiple fields and files
await db.auth.updateUserWithFiles(
  data: {'username': 'newusername', 'bio': 'New bio'},
  email: 'newemail@example.com',
  files: {
    'avatar': newAvatar,
    'cover_photo': newCover
  }
);

Implementation

Future<AppUser> updateUserWithFiles({
  Map<String, dynamic>? data,
  String? email,
  String? password,
  Map<String, dynamic>? files,
}) async {
  if (_token == null) {
    throw Exception('User is not authenticated');
  }

  final formData = FormData();

  // Build request body by excluding null values
  final Map<String, dynamic> body = {};
  if (data != null) {
    final currentData = _user?.data ?? {};
    body['data'] = {...currentData, ...data};
  }
  if (email != null) body['email'] = email;
  if (password != null) body['password'] = password;

  // Add JSON data if there's any
  if (body.isNotEmpty) {
    formData.fields.add(MapEntry('data', jsonEncode(body)));
  }

  // Add files if provided
  if (files != null) {
    for (final entry in files.entries) {
      final fieldName = entry.key;
      final fileValue = entry.value;

      if (fileValue is List) {
        for (final file in fileValue) {
          if (file is MultipartFile) {
            formData.files.add(MapEntry(fieldName, file));
          }
        }
      } else if (fileValue is MultipartFile) {
        formData.files.add(MapEntry(fieldName, fileValue));
      }
    }
  }

  final response = await _dio.patch('/auth-collections/user', data: formData);

  if (response.statusCode != 200) {
    throw Exception('User update failed: ${response.data}');
  }

  _user = AppUser.fromJson(response.data);
  await setUser(_user!);

  // Trigger user update callback
  _callbacks.onUserUpdate?.call(_user!);

  return _user!;
}