updateUserWithFiles method
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!;
}