Remove blurHash references from User model and related components

This commit is contained in:
Leon Bösche
2026-01-28 23:59:15 +01:00
parent de26b280d0
commit f4f80b9ed7
6 changed files with 15 additions and 57 deletions

View File

@@ -6,7 +6,6 @@ class User extends Equatable {
final String email; final String email;
final String? displayName; final String? displayName;
final String? avatarUrl; final String? avatarUrl;
final String? blurHash;
final DateTime createdAt; final DateTime createdAt;
final DateTime? lastLoginAt; final DateTime? lastLoginAt;
@@ -16,7 +15,6 @@ class User extends Equatable {
required this.email, required this.email,
this.displayName, this.displayName,
this.avatarUrl, this.avatarUrl,
this.blurHash,
required this.createdAt, required this.createdAt,
this.lastLoginAt, this.lastLoginAt,
}); });
@@ -28,7 +26,6 @@ class User extends Equatable {
email, email,
displayName, displayName,
avatarUrl, avatarUrl,
blurHash,
createdAt, createdAt,
lastLoginAt, lastLoginAt,
]; ];
@@ -39,7 +36,6 @@ class User extends Equatable {
String? email, String? email,
String? displayName, String? displayName,
String? avatarUrl, String? avatarUrl,
String? blurHash,
DateTime? createdAt, DateTime? createdAt,
DateTime? lastLoginAt, DateTime? lastLoginAt,
}) { }) {
@@ -49,7 +45,6 @@ class User extends Equatable {
email: email ?? this.email, email: email ?? this.email,
displayName: displayName ?? this.displayName, displayName: displayName ?? this.displayName,
avatarUrl: avatarUrl ?? this.avatarUrl, avatarUrl: avatarUrl ?? this.avatarUrl,
blurHash: blurHash ?? this.blurHash,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
lastLoginAt: lastLoginAt ?? this.lastLoginAt, lastLoginAt: lastLoginAt ?? this.lastLoginAt,
); );
@@ -62,7 +57,6 @@ class User extends Equatable {
email: json['email'] as String, email: json['email'] as String,
displayName: json['displayName'] as String?, displayName: json['displayName'] as String?,
avatarUrl: json['avatarUrl'] as String?, avatarUrl: json['avatarUrl'] as String?,
blurHash: json['blurHash'] as String?,
createdAt: DateTime.parse( createdAt: DateTime.parse(
json['createdAt'] as String? ?? DateTime.now().toIso8601String(), json['createdAt'] as String? ?? DateTime.now().toIso8601String(),
), ),
@@ -79,7 +73,6 @@ class User extends Equatable {
'email': email, 'email': email,
'displayName': displayName, 'displayName': displayName,
'avatarUrl': avatarUrl, 'avatarUrl': avatarUrl,
'blurHash': blurHash,
'createdAt': createdAt.toIso8601String(), 'createdAt': createdAt.toIso8601String(),
'lastLoginAt': lastLoginAt?.toIso8601String(), 'lastLoginAt': lastLoginAt?.toIso8601String(),
}; };

View File

@@ -186,13 +186,11 @@ class ApiClient {
String? displayName, String? displayName,
String? email, String? email,
String? avatarUrl, String? avatarUrl,
String? blurHash,
}) async { }) async {
final data = <String, dynamic>{}; final data = <String, dynamic>{};
if (displayName != null) data['displayName'] = displayName; if (displayName != null) data['displayName'] = displayName;
if (email != null) data['email'] = email; if (email != null) data['email'] = email;
if (avatarUrl != null) data['avatarUrl'] = avatarUrl; if (avatarUrl != null) data['avatarUrl'] = avatarUrl;
if (blurHash != null) data['blurHash'] = blurHash;
return putRaw('/user/profile', data: data); return putRaw('/user/profile', data: data);
} }

View File

@@ -1,9 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart' as flutter_blurhash;
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:blurhash_dart/blurhash_dart.dart' as blurhash_dart;
import 'package:image/image.dart' as img;
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'dart:io'; import 'dart:io';
import '../blocs/auth/auth_bloc.dart'; import '../blocs/auth/auth_bloc.dart';
@@ -29,7 +26,6 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
// Profile fields // Profile fields
late TextEditingController _displayNameController; late TextEditingController _displayNameController;
String? _avatarUrl; String? _avatarUrl;
String? _blurHash;
// Security fields // Security fields
late TextEditingController _currentPasswordController; late TextEditingController _currentPasswordController;
@@ -63,7 +59,6 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
_currentUser = authState.user; _currentUser = authState.user;
_displayNameController.text = _currentUser?.displayName ?? ''; _displayNameController.text = _currentUser?.displayName ?? '';
_avatarUrl = _currentUser?.avatarUrl; _avatarUrl = _currentUser?.avatarUrl;
_blurHash = _currentUser?.blurHash;
} }
} }
@@ -79,13 +74,7 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
final bytes = await file.readAsBytes(); final bytes = await file.readAsBytes();
final filename = result.files.single.name; final filename = result.files.single.name;
final image = img.decodeImage(bytes);
if (image == null) throw Exception('Invalid image');
// Generate blur hash
final blurHash = blurhash_dart.BlurHash.encode(image).hash;
setState(() { setState(() {
_blurHash = blurHash;
_isLoading = true; _isLoading = true;
}); });
@@ -132,7 +121,6 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
? null ? null
: _displayNameController.text, : _displayNameController.text,
avatarUrl: _avatarUrl, avatarUrl: _avatarUrl,
blurHash: _blurHash,
); );
final updatedUser = _currentUser!.copyWith( final updatedUser = _currentUser!.copyWith(
@@ -140,7 +128,6 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
? null ? null
: _displayNameController.text, : _displayNameController.text,
avatarUrl: _avatarUrl, avatarUrl: _avatarUrl,
blurHash: _blurHash,
); );
if (mounted) { if (mounted) {
@@ -493,12 +480,20 @@ class _AccountSettingsDialogState extends State<AccountSettingsDialog> {
backgroundColor: AppTheme.secondaryText.withValues( backgroundColor: AppTheme.secondaryText.withValues(
alpha: 0.2, alpha: 0.2,
), ),
child: _avatarUrl != null && _blurHash != null child: _avatarUrl != null
? ClipOval( ? ClipOval(
child: flutter_blurhash.BlurHash( child: Image.network(
hash: _blurHash!, _avatarUrl!,
image: _avatarUrl, fit: BoxFit.cover,
imageFit: BoxFit.cover, width: 100,
height: 100,
errorBuilder: (context, error, stackTrace) {
return Icon(
Icons.person,
size: 50,
color: AppTheme.secondaryText,
);
},
), ),
) )
: Icon( : Icon(

View File

@@ -41,14 +41,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.0" version: "9.2.0"
blurhash_dart:
dependency: "direct main"
description:
name: blurhash_dart
sha256: "43955b6c2e30a7d440028d1af0fa185852f3534b795cc6eb81fbf397b464409f"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
cached_network_image: cached_network_image:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -254,14 +246,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.1.1" version: "9.1.1"
flutter_blurhash:
dependency: "direct main"
description:
name: flutter_blurhash
sha256: e97b9aff13b9930bbaa74d0d899fec76e3f320aba3190322dcc5d32104e3d25d
url: "https://pub.dev"
source: hosted
version: "0.9.1"
flutter_cache_manager: flutter_cache_manager:
dependency: transitive dependency: transitive
description: description:

View File

@@ -68,8 +68,6 @@ dependencies:
just_audio: ^0.10.5 just_audio: ^0.10.5
flutter_web_plugins: flutter_web_plugins:
sdk: flutter sdk: flutter
flutter_blurhash: ^0.9.1
blurhash_dart: ^1.2.1
image: ^4.7.2 image: ^4.7.2
dev_dependencies: dev_dependencies:

View File

@@ -3801,15 +3801,14 @@ func getUserProfileHandler(w http.ResponseWriter, r *http.Request, db *database.
Email string `json:"email"` Email string `json:"email"`
DisplayName *string `json:"displayName"` DisplayName *string `json:"displayName"`
AvatarURL *string `json:"avatarUrl"` AvatarURL *string `json:"avatarUrl"`
BlurHash *string `json:"blurHash"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
LastLoginAt *time.Time `json:"lastLoginAt"` LastLoginAt *time.Time `json:"lastLoginAt"`
} }
err = db.QueryRowContext(r.Context(), err = db.QueryRowContext(r.Context(),
`SELECT id, username, email, display_name, avatar_url, blur_hash, created_at, last_login_at `SELECT id, username, email, display_name, avatar_url, created_at, last_login_at
FROM users WHERE id = $1`, userID). FROM users WHERE id = $1`, userID).
Scan(&user.ID, &user.Username, &user.Email, &user.DisplayName, &user.AvatarURL, &user.BlurHash, &user.CreatedAt, &user.LastLoginAt) Scan(&user.ID, &user.Username, &user.Email, &user.DisplayName, &user.AvatarURL, &user.CreatedAt, &user.LastLoginAt)
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
errors.WriteError(w, errors.CodeNotFound, "User not found", http.StatusNotFound) errors.WriteError(w, errors.CodeNotFound, "User not found", http.StatusNotFound)
@@ -3842,7 +3841,6 @@ func updateUserProfileHandler(w http.ResponseWriter, r *http.Request, db *databa
DisplayName *string `json:"displayName"` DisplayName *string `json:"displayName"`
Email *string `json:"email"` Email *string `json:"email"`
AvatarURL *string `json:"avatarUrl"` AvatarURL *string `json:"avatarUrl"`
BlurHash *string `json:"blurHash"`
} }
if err = json.NewDecoder(r.Body).Decode(&req); err != nil { if err = json.NewDecoder(r.Body).Decode(&req); err != nil {
@@ -3870,11 +3868,6 @@ func updateUserProfileHandler(w http.ResponseWriter, r *http.Request, db *databa
args = append(args, *req.AvatarURL) args = append(args, *req.AvatarURL)
argIndex++ argIndex++
} }
if req.BlurHash != nil {
setParts = append(setParts, fmt.Sprintf("blur_hash = $%d", argIndex))
args = append(args, *req.BlurHash)
argIndex++
}
if len(setParts) == 0 { if len(setParts) == 0 {
// No fields to update // No fields to update
@@ -3905,9 +3898,6 @@ func updateUserProfileHandler(w http.ResponseWriter, r *http.Request, db *databa
if req.AvatarURL != nil { if req.AvatarURL != nil {
metadata["avatarUrl"] = *req.AvatarURL metadata["avatarUrl"] = *req.AvatarURL
} }
if req.BlurHash != nil {
metadata["blurHash"] = *req.BlurHash
}
auditLogger.Log(r.Context(), audit.Entry{ auditLogger.Log(r.Context(), audit.Entry{
UserID: &userID, UserID: &userID,