mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-30 18:35:00 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:convert';
 | |
| 
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:image_picker/image_picker.dart';
 | |
| 
 | |
| import 'package:immich_mobile/shared/services/user.service.dart';
 | |
| 
 | |
| enum UploadProfileStatus {
 | |
|   idle,
 | |
|   loading,
 | |
|   success,
 | |
|   failure,
 | |
| }
 | |
| 
 | |
| class UploadProfileImageState {
 | |
|   // enum
 | |
|   final UploadProfileStatus status;
 | |
|   final String profileImagePath;
 | |
|   UploadProfileImageState({
 | |
|     required this.status,
 | |
|     required this.profileImagePath,
 | |
|   });
 | |
| 
 | |
|   UploadProfileImageState copyWith({
 | |
|     UploadProfileStatus? status,
 | |
|     String? profileImagePath,
 | |
|   }) {
 | |
|     return UploadProfileImageState(
 | |
|       status: status ?? this.status,
 | |
|       profileImagePath: profileImagePath ?? this.profileImagePath,
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Map<String, dynamic> toMap() {
 | |
|     final result = <String, dynamic>{};
 | |
| 
 | |
|     result.addAll({'status': status.index});
 | |
|     result.addAll({'profileImagePath': profileImagePath});
 | |
| 
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   factory UploadProfileImageState.fromMap(Map<String, dynamic> map) {
 | |
|     return UploadProfileImageState(
 | |
|       status: UploadProfileStatus.values[map['status'] ?? 0],
 | |
|       profileImagePath: map['profileImagePath'] ?? '',
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   String toJson() => json.encode(toMap());
 | |
| 
 | |
|   factory UploadProfileImageState.fromJson(String source) =>
 | |
|       UploadProfileImageState.fromMap(json.decode(source));
 | |
| 
 | |
|   @override
 | |
|   String toString() =>
 | |
|       'UploadProfileImageState(status: $status, profileImagePath: $profileImagePath)';
 | |
| 
 | |
|   @override
 | |
|   bool operator ==(Object other) {
 | |
|     if (identical(this, other)) return true;
 | |
| 
 | |
|     return other is UploadProfileImageState &&
 | |
|         other.status == status &&
 | |
|         other.profileImagePath == profileImagePath;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   int get hashCode => status.hashCode ^ profileImagePath.hashCode;
 | |
| }
 | |
| 
 | |
| class UploadProfileImageNotifier
 | |
|     extends StateNotifier<UploadProfileImageState> {
 | |
|   UploadProfileImageNotifier(this._userSErvice)
 | |
|       : super(
 | |
|           UploadProfileImageState(
 | |
|             profileImagePath: '',
 | |
|             status: UploadProfileStatus.idle,
 | |
|           ),
 | |
|         );
 | |
| 
 | |
|   final UserService _userSErvice;
 | |
| 
 | |
|   Future<bool> upload(XFile file) async {
 | |
|     state = state.copyWith(status: UploadProfileStatus.loading);
 | |
| 
 | |
|     var res = await _userSErvice.uploadProfileImage(file);
 | |
| 
 | |
|     if (res != null) {
 | |
|       debugPrint("Succesfully upload profile image");
 | |
|       state = state.copyWith(
 | |
|         status: UploadProfileStatus.success,
 | |
|         profileImagePath: res.profileImagePath,
 | |
|       );
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     state = state.copyWith(status: UploadProfileStatus.failure);
 | |
|     return false;
 | |
|   }
 | |
| }
 | |
| 
 | |
| final uploadProfileImageProvider =
 | |
|     StateNotifierProvider<UploadProfileImageNotifier, UploadProfileImageState>(
 | |
|   ((ref) => UploadProfileImageNotifier(ref.watch(userServiceProvider))),
 | |
| );
 |