diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/data/repositories_impl/profile_setup_repository_impl.dart b/apps/mobile/packages/features/staff/authentication/lib/src/data/repositories_impl/profile_setup_repository_impl.dart new file mode 100644 index 00000000..0903fa83 --- /dev/null +++ b/apps/mobile/packages/features/staff/authentication/lib/src/data/repositories_impl/profile_setup_repository_impl.dart @@ -0,0 +1,67 @@ +import 'package:firebase_auth/firebase_auth.dart' as auth; +import 'package:krow_data_connect/krow_data_connect.dart'; +import 'package:firebase_data_connect/firebase_data_connect.dart' as fdc; +import 'package:krow_domain/krow_domain.dart'; +import '../../domain/repositories/profile_setup_repository.dart'; + +class ProfileSetupRepositoryImpl implements ProfileSetupRepository { + final auth.FirebaseAuth _firebaseAuth; + final ExampleConnector _dataConnect; + + ProfileSetupRepositoryImpl({ + required auth.FirebaseAuth firebaseAuth, + required ExampleConnector dataConnect, + }) : _firebaseAuth = firebaseAuth, + _dataConnect = dataConnect; + + @override + Future submitProfile({ + required String fullName, + String? bio, + required List preferredLocations, + required double maxDistanceMiles, + required List industries, + required List skills, + }) async { + final auth.User? firebaseUser = _firebaseAuth.currentUser; + if (firebaseUser == null) { + throw Exception('User not authenticated.'); + } + + final StaffSession? session = StaffSessionStore.instance.session; + final String email = session?.user.email ?? ''; + final String? phone = firebaseUser.phoneNumber; + + final fdc.OperationResult + result = await _dataConnect + .createStaff( + userId: firebaseUser.uid, + fullName: fullName, + ) + .bio(bio) + .preferredLocations(preferredLocations) + .maxDistanceMiles(maxDistanceMiles.toInt()) + .industries(industries) + .skills(skills) + .email(email.isEmpty ? null : email) + .phone(phone) + .execute(); + + final String staffId = result.data.staff_insert.id; + + final Staff staff = Staff( + id: staffId, + authProviderId: firebaseUser.uid, + name: fullName, + email: email, + phone: phone, + status: StaffStatus.completedProfile, + ); + + if (session != null) { + StaffSessionStore.instance.setSession( + StaffSession(user: session.user, staff: staff), + ); + } + } +} diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/domain/repositories/profile_setup_repository.dart b/apps/mobile/packages/features/staff/authentication/lib/src/domain/repositories/profile_setup_repository.dart new file mode 100644 index 00000000..8b99f0f9 --- /dev/null +++ b/apps/mobile/packages/features/staff/authentication/lib/src/domain/repositories/profile_setup_repository.dart @@ -0,0 +1,12 @@ +import 'package:krow_domain/krow_domain.dart'; + +abstract class ProfileSetupRepository { + Future submitProfile({ + required String fullName, + String? bio, + required List preferredLocations, + required double maxDistanceMiles, + required List industries, + required List skills, + }); +} diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/domain/usecases/submit_profile_setup_usecase.dart b/apps/mobile/packages/features/staff/authentication/lib/src/domain/usecases/submit_profile_setup_usecase.dart new file mode 100644 index 00000000..b69f5fe6 --- /dev/null +++ b/apps/mobile/packages/features/staff/authentication/lib/src/domain/usecases/submit_profile_setup_usecase.dart @@ -0,0 +1,25 @@ +import '../repositories/profile_setup_repository.dart'; + +class SubmitProfileSetup { + final ProfileSetupRepository repository; + + SubmitProfileSetup(this.repository); + + Future call({ + required String fullName, + String? bio, + required List preferredLocations, + required double maxDistanceMiles, + required List industries, + required List skills, + }) { + return repository.submitProfile( + fullName: fullName, + bio: bio, + preferredLocations: preferredLocations, + maxDistanceMiles: maxDistanceMiles, + industries: industries, + skills: skills, + ); + } +} diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart index 93d8b44f..324ea906 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/blocs/profile_setup/profile_setup_bloc.dart @@ -1,8 +1,5 @@ -import 'package:firebase_auth/firebase_auth.dart' as auth; -import 'package:firebase_data_connect/firebase_data_connect.dart' as fdc; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:krow_data_connect/krow_data_connect.dart' as dc; -import 'package:krow_domain/krow_domain.dart'; +import '../../../domain/usecases/submit_profile_setup_usecase.dart'; import 'profile_setup_event.dart'; import 'profile_setup_state.dart'; @@ -13,10 +10,8 @@ export 'profile_setup_state.dart'; /// BLoC responsible for managing the profile setup state and logic. class ProfileSetupBloc extends Bloc { ProfileSetupBloc({ - required auth.FirebaseAuth firebaseAuth, - required dc.ExampleConnector dataConnect, - }) : _firebaseAuth = firebaseAuth, - _dataConnect = dataConnect, + required SubmitProfileSetup submitProfileSetup, + }) : _submitProfileSetup = submitProfileSetup, super(const ProfileSetupState()) { on(_onFullNameChanged); on(_onBioChanged); @@ -27,8 +22,7 @@ class ProfileSetupBloc extends Bloc { on(_onSubmitted); } - final auth.FirebaseAuth _firebaseAuth; - final dc.ExampleConnector _dataConnect; + final SubmitProfileSetup _submitProfileSetup; /// Handles the [ProfileSetupFullNameChanged] event. void _onFullNameChanged( @@ -86,44 +80,14 @@ class ProfileSetupBloc extends Bloc { emit(state.copyWith(status: ProfileSetupStatus.loading)); try { - final auth.User? firebaseUser = _firebaseAuth.currentUser; - if (firebaseUser == null) { - throw Exception('User not authenticated.'); - } - - final dc.StaffSession? session = dc.StaffSessionStore.instance.session; - final String email = session?.user.email ?? ''; - final String? phone = firebaseUser.phoneNumber; - - final fdc.OperationResult - result = await _dataConnect - .createStaff( - userId: firebaseUser.uid, - fullName: state.fullName, - ) - .bio(state.bio.isEmpty ? null : state.bio) - .preferredLocations(state.preferredLocations) - .maxDistanceMiles(state.maxDistanceMiles.toInt()) - .industries(state.industries) - .skills(state.skills) - .email(email.isEmpty ? null : email) - .phone(phone) - .execute(); - - final String staffId = result.data.staff_insert.id ; - final Staff staff = Staff( - id: staffId, - authProviderId: firebaseUser.uid, - name: state.fullName, - email: email, - phone: phone, - status: StaffStatus.completedProfile, + await _submitProfileSetup( + fullName: state.fullName, + bio: state.bio.isEmpty ? null : state.bio, + preferredLocations: state.preferredLocations, + maxDistanceMiles: state.maxDistanceMiles, + industries: state.industries, + skills: state.skills, ); - if (session != null) { - dc.StaffSessionStore.instance.setSession( - dc.StaffSession(user: session.user, staff: staff), - ); - } emit(state.copyWith(status: ProfileSetupStatus.success)); } catch (e) { diff --git a/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart b/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart index 19421456..b98c5356 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart @@ -8,6 +8,9 @@ import 'package:staff_authentication/src/data/repositories_impl/auth_repository_ import 'package:staff_authentication/src/domain/repositories/auth_repository_interface.dart'; import 'package:staff_authentication/src/domain/usecases/sign_in_with_phone_usecase.dart'; import 'package:staff_authentication/src/domain/usecases/verify_otp_usecase.dart'; +import 'package:staff_authentication/src/domain/repositories/profile_setup_repository.dart'; +import 'package:staff_authentication/src/data/repositories_impl/profile_setup_repository_impl.dart'; +import 'package:staff_authentication/src/domain/usecases/submit_profile_setup_usecase.dart'; import 'package:staff_authentication/src/presentation/blocs/auth_bloc.dart'; import 'package:staff_authentication/src/presentation/blocs/profile_setup/profile_setup_bloc.dart'; import 'package:staff_authentication/src/presentation/pages/get_started_page.dart'; @@ -35,10 +38,17 @@ class StaffAuthenticationModule extends Module { dataConnect: ExampleConnector.instance, ), ); + i.addLazySingleton( + () => ProfileSetupRepositoryImpl( + firebaseAuth: firebase.FirebaseAuth.instance, + dataConnect: ExampleConnector.instance, + ), + ); // UseCases i.addLazySingleton(SignInWithPhoneUseCase.new); i.addLazySingleton(VerifyOtpUseCase.new); + i.addLazySingleton(SubmitProfileSetup.new); // BLoCs i.addLazySingleton( @@ -49,8 +59,7 @@ class StaffAuthenticationModule extends Module { ); i.add( () => ProfileSetupBloc( - firebaseAuth: firebase.FirebaseAuth.instance, - dataConnect: ExampleConnector.instance, + submitProfileSetup: i.get(), ), ); }