diff --git a/b0esche_cloud/lib/models/user.dart b/b0esche_cloud/lib/models/user.dart index 9f20fcd..11d7268 100644 --- a/b0esche_cloud/lib/models/user.dart +++ b/b0esche_cloud/lib/models/user.dart @@ -6,7 +6,6 @@ class User extends Equatable { final String email; final String? displayName; final String? avatarUrl; - final String? blurHash; final DateTime createdAt; final DateTime? lastLoginAt; @@ -16,7 +15,6 @@ class User extends Equatable { required this.email, this.displayName, this.avatarUrl, - this.blurHash, required this.createdAt, this.lastLoginAt, }); @@ -28,7 +26,6 @@ class User extends Equatable { email, displayName, avatarUrl, - blurHash, createdAt, lastLoginAt, ]; @@ -39,7 +36,6 @@ class User extends Equatable { String? email, String? displayName, String? avatarUrl, - String? blurHash, DateTime? createdAt, DateTime? lastLoginAt, }) { @@ -49,7 +45,6 @@ class User extends Equatable { email: email ?? this.email, displayName: displayName ?? this.displayName, avatarUrl: avatarUrl ?? this.avatarUrl, - blurHash: blurHash ?? this.blurHash, createdAt: createdAt ?? this.createdAt, lastLoginAt: lastLoginAt ?? this.lastLoginAt, ); @@ -62,7 +57,6 @@ class User extends Equatable { email: json['email'] as String, displayName: json['displayName'] as String?, avatarUrl: json['avatarUrl'] as String?, - blurHash: json['blurHash'] as String?, createdAt: DateTime.parse( json['createdAt'] as String? ?? DateTime.now().toIso8601String(), ), @@ -79,7 +73,6 @@ class User extends Equatable { 'email': email, 'displayName': displayName, 'avatarUrl': avatarUrl, - 'blurHash': blurHash, 'createdAt': createdAt.toIso8601String(), 'lastLoginAt': lastLoginAt?.toIso8601String(), }; diff --git a/b0esche_cloud/lib/services/api_client.dart b/b0esche_cloud/lib/services/api_client.dart index 1e1af5e..b255bcc 100644 --- a/b0esche_cloud/lib/services/api_client.dart +++ b/b0esche_cloud/lib/services/api_client.dart @@ -186,13 +186,11 @@ class ApiClient { String? displayName, String? email, String? avatarUrl, - String? blurHash, }) async { final data = {}; if (displayName != null) data['displayName'] = displayName; if (email != null) data['email'] = email; if (avatarUrl != null) data['avatarUrl'] = avatarUrl; - if (blurHash != null) data['blurHash'] = blurHash; return putRaw('/user/profile', data: data); } diff --git a/b0esche_cloud/lib/widgets/account_settings_dialog.dart b/b0esche_cloud/lib/widgets/account_settings_dialog.dart index a9708a4..3f6427a 100644 --- a/b0esche_cloud/lib/widgets/account_settings_dialog.dart +++ b/b0esche_cloud/lib/widgets/account_settings_dialog.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart' as flutter_blurhash; import 'package:file_picker/file_picker.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 'dart:io'; import '../blocs/auth/auth_bloc.dart'; @@ -29,7 +26,6 @@ class _AccountSettingsDialogState extends State { // Profile fields late TextEditingController _displayNameController; String? _avatarUrl; - String? _blurHash; // Security fields late TextEditingController _currentPasswordController; @@ -63,7 +59,6 @@ class _AccountSettingsDialogState extends State { _currentUser = authState.user; _displayNameController.text = _currentUser?.displayName ?? ''; _avatarUrl = _currentUser?.avatarUrl; - _blurHash = _currentUser?.blurHash; } } @@ -79,13 +74,7 @@ class _AccountSettingsDialogState extends State { final bytes = await file.readAsBytes(); 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(() { - _blurHash = blurHash; _isLoading = true; }); @@ -132,7 +121,6 @@ class _AccountSettingsDialogState extends State { ? null : _displayNameController.text, avatarUrl: _avatarUrl, - blurHash: _blurHash, ); final updatedUser = _currentUser!.copyWith( @@ -140,7 +128,6 @@ class _AccountSettingsDialogState extends State { ? null : _displayNameController.text, avatarUrl: _avatarUrl, - blurHash: _blurHash, ); if (mounted) { @@ -493,12 +480,20 @@ class _AccountSettingsDialogState extends State { backgroundColor: AppTheme.secondaryText.withValues( alpha: 0.2, ), - child: _avatarUrl != null && _blurHash != null + child: _avatarUrl != null ? ClipOval( - child: flutter_blurhash.BlurHash( - hash: _blurHash!, - image: _avatarUrl, - imageFit: BoxFit.cover, + child: Image.network( + _avatarUrl!, + fit: BoxFit.cover, + width: 100, + height: 100, + errorBuilder: (context, error, stackTrace) { + return Icon( + Icons.person, + size: 50, + color: AppTheme.secondaryText, + ); + }, ), ) : Icon( diff --git a/b0esche_cloud/pubspec.lock b/b0esche_cloud/pubspec.lock index 68b1c8d..52ee23a 100644 --- a/b0esche_cloud/pubspec.lock +++ b/b0esche_cloud/pubspec.lock @@ -41,14 +41,6 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: "direct main" description: @@ -254,14 +246,6 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: diff --git a/b0esche_cloud/pubspec.yaml b/b0esche_cloud/pubspec.yaml index aff4313..a04d0e4 100644 --- a/b0esche_cloud/pubspec.yaml +++ b/b0esche_cloud/pubspec.yaml @@ -68,8 +68,6 @@ dependencies: just_audio: ^0.10.5 flutter_web_plugins: sdk: flutter - flutter_blurhash: ^0.9.1 - blurhash_dart: ^1.2.1 image: ^4.7.2 dev_dependencies: diff --git a/go_cloud/internal/http/routes.go b/go_cloud/internal/http/routes.go index 3c97095..fd35d68 100644 --- a/go_cloud/internal/http/routes.go +++ b/go_cloud/internal/http/routes.go @@ -3801,15 +3801,14 @@ func getUserProfileHandler(w http.ResponseWriter, r *http.Request, db *database. Email string `json:"email"` DisplayName *string `json:"displayName"` AvatarURL *string `json:"avatarUrl"` - BlurHash *string `json:"blurHash"` CreatedAt time.Time `json:"createdAt"` LastLoginAt *time.Time `json:"lastLoginAt"` } 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). - 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 == sql.ErrNoRows { 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"` Email *string `json:"email"` AvatarURL *string `json:"avatarUrl"` - BlurHash *string `json:"blurHash"` } 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) argIndex++ } - if req.BlurHash != nil { - setParts = append(setParts, fmt.Sprintf("blur_hash = $%d", argIndex)) - args = append(args, *req.BlurHash) - argIndex++ - } if len(setParts) == 0 { // No fields to update @@ -3905,9 +3898,6 @@ func updateUserProfileHandler(w http.ResponseWriter, r *http.Request, db *databa if req.AvatarURL != nil { metadata["avatarUrl"] = *req.AvatarURL } - if req.BlurHash != nil { - metadata["blurHash"] = *req.BlurHash - } auditLogger.Log(r.Context(), audit.Entry{ UserID: &userID,