feat: Integrate profile setup use case and repository for profile submission

This commit is contained in:
Achintha Isuru
2026-02-01 03:47:39 -05:00
parent c95e4ed9c7
commit 1625f81ce6
5 changed files with 126 additions and 49 deletions

View File

@@ -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<void> submitProfile({
required String fullName,
String? bio,
required List<String> preferredLocations,
required double maxDistanceMiles,
required List<String> industries,
required List<String> 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<CreateStaffData, CreateStaffVariables>
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),
);
}
}
}

View File

@@ -0,0 +1,12 @@
import 'package:krow_domain/krow_domain.dart';
abstract class ProfileSetupRepository {
Future<void> submitProfile({
required String fullName,
String? bio,
required List<String> preferredLocations,
required double maxDistanceMiles,
required List<String> industries,
required List<String> skills,
});
}

View File

@@ -0,0 +1,25 @@
import '../repositories/profile_setup_repository.dart';
class SubmitProfileSetup {
final ProfileSetupRepository repository;
SubmitProfileSetup(this.repository);
Future<void> call({
required String fullName,
String? bio,
required List<String> preferredLocations,
required double maxDistanceMiles,
required List<String> industries,
required List<String> skills,
}) {
return repository.submitProfile(
fullName: fullName,
bio: bio,
preferredLocations: preferredLocations,
maxDistanceMiles: maxDistanceMiles,
industries: industries,
skills: skills,
);
}
}

View File

@@ -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<ProfileSetupEvent, ProfileSetupState> {
ProfileSetupBloc({
required auth.FirebaseAuth firebaseAuth,
required dc.ExampleConnector dataConnect,
}) : _firebaseAuth = firebaseAuth,
_dataConnect = dataConnect,
required SubmitProfileSetup submitProfileSetup,
}) : _submitProfileSetup = submitProfileSetup,
super(const ProfileSetupState()) {
on<ProfileSetupFullNameChanged>(_onFullNameChanged);
on<ProfileSetupBioChanged>(_onBioChanged);
@@ -27,8 +22,7 @@ class ProfileSetupBloc extends Bloc<ProfileSetupEvent, ProfileSetupState> {
on<ProfileSetupSubmitted>(_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<ProfileSetupEvent, ProfileSetupState> {
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<dc.CreateStaffData, dc.CreateStaffVariables>
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) {

View File

@@ -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<ProfileSetupRepository>(
() => ProfileSetupRepositoryImpl(
firebaseAuth: firebase.FirebaseAuth.instance,
dataConnect: ExampleConnector.instance,
),
);
// UseCases
i.addLazySingleton(SignInWithPhoneUseCase.new);
i.addLazySingleton(VerifyOtpUseCase.new);
i.addLazySingleton(SubmitProfileSetup.new);
// BLoCs
i.addLazySingleton<AuthBloc>(
@@ -49,8 +59,7 @@ class StaffAuthenticationModule extends Module {
);
i.add<ProfileSetupBloc>(
() => ProfileSetupBloc(
firebaseAuth: firebase.FirebaseAuth.instance,
dataConnect: ExampleConnector.instance,
submitProfileSetup: i.get<SubmitProfileSetup>(),
),
);
}