clean(packages): apply dart fix (close #106) #107
| @ -24,9 +24,8 @@ import 'package:wyatt_http_client/wyatt_http_client.dart'; | |||||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||||
| 
 | 
 | ||||||
| class AlbumApiDataSourceImpl extends AlbumRemoteDataSource { | class AlbumApiDataSourceImpl extends AlbumRemoteDataSource { | ||||||
|   final MiddlewareClient _client; |  | ||||||
| 
 |  | ||||||
|   AlbumApiDataSourceImpl(this._client); |   AlbumApiDataSourceImpl(this._client); | ||||||
|  |   final MiddlewareClient _client; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<Album> getAlbum(int id) async { |   Future<Album> getAlbum(int id) async { | ||||||
|  | |||||||
| @ -24,9 +24,8 @@ import 'package:wyatt_http_client/wyatt_http_client.dart'; | |||||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||||
| 
 | 
 | ||||||
| class PhotoApiDataSourceImpl extends PhotoRemoteDataSource { | class PhotoApiDataSourceImpl extends PhotoRemoteDataSource { | ||||||
|   final MiddlewareClient _client; |  | ||||||
| 
 |  | ||||||
|   PhotoApiDataSourceImpl(this._client); |   PhotoApiDataSourceImpl(this._client); | ||||||
|  |   final MiddlewareClient _client; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<Photo> getPhoto(int id) async { |   Future<Photo> getPhoto(int id) async { | ||||||
|  | |||||||
| @ -24,15 +24,15 @@ import 'package:wyatt_architecture/wyatt_architecture.dart'; | |||||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||||
| 
 | 
 | ||||||
| class PhotoRepositoryImpl extends PhotoRepository { | class PhotoRepositoryImpl extends PhotoRepository { | ||||||
|   final PhotoRemoteDataSource _photoRemoteDataSource; |  | ||||||
|   final AlbumRemoteDataSource _albumRemoteDataSource; |  | ||||||
|   final FavoriteLocalDataSource _favoriteLocalDataSource; |  | ||||||
| 
 | 
 | ||||||
|   PhotoRepositoryImpl( |   PhotoRepositoryImpl( | ||||||
|     this._photoRemoteDataSource, |     this._photoRemoteDataSource, | ||||||
|     this._albumRemoteDataSource, |     this._albumRemoteDataSource, | ||||||
|     this._favoriteLocalDataSource, |     this._favoriteLocalDataSource, | ||||||
|   ); |   ); | ||||||
|  |   final PhotoRemoteDataSource _photoRemoteDataSource; | ||||||
|  |   final AlbumRemoteDataSource _albumRemoteDataSource; | ||||||
|  |   final FavoriteLocalDataSource _favoriteLocalDataSource; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync( |   FutureOrResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync( | ||||||
|  | |||||||
| @ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart'; | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class AddPhotoToFavorites extends AsyncUseCase<Photo, List<Photo>> { | class AddPhotoToFavorites extends AsyncUseCase<Photo, List<Photo>> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   AddPhotoToFavorites(this._photoRepository); |   AddPhotoToFavorites(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Photo>> execute(Photo? params) async { |   FutureOrResult<List<Photo>> execute(Photo? params) async { | ||||||
|  | |||||||
| @ -20,9 +20,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart'; | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class CheckIfPhotoIsInFavorites extends AsyncUseCase<int, bool> { | class CheckIfPhotoIsInFavorites extends AsyncUseCase<int, bool> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   CheckIfPhotoIsInFavorites(this._photoRepository); |   CheckIfPhotoIsInFavorites(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<bool> execute(int? params) async => |   FutureOrResult<bool> execute(int? params) async => | ||||||
|  | |||||||
| @ -19,9 +19,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart'; | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class DisplayFavorites extends AsyncUseCase<NoParam, List<Photo>> { | class DisplayFavorites extends AsyncUseCase<NoParam, List<Photo>> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   DisplayFavorites(this._photoRepository); |   DisplayFavorites(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Photo>> execute(void params) { |   FutureOrResult<List<Photo>> execute(void params) { | ||||||
|  | |||||||
| @ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart'; | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class DisplayPhoto extends AsyncUseCase<int, Photo> { | class DisplayPhoto extends AsyncUseCase<int, Photo> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   DisplayPhoto(this._photoRepository); |   DisplayPhoto(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<Photo> execute(int? params) { |   FutureOrResult<Photo> execute(int? params) { | ||||||
|  | |||||||
| @ -22,9 +22,9 @@ import 'package:architecture_example/domain/usecases/photos/params/query_paramet | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class OpenAlbum extends AsyncUseCase<QueryParameters, List<Photo>> { | class OpenAlbum extends AsyncUseCase<QueryParameters, List<Photo>> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   OpenAlbum(this._photoRepository); |   OpenAlbum(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Photo>> execute(QueryParameters? params) { |   FutureOrResult<List<Photo>> execute(QueryParameters? params) { | ||||||
|  | |||||||
| @ -15,9 +15,9 @@ | |||||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
| 
 | 
 | ||||||
| class QueryParameters { | class QueryParameters { | ||||||
|  | 
 | ||||||
|  |   QueryParameters(this.start, this.limit, {this.albumId = -1}); | ||||||
|   final int albumId; |   final int albumId; | ||||||
|   final int? start; |   final int? start; | ||||||
|   final int? limit; |   final int? limit; | ||||||
| 
 |  | ||||||
|   QueryParameters(this.start, this.limit, {this.albumId = -1}); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart'; | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class RemovePhotoFromFavorites extends AsyncUseCase<int, List<Photo>> { | class RemovePhotoFromFavorites extends AsyncUseCase<int, List<Photo>> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   RemovePhotoFromFavorites(this._photoRepository); |   RemovePhotoFromFavorites(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Photo>> execute(int? params) async { |   FutureOrResult<List<Photo>> execute(int? params) async { | ||||||
|  | |||||||
| @ -22,9 +22,9 @@ import 'package:architecture_example/domain/usecases/photos/params/query_paramet | |||||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||||
| 
 | 
 | ||||||
| class RetrieveAllAlbums extends AsyncUseCase<QueryParameters, List<Album>> { | class RetrieveAllAlbums extends AsyncUseCase<QueryParameters, List<Album>> { | ||||||
|   final PhotoRepository _photoRepository; |  | ||||||
| 
 | 
 | ||||||
|   RetrieveAllAlbums(this._photoRepository); |   RetrieveAllAlbums(this._photoRepository); | ||||||
|  |   final PhotoRepository _photoRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Album>> execute(QueryParameters? params) { |   FutureOrResult<List<Album>> execute(QueryParameters? params) { | ||||||
|  | |||||||
| @ -33,7 +33,6 @@ EventTransformer<E> throttleDroppable<E>(Duration duration) => | |||||||
|     (events, mapper) => droppable<E>().call(events.throttle(duration), mapper); |     (events, mapper) => droppable<E>().call(events.throttle(duration), mapper); | ||||||
| 
 | 
 | ||||||
| class AlbumBloc extends Bloc<AlbumEvent, AlbumState> { | class AlbumBloc extends Bloc<AlbumEvent, AlbumState> { | ||||||
|   final RetrieveAllAlbums _retrieveAllAlbums; |  | ||||||
| 
 | 
 | ||||||
|   AlbumBloc(this._retrieveAllAlbums) : super(const AlbumState()) { |   AlbumBloc(this._retrieveAllAlbums) : super(const AlbumState()) { | ||||||
|     on<AlbumFetched>( |     on<AlbumFetched>( | ||||||
| @ -41,6 +40,7 @@ class AlbumBloc extends Bloc<AlbumEvent, AlbumState> { | |||||||
|       transformer: throttleDroppable(throttleDuration), |       transformer: throttleDroppable(throttleDuration), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |   final RetrieveAllAlbums _retrieveAllAlbums; | ||||||
| 
 | 
 | ||||||
|   Future<void> _onAlbumFetched( |   Future<void> _onAlbumFetched( | ||||||
|     AlbumFetched event, |     AlbumFetched event, | ||||||
|  | |||||||
| @ -26,19 +26,19 @@ abstract class PhotoDetailsState extends Equatable { | |||||||
| class PhotoDetailsInitial extends PhotoDetailsState {} | class PhotoDetailsInitial extends PhotoDetailsState {} | ||||||
| 
 | 
 | ||||||
| class PhotoDetailsSuccess extends PhotoDetailsState { | class PhotoDetailsSuccess extends PhotoDetailsState { | ||||||
|   final Photo photo; |  | ||||||
|   final bool isFavorite; |  | ||||||
| 
 | 
 | ||||||
|   const PhotoDetailsSuccess(this.photo, {required this.isFavorite}); |   const PhotoDetailsSuccess(this.photo, {required this.isFavorite}); | ||||||
|  |   final Photo photo; | ||||||
|  |   final bool isFavorite; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object> get props => [photo, isFavorite]; |   List<Object> get props => [photo, isFavorite]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class PhotoDetailsFailure extends PhotoDetailsState { | class PhotoDetailsFailure extends PhotoDetailsState { | ||||||
|   final String error; |  | ||||||
| 
 | 
 | ||||||
|   const PhotoDetailsFailure(this.error); |   const PhotoDetailsFailure(this.error); | ||||||
|  |   final String error; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object> get props => [error]; |   List<Object> get props => [error]; | ||||||
|  | |||||||
| @ -23,10 +23,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | |||||||
| part 'favorite_checker_state.dart'; | part 'favorite_checker_state.dart'; | ||||||
| 
 | 
 | ||||||
| class FavoriteCheckerCubit extends Cubit<FavoriteCheckerState> { | class FavoriteCheckerCubit extends Cubit<FavoriteCheckerState> { | ||||||
|   final CheckIfPhotoIsInFavorites _checkIfPhotoIsInFavorites; |  | ||||||
| 
 | 
 | ||||||
|   FavoriteCheckerCubit(this._checkIfPhotoIsInFavorites) |   FavoriteCheckerCubit(this._checkIfPhotoIsInFavorites) | ||||||
|       : super(FavoriteCheckerInitial()); |       : super(FavoriteCheckerInitial()); | ||||||
|  |   final CheckIfPhotoIsInFavorites _checkIfPhotoIsInFavorites; | ||||||
| 
 | 
 | ||||||
|   FutureOr<void> checkIfPhotoIsInFavorites(int photoId) async { |   FutureOr<void> checkIfPhotoIsInFavorites(int photoId) async { | ||||||
|     final response = await _checkIfPhotoIsInFavorites.call(photoId); |     final response = await _checkIfPhotoIsInFavorites.call(photoId); | ||||||
|  | |||||||
| @ -10,19 +10,19 @@ abstract class FavoriteCheckerState extends Equatable { | |||||||
| class FavoriteCheckerInitial extends FavoriteCheckerState {} | class FavoriteCheckerInitial extends FavoriteCheckerState {} | ||||||
| 
 | 
 | ||||||
| class FavoriteCheckerSuccess extends FavoriteCheckerState { | class FavoriteCheckerSuccess extends FavoriteCheckerState { | ||||||
|   final int photoId; |  | ||||||
|   final bool isFavorite; |  | ||||||
| 
 | 
 | ||||||
|   const FavoriteCheckerSuccess(this.photoId, {required this.isFavorite}); |   const FavoriteCheckerSuccess(this.photoId, {required this.isFavorite}); | ||||||
|  |   final int photoId; | ||||||
|  |   final bool isFavorite; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object> get props => [photoId, isFavorite]; |   List<Object> get props => [photoId, isFavorite]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class FavoriteCheckerFailure extends FavoriteCheckerState { | class FavoriteCheckerFailure extends FavoriteCheckerState { | ||||||
|   final String error; |  | ||||||
| 
 | 
 | ||||||
|   const FavoriteCheckerFailure(this.error); |   const FavoriteCheckerFailure(this.error); | ||||||
|  |   final String error; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object> get props => [error]; |   List<Object> get props => [error]; | ||||||
|  | |||||||
| @ -33,7 +33,6 @@ EventTransformer<E> throttleDroppable<E>(Duration duration) => | |||||||
|     (events, mapper) => droppable<E>().call(events.throttle(duration), mapper); |     (events, mapper) => droppable<E>().call(events.throttle(duration), mapper); | ||||||
| 
 | 
 | ||||||
| class PhotoBloc extends Bloc<PhotoEvent, PhotoState> { | class PhotoBloc extends Bloc<PhotoEvent, PhotoState> { | ||||||
|   final OpenAlbum _openAlbum; |  | ||||||
| 
 | 
 | ||||||
|   PhotoBloc(this._openAlbum) : super(const PhotoState()) { |   PhotoBloc(this._openAlbum) : super(const PhotoState()) { | ||||||
|     on<PhotoFetched>( |     on<PhotoFetched>( | ||||||
| @ -41,6 +40,7 @@ class PhotoBloc extends Bloc<PhotoEvent, PhotoState> { | |||||||
|       transformer: throttleDroppable(throttleDuration), |       transformer: throttleDroppable(throttleDuration), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |   final OpenAlbum _openAlbum; | ||||||
| 
 | 
 | ||||||
|   Future<void> _onPhotoFetched( |   Future<void> _onPhotoFetched( | ||||||
|     PhotoFetched event, |     PhotoFetched event, | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ abstract class PhotoEvent extends Equatable { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class PhotoFetched extends PhotoEvent { | class PhotoFetched extends PhotoEvent { | ||||||
|   final int albumId; |  | ||||||
| 
 | 
 | ||||||
|   const PhotoFetched(this.albumId); |   const PhotoFetched(this.albumId); | ||||||
|  |   final int albumId; | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,9 +17,9 @@ | |||||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||||
| 
 | 
 | ||||||
| abstract class AppException implements Exception { | abstract class AppException implements Exception { | ||||||
|   final String? message; |  | ||||||
| 
 | 
 | ||||||
|   AppException([this.message]); |   AppException([this.message]); | ||||||
|  |   final String? message; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() { | ||||||
|  | |||||||
| @ -20,15 +20,15 @@ part 'exceptions_firebase.dart'; | |||||||
| 
 | 
 | ||||||
| abstract class AuthenticationFailureInterface extends AppException | abstract class AuthenticationFailureInterface extends AppException | ||||||
|     implements Exception { |     implements Exception { | ||||||
|  | 
 | ||||||
|  |   AuthenticationFailureInterface(this.code, this.msg); | ||||||
|  |   AuthenticationFailureInterface.fromCode(this.code) | ||||||
|  |       : msg = 'An unknown error occurred.'; | ||||||
|   String code; |   String code; | ||||||
|   String msg; |   String msg; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String get message => msg; |   String get message => msg; | ||||||
| 
 |  | ||||||
|   AuthenticationFailureInterface(this.code, this.msg); |  | ||||||
|   AuthenticationFailureInterface.fromCode(this.code) |  | ||||||
|       : msg = 'An unknown error occurred.'; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// {@template apply_action_code_failure} | /// {@template apply_action_code_failure} | ||||||
|  | |||||||
| @ -20,10 +20,10 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| 
 | 
 | ||||||
| class AuthenticationCacheDataSourceImpl<T extends Object> | class AuthenticationCacheDataSourceImpl<T extends Object> | ||||||
|     extends AuthenticationCacheDataSource<T> { |     extends AuthenticationCacheDataSource<T> { | ||||||
|   Account? _account; |  | ||||||
|   T? _data; |  | ||||||
| 
 | 
 | ||||||
|   AuthenticationCacheDataSourceImpl(); |   AuthenticationCacheDataSourceImpl(); | ||||||
|  |   Account? _account; | ||||||
|  |   T? _data; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<void> storeAccount(Account? account) async { |   Future<void> storeAccount(Account? account) async { | ||||||
|  | |||||||
| @ -20,11 +20,11 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| 
 | 
 | ||||||
| class AuthenticationFirebaseDataSourceImpl | class AuthenticationFirebaseDataSourceImpl | ||||||
|     extends AuthenticationRemoteDataSource { |     extends AuthenticationRemoteDataSource { | ||||||
|   final FirebaseAuth _firebaseAuth; |  | ||||||
|   UserCredential? _latestCreds; |  | ||||||
| 
 | 
 | ||||||
|   AuthenticationFirebaseDataSourceImpl({FirebaseAuth? firebaseAuth}) |   AuthenticationFirebaseDataSourceImpl({FirebaseAuth? firebaseAuth}) | ||||||
|       : _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance; |       : _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance; | ||||||
|  |   final FirebaseAuth _firebaseAuth; | ||||||
|  |   UserCredential? _latestCreds; | ||||||
| 
 | 
 | ||||||
|   Account _mapper(User user) => AccountModel( |   Account _mapper(User user) => AccountModel( | ||||||
|         uid: user.uid, |         uid: user.uid, | ||||||
|  | |||||||
| @ -21,6 +21,11 @@ import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart'; | |||||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||||
| 
 | 
 | ||||||
| class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource { | class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource { | ||||||
|  | 
 | ||||||
|  |   AuthenticationMockDataSourceImpl({ | ||||||
|  |     this.idToken = 'fake-id-token', | ||||||
|  |     this.registeredAccounts, | ||||||
|  |   }); | ||||||
|   Pair<Account, String>? _connectedMock; |   Pair<Account, String>? _connectedMock; | ||||||
|   Pair<Account, String>? _registeredMock; |   Pair<Account, String>? _registeredMock; | ||||||
|   DateTime _lastSignInTime = DateTime.now(); |   DateTime _lastSignInTime = DateTime.now(); | ||||||
| @ -30,11 +35,6 @@ class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource { | |||||||
|   final List<Pair<Account, String>>? registeredAccounts; |   final List<Pair<Account, String>>? registeredAccounts; | ||||||
|   final String idToken; |   final String idToken; | ||||||
| 
 | 
 | ||||||
|   AuthenticationMockDataSourceImpl({ |  | ||||||
|     this.idToken = 'fake-id-token', |  | ||||||
|     this.registeredAccounts, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   Future<void> _randomDelay() async { |   Future<void> _randomDelay() async { | ||||||
|     await Future<void>.delayed( |     await Future<void>.delayed( | ||||||
|       Duration(milliseconds: Random().nextInt(400) + 200), |       Duration(milliseconds: Random().nextInt(400) + 200), | ||||||
|  | |||||||
| @ -41,19 +41,7 @@ typedef OnAuthChange<T> = FutureOrResult<T?> Function( | |||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| class AuthenticationRepositoryImpl<T extends Object> | class AuthenticationRepositoryImpl<T extends Object> | ||||||
|     extends AuthenticationRepository<T> { |     extends AuthenticationRepository<T> { // Semaphore | ||||||
|   final AuthenticationCacheDataSource<T> _authenticationLocalDataSource; |  | ||||||
|   final AuthenticationRemoteDataSource _authenticationRemoteDataSource; |  | ||||||
| 
 |  | ||||||
|   late FormRepository _formRepository; |  | ||||||
| 
 |  | ||||||
|   final OnSignUpSuccess<T>? _onSignUpSuccess; |  | ||||||
| 
 |  | ||||||
|   final OnAuthChange<T>? _onAccountChanges; |  | ||||||
|   final StreamController<FutureOrResult<AccountWrapper<T>>> _signUpStream = |  | ||||||
|       StreamController(); |  | ||||||
| 
 |  | ||||||
|   bool _pause = false; // Semaphore |  | ||||||
| 
 | 
 | ||||||
|   AuthenticationRepositoryImpl({ |   AuthenticationRepositoryImpl({ | ||||||
|     required AuthenticationCacheDataSource<T> authenticationCacheDataSource, |     required AuthenticationCacheDataSource<T> authenticationCacheDataSource, | ||||||
| @ -106,6 +94,18 @@ class AuthenticationRepositoryImpl<T extends Object> | |||||||
|         ), |         ), | ||||||
|       ); |       ); | ||||||
|   } |   } | ||||||
|  |   final AuthenticationCacheDataSource<T> _authenticationLocalDataSource; | ||||||
|  |   final AuthenticationRemoteDataSource _authenticationRemoteDataSource; | ||||||
|  | 
 | ||||||
|  |   late FormRepository _formRepository; | ||||||
|  | 
 | ||||||
|  |   final OnSignUpSuccess<T>? _onSignUpSuccess; | ||||||
|  | 
 | ||||||
|  |   final OnAuthChange<T>? _onAccountChanges; | ||||||
|  |   final StreamController<FutureOrResult<AccountWrapper<T>>> _signUpStream = | ||||||
|  |       StreamController(); | ||||||
|  | 
 | ||||||
|  |   bool _pause = false; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FormRepository get formRepository => _formRepository; |   FormRepository get formRepository => _formRepository; | ||||||
|  | |||||||
| @ -26,7 +26,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| part 'authentication_state.dart'; | part 'authentication_state.dart'; | ||||||
| 
 | 
 | ||||||
| class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> { | class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> { | ||||||
|   final AuthenticationRepository<Extra> _authenticationRepository; |  | ||||||
| 
 | 
 | ||||||
|   AuthenticationCubit({ |   AuthenticationCubit({ | ||||||
|     required AuthenticationRepository<Extra> authenticationRepository, |     required AuthenticationRepository<Extra> authenticationRepository, | ||||||
| @ -34,6 +33,7 @@ class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> { | |||||||
|         super(const AuthenticationState.unknown()) { |         super(const AuthenticationState.unknown()) { | ||||||
|     _listenForAuthenticationChanges(); |     _listenForAuthenticationChanges(); | ||||||
|   } |   } | ||||||
|  |   final AuthenticationRepository<Extra> _authenticationRepository; | ||||||
| 
 | 
 | ||||||
|   void _listenForAuthenticationChanges() { |   void _listenForAuthenticationChanges() { | ||||||
|     _authenticationRepository.streamAccount().listen((accountFutureResult) { |     _authenticationRepository.streamAccount().listen((accountFutureResult) { | ||||||
|  | |||||||
| @ -17,8 +17,6 @@ | |||||||
| part of 'authentication_cubit.dart'; | part of 'authentication_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| class AuthenticationState<Extra> extends Equatable { | class AuthenticationState<Extra> extends Equatable { | ||||||
|   final AuthenticationStatus status; |  | ||||||
|   final AccountWrapper<Extra>? accountWrapper; |  | ||||||
| 
 | 
 | ||||||
|   const AuthenticationState._({required this.status, this.accountWrapper}); |   const AuthenticationState._({required this.status, this.accountWrapper}); | ||||||
| 
 | 
 | ||||||
| @ -33,6 +31,8 @@ class AuthenticationState<Extra> extends Equatable { | |||||||
| 
 | 
 | ||||||
|   const AuthenticationState.unauthenticated() |   const AuthenticationState.unauthenticated() | ||||||
|       : this._(status: AuthenticationStatus.unauthenticated); |       : this._(status: AuthenticationStatus.unauthenticated); | ||||||
|  |   final AuthenticationStatus status; | ||||||
|  |   final AccountWrapper<Extra>? accountWrapper; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object?> get props => [status, accountWrapper]; |   List<Object?> get props => [status, accountWrapper]; | ||||||
|  | |||||||
| @ -24,12 +24,12 @@ import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; | |||||||
| part 'email_verification_state.dart'; | part 'email_verification_state.dart'; | ||||||
| 
 | 
 | ||||||
| class EmailVerificationCubit<Extra> extends Cubit<EmailVerificationState> { | class EmailVerificationCubit<Extra> extends Cubit<EmailVerificationState> { | ||||||
|   final AuthenticationRepository<Extra> _authenticationRepository; |  | ||||||
| 
 | 
 | ||||||
|   EmailVerificationCubit({ |   EmailVerificationCubit({ | ||||||
|     required AuthenticationRepository<Extra> authenticationRepository, |     required AuthenticationRepository<Extra> authenticationRepository, | ||||||
|   })  : _authenticationRepository = authenticationRepository, |   })  : _authenticationRepository = authenticationRepository, | ||||||
|         super(const EmailVerificationState()); |         super(const EmailVerificationState()); | ||||||
|  |   final AuthenticationRepository<Extra> _authenticationRepository; | ||||||
| 
 | 
 | ||||||
|   FutureOr<void> sendEmailVerification() async { |   FutureOr<void> sendEmailVerification() async { | ||||||
|     emit(state.copyWith(status: FormStatus.submissionInProgress)); |     emit(state.copyWith(status: FormStatus.submissionInProgress)); | ||||||
|  | |||||||
| @ -25,9 +25,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| part 'password_reset_state.dart'; | part 'password_reset_state.dart'; | ||||||
| 
 | 
 | ||||||
| class PasswordResetCubit<Extra> extends FormDataCubit<PasswordResetState> { | class PasswordResetCubit<Extra> extends FormDataCubit<PasswordResetState> { | ||||||
|   final AuthenticationRepository<Extra> _authenticationRepository; |  | ||||||
|   FormRepository get _formRepository => |  | ||||||
|       _authenticationRepository.formRepository; |  | ||||||
| 
 | 
 | ||||||
|   PasswordResetCubit({ |   PasswordResetCubit({ | ||||||
|     required AuthenticationRepository<Extra> authenticationRepository, |     required AuthenticationRepository<Extra> authenticationRepository, | ||||||
| @ -38,6 +35,9 @@ class PasswordResetCubit<Extra> extends FormDataCubit<PasswordResetState> { | |||||||
|                 .accessForm(AuthFormName.passwordResetForm), |                 .accessForm(AuthFormName.passwordResetForm), | ||||||
|           ), |           ), | ||||||
|         ); |         ); | ||||||
|  |   final AuthenticationRepository<Extra> _authenticationRepository; | ||||||
|  |   FormRepository get _formRepository => | ||||||
|  |       _authenticationRepository.formRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String get formName => AuthFormName.passwordResetForm; |   String get formName => AuthFormName.passwordResetForm; | ||||||
|  | |||||||
| @ -17,13 +17,13 @@ | |||||||
| part of 'password_reset_cubit.dart'; | part of 'password_reset_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| class PasswordResetState extends FormDataState { | class PasswordResetState extends FormDataState { | ||||||
|   Email get email => form.validatorOf(AuthFormField.email); |  | ||||||
| 
 | 
 | ||||||
|   const PasswordResetState({ |   const PasswordResetState({ | ||||||
|     required super.form, |     required super.form, | ||||||
|     super.status = FormStatus.pure, |     super.status = FormStatus.pure, | ||||||
|     super.errorMessage, |     super.errorMessage, | ||||||
|   }); |   }); | ||||||
|  |   Email get email => form.validatorOf(AuthFormField.email); | ||||||
| 
 | 
 | ||||||
|   PasswordResetState copyWith({ |   PasswordResetState copyWith({ | ||||||
|     WyattForm? form, |     WyattForm? form, | ||||||
|  | |||||||
| @ -23,9 +23,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| part 'sign_in_state.dart'; | part 'sign_in_state.dart'; | ||||||
| 
 | 
 | ||||||
| class SignInCubit<Extra> extends FormDataCubit<SignInState> { | class SignInCubit<Extra> extends FormDataCubit<SignInState> { | ||||||
|   final AuthenticationRepository<Extra> _authenticationRepository; |  | ||||||
|   FormRepository get _formRepository => |  | ||||||
|       _authenticationRepository.formRepository; |  | ||||||
| 
 | 
 | ||||||
|   SignInCubit({ |   SignInCubit({ | ||||||
|     required AuthenticationRepository<Extra> authenticationRepository, |     required AuthenticationRepository<Extra> authenticationRepository, | ||||||
| @ -36,6 +33,9 @@ class SignInCubit<Extra> extends FormDataCubit<SignInState> { | |||||||
|                 .accessForm(AuthFormName.signInForm), |                 .accessForm(AuthFormName.signInForm), | ||||||
|           ), |           ), | ||||||
|         ); |         ); | ||||||
|  |   final AuthenticationRepository<Extra> _authenticationRepository; | ||||||
|  |   FormRepository get _formRepository => | ||||||
|  |       _authenticationRepository.formRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String get formName => AuthFormName.signInForm; |   String get formName => AuthFormName.signInForm; | ||||||
|  | |||||||
| @ -17,16 +17,16 @@ | |||||||
| part of 'sign_in_cubit.dart'; | part of 'sign_in_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| class SignInState extends FormDataState { | class SignInState extends FormDataState { | ||||||
|   FormInputValidator<String?, ValidationError> get email => |  | ||||||
|       form.validatorOf(AuthFormField.email); |  | ||||||
|   FormInputValidator<String?, ValidationError> get password => |  | ||||||
|       form.validatorOf(AuthFormField.password); |  | ||||||
| 
 | 
 | ||||||
|   const SignInState({ |   const SignInState({ | ||||||
|     required super.form, |     required super.form, | ||||||
|     super.status = FormStatus.pure, |     super.status = FormStatus.pure, | ||||||
|     super.errorMessage, |     super.errorMessage, | ||||||
|   }); |   }); | ||||||
|  |   FormInputValidator<String?, ValidationError> get email => | ||||||
|  |       form.validatorOf(AuthFormField.email); | ||||||
|  |   FormInputValidator<String?, ValidationError> get password => | ||||||
|  |       form.validatorOf(AuthFormField.password); | ||||||
| 
 | 
 | ||||||
|   SignInState copyWith({ |   SignInState copyWith({ | ||||||
|     WyattForm? form, |     WyattForm? form, | ||||||
|  | |||||||
| @ -25,9 +25,6 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| part 'sign_up_state.dart'; | part 'sign_up_state.dart'; | ||||||
| 
 | 
 | ||||||
| class SignUpCubit<Extra> extends FormDataCubit<SignUpState> { | class SignUpCubit<Extra> extends FormDataCubit<SignUpState> { | ||||||
|   final AuthenticationRepository<Extra> _authenticationRepository; |  | ||||||
|   FormRepository get _formRepository => |  | ||||||
|       _authenticationRepository.formRepository; |  | ||||||
| 
 | 
 | ||||||
|   SignUpCubit({ |   SignUpCubit({ | ||||||
|     required AuthenticationRepository<Extra> authenticationRepository, |     required AuthenticationRepository<Extra> authenticationRepository, | ||||||
| @ -38,6 +35,9 @@ class SignUpCubit<Extra> extends FormDataCubit<SignUpState> { | |||||||
|                 .accessForm(AuthFormName.signUpForm), |                 .accessForm(AuthFormName.signUpForm), | ||||||
|           ), |           ), | ||||||
|         ); |         ); | ||||||
|  |   final AuthenticationRepository<Extra> _authenticationRepository; | ||||||
|  |   FormRepository get _formRepository => | ||||||
|  |       _authenticationRepository.formRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String get formName => AuthFormName.signUpForm; |   String get formName => AuthFormName.signUpForm; | ||||||
|  | |||||||
| @ -17,16 +17,16 @@ | |||||||
| part of 'sign_up_cubit.dart'; | part of 'sign_up_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| class SignUpState extends FormDataState { | class SignUpState extends FormDataState { | ||||||
|   FormInputValidator<String?, ValidationError> get email => |  | ||||||
|       form.validatorOf(AuthFormField.email); |  | ||||||
|   FormInputValidator<String?, ValidationError> get password => |  | ||||||
|       form.validatorOf(AuthFormField.password); |  | ||||||
| 
 | 
 | ||||||
|   const SignUpState({ |   const SignUpState({ | ||||||
|     required super.form, |     required super.form, | ||||||
|     super.status = FormStatus.pure, |     super.status = FormStatus.pure, | ||||||
|     super.errorMessage, |     super.errorMessage, | ||||||
|   }); |   }); | ||||||
|  |   FormInputValidator<String?, ValidationError> get email => | ||||||
|  |       form.validatorOf(AuthFormField.email); | ||||||
|  |   FormInputValidator<String?, ValidationError> get password => | ||||||
|  |       form.validatorOf(AuthFormField.password); | ||||||
| 
 | 
 | ||||||
|   SignUpState copyWith({ |   SignUpState copyWith({ | ||||||
|     WyattForm? form, |     WyattForm? form, | ||||||
|  | |||||||
| @ -24,14 +24,14 @@ import 'package:wyatt_crud_bloc/src/domain/entities/query.dart'; | |||||||
| 
 | 
 | ||||||
| class CrudInMemoryDataSourceImpl<Model extends ObjectModel> | class CrudInMemoryDataSourceImpl<Model extends ObjectModel> | ||||||
|     extends CrudDataSource<Model> { |     extends CrudDataSource<Model> { | ||||||
|  | 
 | ||||||
|  |   CrudInMemoryDataSourceImpl({required this.toMap, Map<String, Model>? data}) | ||||||
|  |       : _data = data ?? {}; | ||||||
|   final Map<String, Model> _data; |   final Map<String, Model> _data; | ||||||
|   final StreamController<List<Model?>> _streamData = StreamController(); |   final StreamController<List<Model?>> _streamData = StreamController(); | ||||||
| 
 | 
 | ||||||
|   final Map<String, Object?> Function(Model) toMap; |   final Map<String, Object?> Function(Model) toMap; | ||||||
| 
 | 
 | ||||||
|   CrudInMemoryDataSourceImpl({required this.toMap, Map<String, Model>? data}) |  | ||||||
|       : _data = data ?? {}; |  | ||||||
| 
 |  | ||||||
|   @override |   @override | ||||||
|   Future<void> create(Model object, {String? id}) async { |   Future<void> create(Model object, {String? id}) async { | ||||||
|     _data[id ?? object.id ?? ''] = object; |     _data[id ?? object.id ?? ''] = object; | ||||||
|  | |||||||
| @ -22,10 +22,6 @@ import 'package:wyatt_crud_bloc/src/domain/entities/query.dart'; | |||||||
| 
 | 
 | ||||||
| class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity> | class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity> | ||||||
|     extends CrudDataSource<Model> { |     extends CrudDataSource<Model> { | ||||||
|   final FirebaseFirestore _firestore; |  | ||||||
| 
 |  | ||||||
|   final Map<String, Object?> Function(Model, SetOptions?) _toFirestore; |  | ||||||
|   late CollectionReference<Model> _collectionReference; |  | ||||||
| 
 | 
 | ||||||
|   CrudFirestoreDataSourceImpl( |   CrudFirestoreDataSourceImpl( | ||||||
|     String collection, { |     String collection, { | ||||||
| @ -44,6 +40,10 @@ class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity> | |||||||
|               toFirestore: toFirestore, |               toFirestore: toFirestore, | ||||||
|             ); |             ); | ||||||
|   } |   } | ||||||
|  |   final FirebaseFirestore _firestore; | ||||||
|  | 
 | ||||||
|  |   final Map<String, Object?> Function(Model, SetOptions?) _toFirestore; | ||||||
|  |   late CollectionReference<Model> _collectionReference; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<void> create(Model object, {String? id}) { |   Future<void> create(Model object, {String? id}) { | ||||||
|  | |||||||
| @ -23,11 +23,11 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | |||||||
| 
 | 
 | ||||||
| class CrudRepositoryImpl<Model extends ObjectModel> | class CrudRepositoryImpl<Model extends ObjectModel> | ||||||
|     extends CrudRepository<Model> { |     extends CrudRepository<Model> { | ||||||
|   final CrudDataSource<Model> _crudDataSource; |  | ||||||
| 
 | 
 | ||||||
|   CrudRepositoryImpl({ |   CrudRepositoryImpl({ | ||||||
|     required CrudDataSource<Model> crudDataSource, |     required CrudDataSource<Model> crudDataSource, | ||||||
|   }) : _crudDataSource = crudDataSource; |   }) : _crudDataSource = crudDataSource; | ||||||
|  |   final CrudDataSource<Model> _crudDataSource; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<void> create(Model object, {String? id}) => |   FutureOrResult<void> create(Model object, {String? id}) => | ||||||
|  | |||||||
| @ -25,22 +25,22 @@ abstract class QueryParser<Q> { | |||||||
| abstract class QueryInterface extends Entity {} | abstract class QueryInterface extends Entity {} | ||||||
| 
 | 
 | ||||||
| class WhereQuery<Value> extends QueryInterface { | class WhereQuery<Value> extends QueryInterface { | ||||||
|  | 
 | ||||||
|  |   WhereQuery(this.type, this.field, this.value); | ||||||
|   final WhereQueryType type; |   final WhereQueryType type; | ||||||
|   final String field; |   final String field; | ||||||
|   final Value value; |   final Value value; | ||||||
| 
 |  | ||||||
|   WhereQuery(this.type, this.field, this.value); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class LimitQuery extends QueryInterface { | class LimitQuery extends QueryInterface { | ||||||
|   final int limit; |  | ||||||
| 
 | 
 | ||||||
|   LimitQuery(this.limit); |   LimitQuery(this.limit); | ||||||
|  |   final int limit; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class OrderByQuery extends QueryInterface { | class OrderByQuery extends QueryInterface { | ||||||
|   final String field; |  | ||||||
|   final bool ascending; |  | ||||||
| 
 | 
 | ||||||
|   OrderByQuery(this.field, {this.ascending = true}); |   OrderByQuery(this.field, {this.ascending = true}); | ||||||
|  |   final String field; | ||||||
|  |   final bool ascending; | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,9 +21,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart'; | |||||||
| import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | ||||||
| 
 | 
 | ||||||
| class Delete<Model extends ObjectModel> extends AsyncUseCase<String, void> { | class Delete<Model extends ObjectModel> extends AsyncUseCase<String, void> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   Delete(this._crudRepository); |   Delete(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOr<void> onStart(String? params) { |   FutureOr<void> onStart(String? params) { | ||||||
|  | |||||||
| @ -19,9 +19,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart'; | |||||||
| import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | ||||||
| 
 | 
 | ||||||
| class DeleteAll<Model extends ObjectModel> extends AsyncUseCase<void, void> { | class DeleteAll<Model extends ObjectModel> extends AsyncUseCase<void, void> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   DeleteAll(this._crudRepository); |   DeleteAll(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<void> execute(void params) => _crudRepository.deleteAll(); |   FutureOrResult<void> execute(void params) => _crudRepository.deleteAll(); | ||||||
|  | |||||||
| @ -21,9 +21,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart'; | |||||||
| import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | ||||||
| 
 | 
 | ||||||
| class Get<Model extends ObjectModel> extends AsyncUseCase<String, Model?> { | class Get<Model extends ObjectModel> extends AsyncUseCase<String, Model?> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   Get(this._crudRepository); |   Get(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOr<void> onStart(String? params) { |   FutureOr<void> onStart(String? params) { | ||||||
|  | |||||||
| @ -20,9 +20,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | |||||||
| 
 | 
 | ||||||
| class GetAll<Model extends ObjectModel> | class GetAll<Model extends ObjectModel> | ||||||
|     extends AsyncUseCase<void, List<Model?>> { |     extends AsyncUseCase<void, List<Model?>> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   GetAll(this._crudRepository); |   GetAll(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOrResult<List<Model?>> execute(void params) => _crudRepository.getAll(); |   FutureOrResult<List<Model?>> execute(void params) => _crudRepository.getAll(); | ||||||
|  | |||||||
| @ -23,9 +23,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | |||||||
| 
 | 
 | ||||||
| class Query<Model extends ObjectModel> | class Query<Model extends ObjectModel> | ||||||
|     extends AsyncUseCase<List<QueryInterface>, List<Model?>> { |     extends AsyncUseCase<List<QueryInterface>, List<Model?>> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   Query(this._crudRepository); |   Query(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOr<void> onStart(List<QueryInterface>? params) { |   FutureOr<void> onStart(List<QueryInterface>? params) { | ||||||
|  | |||||||
| @ -23,9 +23,9 @@ import 'package:wyatt_crud_bloc/src/domain/usecases/params/update_parameters.dar | |||||||
| 
 | 
 | ||||||
| class Update<Model extends ObjectModel> | class Update<Model extends ObjectModel> | ||||||
|     extends AsyncUseCase<UpdateParameters<Model>, void> { |     extends AsyncUseCase<UpdateParameters<Model>, void> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   Update(this._crudRepository); |   Update(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOr<void> onStart(UpdateParameters<Model>? params) { |   FutureOr<void> onStart(UpdateParameters<Model>? params) { | ||||||
|  | |||||||
| @ -22,9 +22,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart'; | |||||||
| 
 | 
 | ||||||
| class UpdateAll<Model extends ObjectModel> | class UpdateAll<Model extends ObjectModel> | ||||||
|     extends AsyncUseCase<Map<String, Object?>, void> { |     extends AsyncUseCase<Map<String, Object?>, void> { | ||||||
|   final CrudRepository<Model> _crudRepository; |  | ||||||
| 
 | 
 | ||||||
|   UpdateAll(this._crudRepository); |   UpdateAll(this._crudRepository); | ||||||
|  |   final CrudRepository<Model> _crudRepository; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   FutureOr<void> onStart(Map<String, Object?>? params) { |   FutureOr<void> onStart(Map<String, Object?>? params) { | ||||||
|  | |||||||
| @ -35,6 +35,8 @@ import 'package:wyatt_crud_bloc/src/domain/usecases/update_all.dart'; | |||||||
| part 'crud_state.dart'; | part 'crud_state.dart'; | ||||||
| 
 | 
 | ||||||
| abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> { | abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> { | ||||||
|  | 
 | ||||||
|  |   CrudCubit() : super(CrudInitial()); | ||||||
|   Create<Model>? get crudCreate; |   Create<Model>? get crudCreate; | ||||||
|   DeleteAll<Model>? get crudDeleteAll; |   DeleteAll<Model>? get crudDeleteAll; | ||||||
|   Delete<Model>? get crudDelete; |   Delete<Model>? get crudDelete; | ||||||
| @ -44,8 +46,6 @@ abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> { | |||||||
|   UpdateAll<Model>? get crudUpdateAll; |   UpdateAll<Model>? get crudUpdateAll; | ||||||
|   Update<Model>? get crudUpdate; |   Update<Model>? get crudUpdate; | ||||||
| 
 | 
 | ||||||
|   CrudCubit() : super(CrudInitial()); |  | ||||||
| 
 |  | ||||||
|   FutureOr<void> create(Model model) async { |   FutureOr<void> create(Model model) async { | ||||||
|     if (crudCreate != null) { |     if (crudCreate != null) { | ||||||
|       final stateCopy = state; |       final stateCopy = state; | ||||||
|  | |||||||
| @ -36,27 +36,27 @@ class CrudOkReturn extends CrudState { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class CrudError extends CrudState { | class CrudError extends CrudState { | ||||||
|   final String? message; |  | ||||||
| 
 | 
 | ||||||
|   const CrudError(this.message); |   const CrudError(this.message); | ||||||
|  |   final String? message; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object?> get props => [message]; |   List<Object?> get props => [message]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class CrudLoaded<T> extends CrudSuccess { | class CrudLoaded<T> extends CrudSuccess { | ||||||
|   final T? data; |  | ||||||
| 
 | 
 | ||||||
|   const CrudLoaded(this.data); |   const CrudLoaded(this.data); | ||||||
|  |   final T? data; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object?> get props => [data]; |   List<Object?> get props => [data]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class CrudListLoaded<T> extends CrudSuccess { | class CrudListLoaded<T> extends CrudSuccess { | ||||||
|   final List<T?> data; |  | ||||||
| 
 | 
 | ||||||
|   const CrudListLoaded(this.data); |   const CrudListLoaded(this.data); | ||||||
|  |   final List<T?> data; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List<Object> get props => [data]; |   List<Object> get props => [data]; | ||||||
|  | |||||||
| @ -26,15 +26,6 @@ import 'package:wyatt_form_bloc/src/domain/input_validators/form_input_validator | |||||||
| 
 | 
 | ||||||
| // ignore: must_be_immutable | // ignore: must_be_immutable | ||||||
| class WyattFormImpl extends WyattForm { | class WyattFormImpl extends WyattForm { | ||||||
|   final List< |  | ||||||
|       FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, |  | ||||||
|           dynamic>> _inputs; |  | ||||||
|   final FormValidator _validator; |  | ||||||
|   final String _name; |  | ||||||
| 
 |  | ||||||
|   late List< |  | ||||||
|       FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, |  | ||||||
|           dynamic>> _inputsInitial; |  | ||||||
| 
 | 
 | ||||||
|   WyattFormImpl( |   WyattFormImpl( | ||||||
|     this._inputs, { |     this._inputs, { | ||||||
| @ -44,6 +35,15 @@ class WyattFormImpl extends WyattForm { | |||||||
|         _validator = validationStrategy { |         _validator = validationStrategy { | ||||||
|     _inputsInitial = _inputs.map((input) => input.clone()).toList(); |     _inputsInitial = _inputs.map((input) => input.clone()).toList(); | ||||||
|   } |   } | ||||||
|  |   final List< | ||||||
|  |       FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, | ||||||
|  |           dynamic>> _inputs; | ||||||
|  |   final FormValidator _validator; | ||||||
|  |   final String _name; | ||||||
|  | 
 | ||||||
|  |   late List< | ||||||
|  |       FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, | ||||||
|  |           dynamic>> _inputsInitial; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   List< |   List< | ||||||
|  | |||||||
| @ -17,6 +17,12 @@ | |||||||
| part of 'form_data_cubit.dart'; | part of 'form_data_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| abstract class FormDataState extends Equatable { | abstract class FormDataState extends Equatable { | ||||||
|  | 
 | ||||||
|  |   const FormDataState({ | ||||||
|  |     required this.form, | ||||||
|  |     this.status = FormStatus.pure, | ||||||
|  |     this.errorMessage, | ||||||
|  |   }); | ||||||
|   /// Global status of a form. |   /// Global status of a form. | ||||||
|   final FormStatus status; |   final FormStatus status; | ||||||
| 
 | 
 | ||||||
| @ -26,12 +32,6 @@ abstract class FormDataState extends Equatable { | |||||||
|   /// Optional error message. |   /// Optional error message. | ||||||
|   final String? errorMessage; |   final String? errorMessage; | ||||||
| 
 | 
 | ||||||
|   const FormDataState({ |  | ||||||
|     required this.form, |  | ||||||
|     this.status = FormStatus.pure, |  | ||||||
|     this.errorMessage, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   @override |   @override | ||||||
|   List<Object?> get props => [status, form, errorMessage]; |   List<Object?> get props => [status, form, errorMessage]; | ||||||
| } | } | ||||||
|  | |||||||
| @ -27,11 +27,11 @@ import 'package:wyatt_form_bloc/src/presentation/features/form_data/form_data_cu | |||||||
| part 'form_data_state_impl.dart'; | part 'form_data_state_impl.dart'; | ||||||
| 
 | 
 | ||||||
| abstract class FormDataCubitImpl extends FormDataCubit<FormDataStateImpl> { | abstract class FormDataCubitImpl extends FormDataCubit<FormDataStateImpl> { | ||||||
|   final FormRepository _formRepository; |  | ||||||
|   final String _formName; |  | ||||||
| 
 | 
 | ||||||
|   FormDataCubitImpl(this._formRepository, this._formName) |   FormDataCubitImpl(this._formRepository, this._formName) | ||||||
|       : super(FormDataStateImpl(form: _formRepository.accessForm(_formName))); |       : super(FormDataStateImpl(form: _formRepository.accessForm(_formName))); | ||||||
|  |   final FormRepository _formRepository; | ||||||
|  |   final String _formName; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String get formName => _formName; |   String get formName => _formName; | ||||||
|  | |||||||
| @ -115,7 +115,7 @@ Future<void> server() async { | |||||||
|   final server = await HttpServer.bind(InternetAddress.anyIPv6, 8080); |   final server = await HttpServer.bind(InternetAddress.anyIPv6, 8080); | ||||||
|   var error = 0; |   var error = 0; | ||||||
|   var token = 0; |   var token = 0; | ||||||
|   await server.forEach((HttpRequest request) { |   await server.forEach((request) { | ||||||
|     print('[${request.method}] ${request.uri}'); |     print('[${request.method}] ${request.uri}'); | ||||||
|     switch (request.uri.path) { |     switch (request.uri.path) { | ||||||
|       case '/test/basic-test': |       case '/test/basic-test': | ||||||
| @ -196,7 +196,7 @@ Future<void> server() async { | |||||||
| 
 | 
 | ||||||
| Future<void> main() async { | Future<void> main() async { | ||||||
|   unawaited(server()); |   unawaited(server()); | ||||||
|   final base = 'localhost:8080'; |   const base = 'localhost:8080'; | ||||||
|   final uriPrefix = UriPrefixMiddleware( |   final uriPrefix = UriPrefixMiddleware( | ||||||
|     protocol: Protocols.http, |     protocol: Protocols.http, | ||||||
|     authority: base, |     authority: base, | ||||||
|  | |||||||
| @ -31,20 +31,16 @@ enum EmailVerificationAction { | |||||||
|   resetPassword, |   resetPassword, | ||||||
|   changeEmail; |   changeEmail; | ||||||
| 
 | 
 | ||||||
|   String toSnakeCase() { |   String toSnakeCase() => name.splitMapJoin( | ||||||
|     return name.splitMapJoin( |  | ||||||
|       RegExp('[A-Z]'), |       RegExp('[A-Z]'), | ||||||
|       onMatch: (m) => '_${m[0]?.toLowerCase()}', |       onMatch: (m) => '_${m[0]?.toLowerCase()}', | ||||||
|       onNonMatch: (n) => n, |       onNonMatch: (n) => n, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory EmailVerificationAction.fromString(String str) { |   factory EmailVerificationAction.fromString(String str) => EmailVerificationAction.values.firstWhere( | ||||||
|     return EmailVerificationAction.values.firstWhere( |       (element) => element.toSnakeCase() == str, | ||||||
|       (EmailVerificationAction element) => element.toSnakeCase() == str, |  | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| class VerifyCode { | class VerifyCode { | ||||||
|   final String email; |   final String email; | ||||||
| @ -60,29 +56,23 @@ class VerifyCode { | |||||||
|     String? email, |     String? email, | ||||||
|     String? verificationCode, |     String? verificationCode, | ||||||
|     EmailVerificationAction? action, |     EmailVerificationAction? action, | ||||||
|   }) { |   }) => VerifyCode( | ||||||
|     return VerifyCode( |  | ||||||
|       email: email ?? this.email, |       email: email ?? this.email, | ||||||
|       verificationCode: verificationCode ?? this.verificationCode, |       verificationCode: verificationCode ?? this.verificationCode, | ||||||
|       action: action ?? this.action, |       action: action ?? this.action, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Map<String, dynamic> toMap() { |   Map<String, dynamic> toMap() => <String, dynamic>{ | ||||||
|     return <String, dynamic>{ |  | ||||||
|       'email': email, |       'email': email, | ||||||
|       'verification_code': verificationCode, |       'verification_code': verificationCode, | ||||||
|       'action': action.toSnakeCase(), |       'action': action.toSnakeCase(), | ||||||
|     }; |     }; | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory VerifyCode.fromMap(Map<String, dynamic> map) { |   factory VerifyCode.fromMap(Map<String, dynamic> map) => VerifyCode( | ||||||
|     return VerifyCode( |  | ||||||
|       email: map['email'] as String, |       email: map['email'] as String, | ||||||
|       verificationCode: map['verification_code'] as String, |       verificationCode: map['verification_code'] as String, | ||||||
|       action: EmailVerificationAction.fromString(map['action'] as String), |       action: EmailVerificationAction.fromString(map['action'] as String), | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String toJson() => json.encode(toMap()); |   String toJson() => json.encode(toMap()); | ||||||
| 
 | 
 | ||||||
| @ -105,26 +95,20 @@ class Account { | |||||||
|   Account copyWith({ |   Account copyWith({ | ||||||
|     String? email, |     String? email, | ||||||
|     String? sessionId, |     String? sessionId, | ||||||
|   }) { |   }) => Account( | ||||||
|     return Account( |  | ||||||
|       email: email ?? this.email, |       email: email ?? this.email, | ||||||
|       sessionId: sessionId ?? this.sessionId, |       sessionId: sessionId ?? this.sessionId, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Map<String, dynamic> toMap() { |   Map<String, dynamic> toMap() => <String, dynamic>{ | ||||||
|     return <String, dynamic>{ |  | ||||||
|       'email': email, |       'email': email, | ||||||
|       'session_id': sessionId, |       'session_id': sessionId, | ||||||
|     }; |     }; | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory Account.fromMap(Map<String, dynamic> map) { |   factory Account.fromMap(Map<String, dynamic> map) => Account( | ||||||
|     return Account( |  | ||||||
|       email: map['email'] as String, |       email: map['email'] as String, | ||||||
|       sessionId: map['session_id'] != null ? map['session_id'] as String : null, |       sessionId: map['session_id'] != null ? map['session_id'] as String : null, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String toJson() => json.encode(toMap()); |   String toJson() => json.encode(toMap()); | ||||||
| 
 | 
 | ||||||
| @ -146,26 +130,20 @@ class SignUp { | |||||||
|   SignUp copyWith({ |   SignUp copyWith({ | ||||||
|     String? sessionId, |     String? sessionId, | ||||||
|     String? password, |     String? password, | ||||||
|   }) { |   }) => SignUp( | ||||||
|     return SignUp( |  | ||||||
|       sessionId: sessionId ?? this.sessionId, |       sessionId: sessionId ?? this.sessionId, | ||||||
|       password: password ?? this.password, |       password: password ?? this.password, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Map<String, dynamic> toMap() { |   Map<String, dynamic> toMap() => <String, dynamic>{ | ||||||
|     return <String, dynamic>{ |  | ||||||
|       'session_id': sessionId, |       'session_id': sessionId, | ||||||
|       'password': password, |       'password': password, | ||||||
|     }; |     }; | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory SignUp.fromMap(Map<String, dynamic> map) { |   factory SignUp.fromMap(Map<String, dynamic> map) => SignUp( | ||||||
|     return SignUp( |  | ||||||
|       sessionId: map['session_id'] as String, |       sessionId: map['session_id'] as String, | ||||||
|       password: map['password'] as String, |       password: map['password'] as String, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String toJson() => json.encode(toMap()); |   String toJson() => json.encode(toMap()); | ||||||
| 
 | 
 | ||||||
| @ -190,29 +168,23 @@ class TokenSuccess { | |||||||
|     String? accessToken, |     String? accessToken, | ||||||
|     String? refreshToken, |     String? refreshToken, | ||||||
|     Account? account, |     Account? account, | ||||||
|   }) { |   }) => TokenSuccess( | ||||||
|     return TokenSuccess( |  | ||||||
|       accessToken: accessToken ?? this.accessToken, |       accessToken: accessToken ?? this.accessToken, | ||||||
|       refreshToken: refreshToken ?? this.refreshToken, |       refreshToken: refreshToken ?? this.refreshToken, | ||||||
|       account: account ?? this.account, |       account: account ?? this.account, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Map<String, dynamic> toMap() { |   Map<String, dynamic> toMap() => <String, dynamic>{ | ||||||
|     return <String, dynamic>{ |  | ||||||
|       'access_token': accessToken, |       'access_token': accessToken, | ||||||
|       'refresh_token': refreshToken, |       'refresh_token': refreshToken, | ||||||
|       'account': account.toMap(), |       'account': account.toMap(), | ||||||
|     }; |     }; | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory TokenSuccess.fromMap(Map<String, dynamic> map) { |   factory TokenSuccess.fromMap(Map<String, dynamic> map) => TokenSuccess( | ||||||
|     return TokenSuccess( |  | ||||||
|       accessToken: map['access_token'] as String, |       accessToken: map['access_token'] as String, | ||||||
|       refreshToken: map['refresh_token'] as String, |       refreshToken: map['refresh_token'] as String, | ||||||
|       account: Account.fromMap(map['account'] as Map<String, dynamic>), |       account: Account.fromMap(map['account'] as Map<String, dynamic>), | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String toJson() => json.encode(toMap()); |   String toJson() => json.encode(toMap()); | ||||||
| 
 | 
 | ||||||
| @ -235,26 +207,20 @@ class Login { | |||||||
|   Login copyWith({ |   Login copyWith({ | ||||||
|     String? email, |     String? email, | ||||||
|     String? password, |     String? password, | ||||||
|   }) { |   }) => Login( | ||||||
|     return Login( |  | ||||||
|       email: email ?? this.email, |       email: email ?? this.email, | ||||||
|       password: password ?? this.password, |       password: password ?? this.password, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Map<String, dynamic> toMap() { |   Map<String, dynamic> toMap() => <String, dynamic>{ | ||||||
|     return <String, dynamic>{ |  | ||||||
|       'email': email, |       'email': email, | ||||||
|       'password': password, |       'password': password, | ||||||
|     }; |     }; | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory Login.fromMap(Map<String, dynamic> map) { |   factory Login.fromMap(Map<String, dynamic> map) => Login( | ||||||
|     return Login( |  | ||||||
|       email: map['email'] as String, |       email: map['email'] as String, | ||||||
|       password: map['password'] as String, |       password: map['password'] as String, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String toJson() => json.encode(toMap()); |   String toJson() => json.encode(toMap()); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,8 +25,6 @@ import 'package:wyatt_http_client/src/pipeline.dart'; | |||||||
| import 'package:wyatt_http_client/src/utils/http_methods.dart'; | import 'package:wyatt_http_client/src/utils/http_methods.dart'; | ||||||
| 
 | 
 | ||||||
| class MiddlewareClient extends BaseClient { | class MiddlewareClient extends BaseClient { | ||||||
|   final Client inner; |  | ||||||
|   final Pipeline pipeline; |  | ||||||
| 
 | 
 | ||||||
|   MiddlewareClient({ |   MiddlewareClient({ | ||||||
|     Pipeline? pipeline, |     Pipeline? pipeline, | ||||||
| @ -35,6 +33,8 @@ class MiddlewareClient extends BaseClient { | |||||||
|         inner = inner ?? Client() { |         inner = inner ?? Client() { | ||||||
|     print('Using Pipeline:\n$pipeline'); |     print('Using Pipeline:\n$pipeline'); | ||||||
|   } |   } | ||||||
|  |   final Client inner; | ||||||
|  |   final Pipeline pipeline; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<Response> head(Uri url, {Map<String, String>? headers}) => |   Future<Response> head(Uri url, {Map<String, String>? headers}) => | ||||||
| @ -81,9 +81,7 @@ class MiddlewareClient extends BaseClient { | |||||||
|       _sendUnstreamed(HttpMethods.delete.method, url, headers, body, encoding); |       _sendUnstreamed(HttpMethods.delete.method, url, headers, body, encoding); | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<StreamedResponse> send(BaseRequest request) { |   Future<StreamedResponse> send(BaseRequest request) => inner.send(request); | ||||||
|     return inner.send(request); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   Future<Response> _sendUnstreamed( |   Future<Response> _sendUnstreamed( | ||||||
|     String method, |     String method, | ||||||
|  | |||||||
| @ -23,15 +23,15 @@ import 'package:wyatt_http_client/src/utils/authentication_methods.dart'; | |||||||
| import 'package:wyatt_http_client/src/utils/header_keys.dart'; | import 'package:wyatt_http_client/src/utils/header_keys.dart'; | ||||||
| 
 | 
 | ||||||
| class BasicAuthMiddleware with OnRequestMiddleware implements Middleware { | class BasicAuthMiddleware with OnRequestMiddleware implements Middleware { | ||||||
|   String? username; |  | ||||||
|   String? password; |  | ||||||
|   final String authenticationHeader; |  | ||||||
| 
 | 
 | ||||||
|   BasicAuthMiddleware({ |   BasicAuthMiddleware({ | ||||||
|     this.username, |     this.username, | ||||||
|     this.password, |     this.password, | ||||||
|     this.authenticationHeader = HeaderKeys.authorization, |     this.authenticationHeader = HeaderKeys.authorization, | ||||||
|   }); |   }); | ||||||
|  |   String? username; | ||||||
|  |   String? password; | ||||||
|  |   final String authenticationHeader; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String getName() => 'BasicAuth'; |   String getName() => 'BasicAuth'; | ||||||
|  | |||||||
| @ -25,12 +25,6 @@ import 'package:wyatt_http_client/src/utils/http_status.dart'; | |||||||
| class DigestAuthMiddleware | class DigestAuthMiddleware | ||||||
|     with OnRequestMiddleware, OnResponseMiddleware |     with OnRequestMiddleware, OnResponseMiddleware | ||||||
|     implements Middleware { |     implements Middleware { | ||||||
|   final String username; |  | ||||||
|   final String password; |  | ||||||
|   final DigestAuth _digestAuth; |  | ||||||
|   final String authenticationHeader; |  | ||||||
|   final String wwwAuthenticateHeader; |  | ||||||
|   final HttpStatus unauthorized; |  | ||||||
| 
 | 
 | ||||||
|   DigestAuthMiddleware({ |   DigestAuthMiddleware({ | ||||||
|     required this.username, |     required this.username, | ||||||
| @ -39,6 +33,12 @@ class DigestAuthMiddleware | |||||||
|     this.wwwAuthenticateHeader = HeaderKeys.wwwAuthenticate, |     this.wwwAuthenticateHeader = HeaderKeys.wwwAuthenticate, | ||||||
|     this.unauthorized = HttpStatus.unauthorized, |     this.unauthorized = HttpStatus.unauthorized, | ||||||
|   }) : _digestAuth = DigestAuth(username, password); |   }) : _digestAuth = DigestAuth(username, password); | ||||||
|  |   final String username; | ||||||
|  |   final String password; | ||||||
|  |   final DigestAuth _digestAuth; | ||||||
|  |   final String authenticationHeader; | ||||||
|  |   final String wwwAuthenticateHeader; | ||||||
|  |   final HttpStatus unauthorized; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String getName() => 'DigestAuth'; |   String getName() => 'DigestAuth'; | ||||||
|  | |||||||
| @ -31,6 +31,17 @@ typedef TokenParser = String Function(Map<String, dynamic>); | |||||||
| class RefreshTokenAuthMiddleware | class RefreshTokenAuthMiddleware | ||||||
|     with OnRequestMiddleware, OnResponseMiddleware |     with OnRequestMiddleware, OnResponseMiddleware | ||||||
|     implements Middleware { |     implements Middleware { | ||||||
|  | 
 | ||||||
|  |   RefreshTokenAuthMiddleware({ | ||||||
|  |     required this.authorizationEndpoint, | ||||||
|  |     required this.tokenEndpoint, | ||||||
|  |     required this.accessTokenParser, | ||||||
|  |     required this.refreshTokenParser, | ||||||
|  |     this.authenticationHeader = HeaderKeys.authorization, | ||||||
|  |     this.authenticationMethod = AuthenticationMethods.bearer, | ||||||
|  |     this.unauthorized = HttpStatus.unauthorized, | ||||||
|  |     this.maxAttempts = 8, | ||||||
|  |   }); | ||||||
|   final String authorizationEndpoint; |   final String authorizationEndpoint; | ||||||
|   final String tokenEndpoint; |   final String tokenEndpoint; | ||||||
| 
 | 
 | ||||||
| @ -44,17 +55,6 @@ class RefreshTokenAuthMiddleware | |||||||
|   final HttpStatus unauthorized; |   final HttpStatus unauthorized; | ||||||
|   final int maxAttempts; |   final int maxAttempts; | ||||||
| 
 | 
 | ||||||
|   RefreshTokenAuthMiddleware({ |  | ||||||
|     required this.authorizationEndpoint, |  | ||||||
|     required this.tokenEndpoint, |  | ||||||
|     required this.accessTokenParser, |  | ||||||
|     required this.refreshTokenParser, |  | ||||||
|     this.authenticationHeader = HeaderKeys.authorization, |  | ||||||
|     this.authenticationMethod = AuthenticationMethods.bearer, |  | ||||||
|     this.unauthorized = HttpStatus.unauthorized, |  | ||||||
|     this.maxAttempts = 8, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   @override |   @override | ||||||
|   String getName() => 'RefreshToken'; |   String getName() => 'RefreshToken'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,11 +20,6 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart'; | |||||||
| import 'package:wyatt_http_client/src/utils/convert.dart'; | import 'package:wyatt_http_client/src/utils/convert.dart'; | ||||||
| 
 | 
 | ||||||
| class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware { | class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware { | ||||||
|   String? username; |  | ||||||
|   String? password; |  | ||||||
| 
 |  | ||||||
|   final String usernameField; |  | ||||||
|   final String passwordField; |  | ||||||
| 
 | 
 | ||||||
|   UnsafeAuthMiddleware({ |   UnsafeAuthMiddleware({ | ||||||
|     this.username, |     this.username, | ||||||
| @ -32,6 +27,11 @@ class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware { | |||||||
|     this.usernameField = 'username', |     this.usernameField = 'username', | ||||||
|     this.passwordField = 'password', |     this.passwordField = 'password', | ||||||
|   }); |   }); | ||||||
|  |   String? username; | ||||||
|  |   String? password; | ||||||
|  | 
 | ||||||
|  |   final String usernameField; | ||||||
|  |   final String passwordField; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String getName() => 'UnsafeAuth'; |   String getName() => 'UnsafeAuth'; | ||||||
|  | |||||||
| @ -20,13 +20,13 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart'; | |||||||
| import 'package:wyatt_http_client/src/utils/protocols.dart'; | import 'package:wyatt_http_client/src/utils/protocols.dart'; | ||||||
| 
 | 
 | ||||||
| class UriPrefixMiddleware with OnRequestMiddleware implements Middleware { | class UriPrefixMiddleware with OnRequestMiddleware implements Middleware { | ||||||
|   final Protocols protocol; |  | ||||||
|   final String? authority; |  | ||||||
| 
 | 
 | ||||||
|   UriPrefixMiddleware({ |   UriPrefixMiddleware({ | ||||||
|     required this.protocol, |     required this.protocol, | ||||||
|     required this.authority, |     required this.authority, | ||||||
|   }); |   }); | ||||||
|  |   final Protocols protocol; | ||||||
|  |   final String? authority; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String getName() => 'UriPrefix'; |   String getName() => 'UriPrefix'; | ||||||
|  | |||||||
| @ -44,8 +44,7 @@ class MiddlewareContext { | |||||||
|     MiddlewareRequest? lastRequest, |     MiddlewareRequest? lastRequest, | ||||||
|     MiddlewareResponse? originalResponse, |     MiddlewareResponse? originalResponse, | ||||||
|     MiddlewareResponse? lastResponse, |     MiddlewareResponse? lastResponse, | ||||||
|   }) { |   }) => MiddlewareContext( | ||||||
|     return MiddlewareContext( |  | ||||||
|       pipeline: pipeline ?? this.pipeline, |       pipeline: pipeline ?? this.pipeline, | ||||||
|       client: client ?? this.client, |       client: client ?? this.client, | ||||||
|       originalRequest: originalRequest ?? this.originalRequest, |       originalRequest: originalRequest ?? this.originalRequest, | ||||||
| @ -53,10 +52,7 @@ class MiddlewareContext { | |||||||
|       originalResponse: originalResponse ?? this.originalResponse, |       originalResponse: originalResponse ?? this.originalResponse, | ||||||
|       lastResponse: lastResponse ?? this.lastResponse, |       lastResponse: lastResponse ?? this.lastResponse, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() => 'MiddlewareContext(pipeline: $pipeline, client: $client, originalRequest: $originalRequest, lastRequest: $lastRequest, originalResponse: $originalResponse, lastResponse: $lastResponse)'; | ||||||
|     return 'MiddlewareContext(pipeline: $pipeline, client: $client, originalRequest: $originalRequest, lastRequest: $lastRequest, originalResponse: $originalResponse, lastResponse: $lastResponse)'; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -42,22 +42,21 @@ class MiddlewareRequest { | |||||||
| 
 | 
 | ||||||
|   MiddlewareRequest copyWith({ |   MiddlewareRequest copyWith({ | ||||||
|     UnfreezedRequest? unfreezedRequest, |     UnfreezedRequest? unfreezedRequest, | ||||||
|   }) { |   }) => | ||||||
|     return MiddlewareRequest( |       MiddlewareRequest( | ||||||
|         unfreezedRequest: unfreezedRequest ?? this.unfreezedRequest, |         unfreezedRequest: unfreezedRequest ?? this.unfreezedRequest, | ||||||
|       ); |       ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   void modifyRequest(UnfreezedRequest unfreezedRequest) { |   void modifyRequest(UnfreezedRequest unfreezedRequest) { | ||||||
|     String? _body; |     String? body; | ||||||
|     if (unfreezedRequest.body != null) { |     if (unfreezedRequest.body != null) { | ||||||
|       final body = unfreezedRequest.body; |       var body = unfreezedRequest.body; | ||||||
|       if (body is String) { |       if (body is String) { | ||||||
|         _body = body; |         body = body; | ||||||
|       } else if (body is List) { |       } else if (body is List) { | ||||||
|         _body = String.fromCharCodes(body.cast<int>()); |         body = String.fromCharCodes(body.cast<int>()); | ||||||
|       } else if (body is Map) { |       } else if (body is Map) { | ||||||
|         _body = Convert.mapToQuery(body.cast<String, String>()); |         body = Convert.mapToQuery(body.cast<String, String>()); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     _httpRequest = RequestUtils.copyRequestWith( |     _httpRequest = RequestUtils.copyRequestWith( | ||||||
| @ -65,7 +64,7 @@ class MiddlewareRequest { | |||||||
|       method: unfreezedRequest.method, |       method: unfreezedRequest.method, | ||||||
|       url: unfreezedRequest.url, |       url: unfreezedRequest.url, | ||||||
|       headers: unfreezedRequest.headers, |       headers: unfreezedRequest.headers, | ||||||
|       body: _body, |       body: body, | ||||||
|     ) as Request; |     ) as Request; | ||||||
|     if (unfreezedRequest.encoding != null) { |     if (unfreezedRequest.encoding != null) { | ||||||
|       _httpRequest.encoding = unfreezedRequest.encoding!; |       _httpRequest.encoding = unfreezedRequest.encoding!; | ||||||
|  | |||||||
| @ -40,11 +40,9 @@ class MiddlewareResponse { | |||||||
| 
 | 
 | ||||||
|   MiddlewareResponse copyWith({ |   MiddlewareResponse copyWith({ | ||||||
|     BaseResponse? httpResponse, |     BaseResponse? httpResponse, | ||||||
|   }) { |   }) => MiddlewareResponse( | ||||||
|     return MiddlewareResponse( |  | ||||||
|       httpResponse: httpResponse ?? this.httpResponse, |       httpResponse: httpResponse ?? this.httpResponse, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() => |   String toString() => | ||||||
|  | |||||||
| @ -17,11 +17,6 @@ | |||||||
| import 'dart:convert'; | import 'dart:convert'; | ||||||
| 
 | 
 | ||||||
| class UnfreezedRequest { | class UnfreezedRequest { | ||||||
|   final String method; |  | ||||||
|   final Uri url; |  | ||||||
|   final Map<String, String>? headers; |  | ||||||
|   final Object? body; |  | ||||||
|   final Encoding? encoding; |  | ||||||
| 
 | 
 | ||||||
|   UnfreezedRequest({ |   UnfreezedRequest({ | ||||||
|     required this.method, |     required this.method, | ||||||
| @ -30,6 +25,11 @@ class UnfreezedRequest { | |||||||
|     this.body, |     this.body, | ||||||
|     this.encoding, |     this.encoding, | ||||||
|   }); |   }); | ||||||
|  |   final String method; | ||||||
|  |   final Uri url; | ||||||
|  |   final Map<String, String>? headers; | ||||||
|  |   final Object? body; | ||||||
|  |   final Encoding? encoding; | ||||||
| 
 | 
 | ||||||
|   UnfreezedRequest copyWith({ |   UnfreezedRequest copyWith({ | ||||||
|     String? method, |     String? method, | ||||||
| @ -37,19 +37,15 @@ class UnfreezedRequest { | |||||||
|     Map<String, String>? headers, |     Map<String, String>? headers, | ||||||
|     Object? body, |     Object? body, | ||||||
|     Encoding? encoding, |     Encoding? encoding, | ||||||
|   }) { |   }) => UnfreezedRequest( | ||||||
|     return UnfreezedRequest( |  | ||||||
|       method: method ?? this.method, |       method: method ?? this.method, | ||||||
|       url: url ?? this.url, |       url: url ?? this.url, | ||||||
|       headers: headers ?? this.headers, |       headers: headers ?? this.headers, | ||||||
|       body: body ?? this.body, |       body: body ?? this.body, | ||||||
|       encoding: encoding ?? this.encoding, |       encoding: encoding ?? this.encoding, | ||||||
|     ); |     ); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() => 'UnfreezedRequest(method: $method, url: $url, headers: ' | ||||||
|     return 'UnfreezedRequest(method: $method, url: $url, headers: ' |  | ||||||
|         '$headers, body: $body, encoding: $encoding)'; |         '$headers, body: $body, encoding: $encoding)'; | ||||||
| } | } | ||||||
| } |  | ||||||
|  | |||||||
| @ -20,13 +20,13 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart'; | |||||||
| import 'package:wyatt_http_client/src/models/middleware_response.dart'; | import 'package:wyatt_http_client/src/models/middleware_response.dart'; | ||||||
| 
 | 
 | ||||||
| class Pipeline { | class Pipeline { | ||||||
|   final List<Middleware> _middlewares; |  | ||||||
| 
 |  | ||||||
|   int get length => _middlewares.length; |  | ||||||
| 
 | 
 | ||||||
|   Pipeline() : _middlewares = <Middleware>[]; |   Pipeline() : _middlewares = <Middleware>[]; | ||||||
|   Pipeline.fromIterable(Iterable<Middleware> middlewares) |   Pipeline.fromIterable(Iterable<Middleware> middlewares) | ||||||
|       : _middlewares = middlewares.toList(); |       : _middlewares = middlewares.toList(); | ||||||
|  |   final List<Middleware> _middlewares; | ||||||
|  | 
 | ||||||
|  |   int get length => _middlewares.length; | ||||||
| 
 | 
 | ||||||
|   /// Add a [Middleware] to this [Pipeline] |   /// Add a [Middleware] to this [Pipeline] | ||||||
|   Pipeline addMiddleware(Middleware middleware) { |   Pipeline addMiddleware(Middleware middleware) { | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ class Convert { | |||||||
|     final buffer = StringBuffer(); |     final buffer = StringBuffer(); | ||||||
|     for (final int part in bytes) { |     for (final int part in bytes) { | ||||||
|       if (part & 0xff != part) { |       if (part & 0xff != part) { | ||||||
|         throw FormatException('Non-byte integer detected'); |         throw const FormatException('Non-byte integer detected'); | ||||||
|       } |       } | ||||||
|       buffer.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}'); |       buffer.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}'); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -21,8 +21,8 @@ import 'package:crypto/crypto.dart'; | |||||||
| class Crypto { | class Crypto { | ||||||
|   /// Hash a string using MD5 |   /// Hash a string using MD5 | ||||||
|   static String md5Hash(String data) { |   static String md5Hash(String data) { | ||||||
|     final content = Utf8Encoder().convert(data); |     final content = const Utf8Encoder().convert(data); | ||||||
|     final md5Crypto = md5; |     const md5Crypto = md5; | ||||||
|     final digest = md5Crypto.convert(content).toString(); |     final digest = md5Crypto.convert(content).toString(); | ||||||
|     return digest; |     return digest; | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -24,9 +24,9 @@ abstract class Delay { | |||||||
|       return Duration.zero; |       return Duration.zero; | ||||||
|     } |     } | ||||||
|     final rand = Random(); |     final rand = Random(); | ||||||
|     final Duration delayFactor = const Duration(milliseconds: 200); |     const Duration delayFactor = Duration(milliseconds: 200); | ||||||
|     final double randomizationFactor = 0.25; |     const double randomizationFactor = 0.25; | ||||||
|     final Duration maxDelay = const Duration(seconds: 30); |     const Duration maxDelay = Duration(seconds: 30); | ||||||
| 
 | 
 | ||||||
|     final rf = randomizationFactor * (rand.nextDouble() * 2 - 1) + 1; |     final rf = randomizationFactor * (rand.nextDouble() * 2 - 1) + 1; | ||||||
|     final exp = min(attempt, 31); // prevent overflows. |     final exp = min(attempt, 31); // prevent overflows. | ||||||
|  | |||||||
| @ -19,7 +19,9 @@ import 'dart:math'; | |||||||
| import 'package:wyatt_http_client/src/utils/convert.dart'; | import 'package:wyatt_http_client/src/utils/convert.dart'; | ||||||
| import 'package:wyatt_http_client/src/utils/crypto.dart'; | import 'package:wyatt_http_client/src/utils/crypto.dart'; | ||||||
| 
 | 
 | ||||||
| class DigestAuth { | class DigestAuth { // request counter | ||||||
|  | 
 | ||||||
|  |   DigestAuth(this.username, this.password); | ||||||
|   String username; |   String username; | ||||||
|   String password; |   String password; | ||||||
| 
 | 
 | ||||||
| @ -30,9 +32,7 @@ class DigestAuth { | |||||||
|   String? _nonce; |   String? _nonce; | ||||||
|   String? _opaque; |   String? _opaque; | ||||||
| 
 | 
 | ||||||
|   int _nc = 0; // request counter |   int _nc = 0; | ||||||
| 
 |  | ||||||
|   DigestAuth(this.username, this.password); |  | ||||||
| 
 | 
 | ||||||
|   /// Splits WWW-Authenticate header into a map. |   /// Splits WWW-Authenticate header into a map. | ||||||
|   Map<String, String>? splitWWWAuthenticateHeader(String header) { |   Map<String, String>? splitWWWAuthenticateHeader(String header) { | ||||||
| @ -61,9 +61,7 @@ class DigestAuth { | |||||||
|     return Convert.toHex(values); |     return Convert.toHex(values); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   String _formatNonceCount(int nc) { |   String _formatNonceCount(int nc) => nc.toRadixString(16).padLeft(8, '0'); | ||||||
|     return nc.toRadixString(16).padLeft(8, '0'); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   String _computeHA1( |   String _computeHA1( | ||||||
|     String realm, |     String realm, | ||||||
| @ -148,7 +146,7 @@ class DigestAuth { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   String getAuthString(String method, Uri url) { |   String getAuthString(String method, Uri url) { | ||||||
|     final _cnonce = _computeNonce(); |     final cnonce = _computeNonce(); | ||||||
|     _nc += 1; |     _nc += 1; | ||||||
|     // if url has query parameters, append query to path |     // if url has query parameters, append query to path | ||||||
|     final path = url.hasQuery ? '${url.path}?${url.query}' : url.path; |     final path = url.hasQuery ? '${url.path}?${url.query}' : url.path; | ||||||
| @ -162,7 +160,7 @@ class DigestAuth { | |||||||
|       _qop, |       _qop, | ||||||
|       _opaque, |       _opaque, | ||||||
|       _realm!, |       _realm!, | ||||||
|       _cnonce, |       cnonce, | ||||||
|       _nonce, |       _nonce, | ||||||
|       _nc, |       _nc, | ||||||
|       username, |       username, | ||||||
| @ -192,7 +190,5 @@ class DigestAuth { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   bool isReady() { |   bool isReady() => _nonce != null && (_nc == 0 || _qop != null); | ||||||
|     return _nonce != null && (_nc == 0 || _qop != null); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -95,29 +95,17 @@ enum HttpStatus { | |||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   bool isInfo() { |   bool isInfo() => statusCode >= 100 && statusCode < 200; | ||||||
|     return statusCode >= 100 && statusCode < 200;  |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   bool isSuccess() { |   bool isSuccess() => statusCode >= 200 && statusCode < 300; | ||||||
|     return statusCode >= 200 && statusCode < 300;  |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   bool isRedirection() { |   bool isRedirection() => statusCode >= 300 && statusCode < 400; | ||||||
|     return statusCode >= 300 && statusCode < 400;  |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   bool isClientError() { |   bool isClientError() => statusCode >= 400 && statusCode < 500; | ||||||
|     return statusCode >= 400 && statusCode < 500;  |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   bool isServerError() { |   bool isServerError() => statusCode >= 500 && statusCode < 600; | ||||||
|     return statusCode >= 500 && statusCode < 600;  |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   factory HttpStatus.from(int status) { |   factory HttpStatus.from(int status) => HttpStatus.values | ||||||
|     return HttpStatus.values |  | ||||||
|         .firstWhere((element) => element.statusCode == status); |         .firstWhere((element) => element.statusCode == status); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,9 +15,9 @@ | |||||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
| 
 | 
 | ||||||
| class AppError { | class AppError { | ||||||
|   final String message; |  | ||||||
| 
 | 
 | ||||||
|   const AppError(this.message); |   const AppError(this.message); | ||||||
|  |   final String message; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   // ignore: no_runtimetype_tostring |   // ignore: no_runtimetype_tostring | ||||||
|  | |||||||
| @ -28,8 +28,8 @@ mixin _Left<LeftType, RightType> on _EitherBase<LeftType, RightType> {} | |||||||
| mixin _Right<LeftType, RightType> on _EitherBase<LeftType, RightType> {} | mixin _Right<LeftType, RightType> on _EitherBase<LeftType, RightType> {} | ||||||
| 
 | 
 | ||||||
| class _EitherBaseException implements Exception { | class _EitherBaseException implements Exception { | ||||||
|   final String message; |  | ||||||
|   const _EitherBaseException(this.message); |   const _EitherBaseException(this.message); | ||||||
|  |   final String message; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() => '_EitherException: $message'; |   String toString() => '_EitherException: $message'; | ||||||
|  | |||||||
| @ -172,10 +172,10 @@ abstract class Option<T> extends _EitherBase<T, void> { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class Value<T> extends Option<T> with _Left<T, void> { | class Value<T> extends Option<T> with _Left<T, void> { | ||||||
|   final T value; |  | ||||||
| 
 | 
 | ||||||
|   /// {@macro ok} |   /// {@macro ok} | ||||||
|   const Value(this.value) : super._(); |   const Value(this.value) : super._(); | ||||||
|  |   final T value; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   _EitherBase<U, void> _and<U>(_EitherBase<U, void> res) => res as Option<U>; |   _EitherBase<U, void> _and<U>(_EitherBase<U, void> res) => res as Option<U>; | ||||||
|  | |||||||
| @ -203,10 +203,10 @@ abstract class Result<T, E> extends _EitherBase<T, E> { | |||||||
| /// {@macro result} | /// {@macro result} | ||||||
| /// {@endtemplate} | /// {@endtemplate} | ||||||
| class Ok<T, E> extends Result<T, E> with _Left<T, E> { | class Ok<T, E> extends Result<T, E> with _Left<T, E> { | ||||||
|   final T value; |  | ||||||
| 
 | 
 | ||||||
|   /// {@macro ok} |   /// {@macro ok} | ||||||
|   const Ok(this.value) : super._(); |   const Ok(this.value) : super._(); | ||||||
|  |   final T value; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnL(value); |   U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnL(value); | ||||||
| @ -268,10 +268,10 @@ class Ok<T, E> extends Result<T, E> with _Left<T, E> { | |||||||
| /// {@macro result} | /// {@macro result} | ||||||
| /// {@endtemplate} | /// {@endtemplate} | ||||||
| class Err<T, E> extends Result<T, E> with _Right<T, E> { | class Err<T, E> extends Result<T, E> with _Right<T, E> { | ||||||
|   final E error; |  | ||||||
| 
 | 
 | ||||||
|   /// {@macro err} |   /// {@macro err} | ||||||
|   const Err(this.error) : super._(); |   const Err(this.error) : super._(); | ||||||
|  |   final E error; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnR(error); |   U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnR(error); | ||||||
|  | |||||||
| @ -22,11 +22,11 @@ extension PairExtension<T> on Pair<T, T> { | |||||||
| /// [Pair] is a simple object which contains pair of two values. | /// [Pair] is a simple object which contains pair of two values. | ||||||
| /// {@endtemplate} | /// {@endtemplate} | ||||||
| class Pair<L, R> { | class Pair<L, R> { | ||||||
|   final L? left; |  | ||||||
|   final R? right; |  | ||||||
| 
 | 
 | ||||||
|   /// {@macro pair} |   /// {@macro pair} | ||||||
|   const Pair(this.left, this.right); |   const Pair(this.left, this.right); | ||||||
|  |   final L? left; | ||||||
|  |   final R? right; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   String toString() => '($left, $right)'; |   String toString() => '($left, $right)'; | ||||||
|  | |||||||
| @ -19,13 +19,13 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; | |||||||
| import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | ||||||
| 
 | 
 | ||||||
| class AppBarLayout extends Layout { | class AppBarLayout extends Layout { | ||||||
|   final String title; |  | ||||||
|   final Widget body; |  | ||||||
|   const AppBarLayout({ |   const AppBarLayout({ | ||||||
|     required this.title, |     required this.title, | ||||||
|     required this.body, |     required this.body, | ||||||
|     super.key, |     super.key, | ||||||
|   }); |   }); | ||||||
|  |   final String title; | ||||||
|  |   final Widget body; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) => Scaffold( |   Widget build(BuildContext context) => Scaffold( | ||||||
|  | |||||||
| @ -3,14 +3,14 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; | |||||||
| import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | ||||||
| 
 | 
 | ||||||
| class BottomNavigationBarLayout extends Layout { | class BottomNavigationBarLayout extends Layout { | ||||||
|   final Widget body; |  | ||||||
|   final int currentIndex; |  | ||||||
| 
 | 
 | ||||||
|   const BottomNavigationBarLayout({ |   const BottomNavigationBarLayout({ | ||||||
|     required this.currentIndex, |     required this.currentIndex, | ||||||
|     required this.body, |     required this.body, | ||||||
|     super.key, |     super.key, | ||||||
|   }); |   }); | ||||||
|  |   final Widget body; | ||||||
|  |   final int currentIndex; | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) => Scaffold( |   Widget build(BuildContext context) => Scaffold( | ||||||
|         body: body, |         body: body, | ||||||
|  | |||||||
| @ -19,9 +19,6 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; | |||||||
| import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart'; | ||||||
| 
 | 
 | ||||||
| class FrameLayout extends Layout { | class FrameLayout extends Layout { | ||||||
|   final String title; |  | ||||||
|   final Widget body; |  | ||||||
|   final int currentIndex; |  | ||||||
| 
 | 
 | ||||||
|   const FrameLayout({ |   const FrameLayout({ | ||||||
|     required this.title, |     required this.title, | ||||||
| @ -29,6 +26,9 @@ class FrameLayout extends Layout { | |||||||
|     required this.currentIndex, |     required this.currentIndex, | ||||||
|     super.key, |     super.key, | ||||||
|   }); |   }); | ||||||
|  |   final String title; | ||||||
|  |   final Widget body; | ||||||
|  |   final int currentIndex; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) => Scaffold( |   Widget build(BuildContext context) => Scaffold( | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user