Skip to content

Remove either #377

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
May 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 44 additions & 27 deletions app/lib/app/cubit/auth_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,44 @@ class AuthCubit extends Cubit<AuthState> {
try {
await authRepository.loginWithEmail(email);
} on Exception catch (e) {
emit(state.copyWith(exception: Exception(e)));
emit(state.copyWith(exception: e));
}
}

Future<AuthState> verifyOtp(String otp, String email) async {
final user = await authRepository.verifyOtp(
email: email,
otp: otp,
languageCode: state.currentLocale.languageCode,
gender: state.gender,
);
user.fold((l) => emit(state.copyWith(exception: l)), (r) => emit(state.copyWith(user: r)));
return state;
try {
final user = await authRepository.verifyOtp(
email: email,
otp: otp,
languageCode: state.currentLocale.languageCode,
gender: state.gender,
);
emit(state.copyWith(user: user));
return state;
} on Exception catch (e) {
emit(state.copyWith(exception: e));
return state;
}
}

Future<AuthState> signInWithGoogle() async {
final user = await authRepository.signWithGoogle(state.currentLocale.languageCode, state.gender);
user.fold((l) => emit(state.copyWith(exception: l)), (r) => emit(state.copyWith(user: r)));
return state;
try {
final user = await authRepository.signWithGoogle(state.currentLocale.languageCode, state.gender);
emit(state.copyWith(user: user));
return state;
} on Exception catch (e) {
emit(state.copyWith(exception: e));
return state;
}
}

Future<AuthState> signInWithApple() async {
final user = await authRepository.signWithApple(state.currentLocale.languageCode, state.gender);

user.fold((l) => emit(state.copyWith(exception: l)), (r) => emit(state.copyWith(user: r)));
try {
final user = await authRepository.signWithApple(state.currentLocale.languageCode, state.gender);
emit(state.copyWith(user: user));
} on Exception catch (e) {
emit(state.copyWith(exception: e));
}

return state;
}
Expand All @@ -52,25 +65,29 @@ class AuthCubit extends Cubit<AuthState> {

Future<void> saveLocale(String localeCode) async {
if (state.isAuthedticated) {
final res = await authRepository.patchLocaleCode(userId: state.user!.accessToken, localeCode: localeCode);

res.fold((l) => emit(state.copyWith(exception: l)), (r) {
final newUser = state.user!.copyWith(localeCode: r.localeValue);
try {
final res = await authRepository.patchLocaleCode(userId: state.user!.accessToken, localeCode: localeCode);
final newUser = state.user!.copyWith(localeCode: res.localeValue);
emit(state.copyWith(user: newUser));
});
} on Exception catch (e) {
emit(state.copyWith(exception: e));
return;
}
} else {
emit(state.copyWith(localeForNow: localeCode));
}
}

Future<void> saveGender(Gender gender) async {
if (state.isAuthedticated) {
final res = await authRepository.patchGender(userId: state.user!.accessToken, gender: gender);

res.fold((l) => emit(state.copyWith(exception: l)), (r) {
final newUser = state.user!.copyWith(gender: r.genderValue);
try {
final res = await authRepository.patchGender(userId: state.user!.accessToken, gender: gender);
final newUser = state.user!.copyWith(gender: res.genderValue);
emit(state.copyWith(user: newUser));
});
} on Exception catch (e) {
emit(state.copyWith(exception: e));
return;
}
} else {
emit(state.copyWith(genderForNow: gender));
}
Expand All @@ -81,7 +98,7 @@ class AuthCubit extends Cubit<AuthState> {
await authRepository.deleteAccount();
emit(const AuthState());
} on Exception catch (e) {
emit(state.copyWith(exception: Exception(e)));
emit(state.copyWith(exception: e));
}
}

Expand All @@ -90,7 +107,7 @@ class AuthCubit extends Cubit<AuthState> {
await authRepository.logout();
emit(const AuthState());
} on Exception catch (e) {
emit(state.copyWith(exception: Exception(e)));
emit(state.copyWith(exception: e));
}
}

Expand Down
4 changes: 2 additions & 2 deletions app/lib/app/cubit/auth_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ class AuthState extends Equatable {
const AuthState({this.user, this.exception, this.localeForNow, this.genderForNow});

final UserEntity? user;
final Exception? exception;
final Object? exception;
final String? localeForNow;
final Gender? genderForNow;

@override
List<Object?> get props => [user, exception, localeForNow, genderForNow];

AuthState copyWith({UserEntity? user, Exception? exception, String? localeForNow, Gender? genderForNow}) {
AuthState copyWith({UserEntity? user, Object? exception, String? localeForNow, Gender? genderForNow}) {
return AuthState(
user: user ?? this.user,
exception: exception ?? this.exception,
Expand Down
7 changes: 0 additions & 7 deletions app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -842,13 +842,6 @@ packages:
relative: true
source: path
version: "0.1.0+1"
mq_either:
dependency: "direct main"
description:
path: "../packages/mq_either"
relative: true
source: path
version: "0.1.0+1"
mq_hatim_repository:
dependency: "direct main"
description:
Expand Down
2 changes: 0 additions & 2 deletions app/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ dependencies:
# Packages
mq_ci_keys:
path: ../packages/mq_ci_keys
mq_either:
path: ../packages/mq_either
mq_remote_client:
path: ../packages/mq_remote_client
mq_storage:
Expand Down
5 changes: 1 addition & 4 deletions app/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# melos_managed_dependency_overrides: mq_analytics,mq_app_ui,mq_auth_repository,mq_ci_keys,mq_crashlytics,mq_either,mq_hatim_repository,mq_home_repository,mq_prayer_time,mq_quran_repository,mq_remote_config,mq_storage
# melos_managed_dependency_overrides: mq_analytics,mq_app_ui,mq_auth_repository,mq_ci_keys,mq_crashlytics,mq_hatim_repository,mq_home_repository,mq_prayer_time,mq_quran_repository,mq_remote_config,mq_storage
dependency_overrides:
mq_remote_client:
path: ../packages/mq_remote_client
Expand All @@ -12,8 +12,6 @@ dependency_overrides:
path: ../packages/mq_ci_keys
mq_crashlytics:
path: ../packages/mq_crashlytics
mq_either:
path: ../packages/mq_either
mq_hatim_repository:
path: ../packages/mq_hatim_repository
mq_home_repository:
Expand All @@ -26,4 +24,3 @@ dependency_overrides:
path: ../packages/mq_remote_config
mq_storage:
path: ../packages/mq_storage

4 changes: 1 addition & 3 deletions packages/mq_app_ui/gallery/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
# melos_managed_dependency_overrides: mq_app_ui,mq_either,mq_prayer_time,mq_remote_client,mq_storage
# melos_managed_dependency_overrides: mq_app_ui,mq_prayer_time,mq_remote_client,mq_storage
dependency_overrides:
mq_app_ui:
path: ..
mq_either:
path: ../../mq_either
mq_prayer_time:
path: ../../mq_prayer_time
mq_remote_client:
Expand Down
2 changes: 1 addition & 1 deletion packages/mq_app_ui/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ dependencies:
pinput: ^5.0.1
mockingjay: ^0.6.0
flutter_svg: ^2.0.17
animated_analog_clock: ^0.2.1
animated_analog_clock: ^0.2.1
syncfusion_flutter_charts: ^28.2.5+1
flutter_instagram_storyboard: ^1.0.1
cached_network_image: ^3.4.1
Expand Down
4 changes: 1 addition & 3 deletions packages/mq_app_ui/pubspec_overrides.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# melos_managed_dependency_overrides: mq_either,mq_prayer_time,mq_remote_client,mq_storage
# melos_managed_dependency_overrides: mq_prayer_time,mq_remote_client,mq_storage
dependency_overrides:
mq_either:
path: ../mq_either
mq_prayer_time:
path: ../mq_prayer_time
mq_remote_client:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import 'package:mq_auth_repository/mq_auth_repository.dart';
import 'package:mq_either/mq_either.dart';

abstract class AuthRepository {
UserEntity? get init;

Future<void> loginWithEmail(String email);

Future<Either<UserEntity, Exception>> verifyOtp({
Future<UserEntity> verifyOtp({
required String email,
required String otp,
required String languageCode,
required Gender gender,
});
Future<Either<UserEntity, Exception>> signWithGoogle(String languageCode, Gender gender);
Future<UserEntity> signWithGoogle(String languageCode, Gender gender);

Future<Either<UserEntity, Exception>> signWithApple(String languageCode, Gender gender);
Future<UserEntity> signWithApple(String languageCode, Gender gender);

Future<void> setUserData(UserEntity userEntity);

Future<Either<UserDataEntity, Exception>> patchGender({required String userId, required Gender gender});
Future<UserDataEntity> patchGender({required String userId, required Gender gender});

Future<Either<UserDataEntity, Exception>> patchLocaleCode({required String userId, required String localeCode});
Future<UserDataEntity> patchLocaleCode({required String userId, required String localeCode});

Future<void> deleteAccount();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import 'dart:developer';

import 'package:meta/meta.dart';
import 'package:mq_auth_repository/mq_auth_repository.dart';
import 'package:mq_crashlytics/mq_crashlytics.dart';
import 'package:mq_either/mq_either.dart';

@immutable
final class AuthRepositoryImpl implements AuthRepository {
Expand All @@ -17,115 +13,77 @@ final class AuthRepositoryImpl implements AuthRepository {

@override
Future<void> setUserData(UserEntity userEntity) async {
try {
await remoteDataSource.saveUserData(userEntity);
await localDataSource.saveUserData(userEntity);
} on Exception catch (e, s) {
MqCrashlytics.report(e, s);
log('setUserData error $e,\n$s');
}
await remoteDataSource.saveUserData(userEntity);
await localDataSource.saveUserData(userEntity);
}

@override
Future<void> loginWithEmail(String email) async {
try {
await remoteDataSource.loginWithEmail(email);
} on Exception catch (e, s) {
MqCrashlytics.report(e, s);
log('signWithEmail: error: $e\n$s');
}
await remoteDataSource.loginWithEmail(email);
}

@override
Future<Either<UserEntity, Exception>> verifyOtp({
Future<UserEntity> verifyOtp({
required String email,
required String otp,
required String languageCode,
required Gender gender,
}) async {
try {
final res = await remoteDataSource.verifyOtp(email: email, otp: otp, languageCode: languageCode, gender: gender);

return res.fold(Left.new, (r) {
final userEntity = UserEntity(
accessToken: r.accessToken,
username: r.username,
gender: r.gender,
localeCode: r.localeCode,
);
return Right(userEntity);
});
} on Exception catch (e, s) {
log('signWithemail: error: $e\n$s');
MqCrashlytics.report(e, s);
return Left(AuthenticationExc(message: e.toString()));
}
final res = await remoteDataSource.verifyOtp(email: email, otp: otp, languageCode: languageCode, gender: gender);
return UserEntity(
accessToken: res.accessToken,
username: res.username,
gender: res.gender,
localeCode: res.localeCode,
);
}

@override
Future<Either<UserEntity, Exception>> signWithGoogle(String languageCode, Gender gender) async {
Future<UserEntity> signWithGoogle(String languageCode, Gender gender) async {
final res = await remoteDataSource.signInWithGoogle(languageCode, gender);
return res.fold(
Left.new,
(r) => Right(
UserEntity(accessToken: r.accessToken, username: r.username, gender: r.gender, localeCode: r.localeCode),
),

return UserEntity(
accessToken: res.accessToken,
username: res.username,
gender: res.gender,
localeCode: res.localeCode,
);
}

@override
Future<Either<UserEntity, Exception>> signWithApple(String languageCode, Gender gender) async {
Future<UserEntity> signWithApple(String languageCode, Gender gender) async {
final res = await remoteDataSource.signInWithApple(languageCode, gender);
return res.fold(
Left.new,
(r) => Right(
UserEntity(accessToken: r.accessToken, username: r.username, gender: r.gender, localeCode: r.localeCode),
),
return UserEntity(
accessToken: res.accessToken,
username: res.username,
gender: res.gender,
localeCode: res.localeCode,
);
}

@override
Future<Either<UserDataEntity, Exception>> patchGender({required String userId, required Gender gender}) async {
Future<UserDataEntity> patchGender({required String userId, required Gender gender}) async {
final res = await remoteDataSource.pathGender(userId: userId, gender: gender);
return res.fold(Left.new, (r) async {
final entity = UserDataEntity(gender: r.gender, language: r.language);
await localDataSource.saveGender(gender);
return Right(entity);
});
await localDataSource.saveGender(gender);
return UserDataEntity(gender: res.gender, language: res.language);
}

@override
Future<Either<UserDataEntity, Exception>> patchLocaleCode({
required String userId,
required String localeCode,
}) async {
Future<UserDataEntity> patchLocaleCode({required String userId, required String localeCode}) async {
final res = await remoteDataSource.pathLocaleCode(userId: userId, localeCode: localeCode);
return res.fold(Left.new, (r) async {
final entity = UserDataEntity(gender: r.gender, language: r.language);
await localDataSource.saveLocaleCode(localeCode);
return Right(entity);
});
await localDataSource.saveLocaleCode(localeCode);
return UserDataEntity(gender: res.gender, language: res.language);
}

@override
Future<void> deleteAccount() async {
try {
await remoteDataSource.deleteAccountRemote();
await localDataSource.deleteAccountLocal();
} on Exception catch (e, s) {
MqCrashlytics.report(e, s);
log('Delete Account error: $e\n$s');
}
await remoteDataSource.deleteAccountRemote();
await localDataSource.deleteAccountLocal();
}

@override
Future<void> logout() async {
try {
await remoteDataSource.logoutRemote();
await localDataSource.logoutLocal();
} on Exception catch (e, s) {
MqCrashlytics.report(e, s);
log('logout error: $e\n$s');
}
await remoteDataSource.logoutRemote();
await localDataSource.logoutLocal();
}
}
Loading