feat: Integrate profile setup use case and repository for profile submission
This commit is contained in:
@@ -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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
|
import '../../../domain/usecases/submit_profile_setup_usecase.dart';
|
||||||
import 'package:krow_domain/krow_domain.dart';
|
|
||||||
|
|
||||||
import 'profile_setup_event.dart';
|
import 'profile_setup_event.dart';
|
||||||
import 'profile_setup_state.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.
|
/// BLoC responsible for managing the profile setup state and logic.
|
||||||
class ProfileSetupBloc extends Bloc<ProfileSetupEvent, ProfileSetupState> {
|
class ProfileSetupBloc extends Bloc<ProfileSetupEvent, ProfileSetupState> {
|
||||||
ProfileSetupBloc({
|
ProfileSetupBloc({
|
||||||
required auth.FirebaseAuth firebaseAuth,
|
required SubmitProfileSetup submitProfileSetup,
|
||||||
required dc.ExampleConnector dataConnect,
|
}) : _submitProfileSetup = submitProfileSetup,
|
||||||
}) : _firebaseAuth = firebaseAuth,
|
|
||||||
_dataConnect = dataConnect,
|
|
||||||
super(const ProfileSetupState()) {
|
super(const ProfileSetupState()) {
|
||||||
on<ProfileSetupFullNameChanged>(_onFullNameChanged);
|
on<ProfileSetupFullNameChanged>(_onFullNameChanged);
|
||||||
on<ProfileSetupBioChanged>(_onBioChanged);
|
on<ProfileSetupBioChanged>(_onBioChanged);
|
||||||
@@ -27,8 +22,7 @@ class ProfileSetupBloc extends Bloc<ProfileSetupEvent, ProfileSetupState> {
|
|||||||
on<ProfileSetupSubmitted>(_onSubmitted);
|
on<ProfileSetupSubmitted>(_onSubmitted);
|
||||||
}
|
}
|
||||||
|
|
||||||
final auth.FirebaseAuth _firebaseAuth;
|
final SubmitProfileSetup _submitProfileSetup;
|
||||||
final dc.ExampleConnector _dataConnect;
|
|
||||||
|
|
||||||
/// Handles the [ProfileSetupFullNameChanged] event.
|
/// Handles the [ProfileSetupFullNameChanged] event.
|
||||||
void _onFullNameChanged(
|
void _onFullNameChanged(
|
||||||
@@ -86,44 +80,14 @@ class ProfileSetupBloc extends Bloc<ProfileSetupEvent, ProfileSetupState> {
|
|||||||
emit(state.copyWith(status: ProfileSetupStatus.loading));
|
emit(state.copyWith(status: ProfileSetupStatus.loading));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final auth.User? firebaseUser = _firebaseAuth.currentUser;
|
await _submitProfileSetup(
|
||||||
if (firebaseUser == null) {
|
fullName: state.fullName,
|
||||||
throw Exception('User not authenticated.');
|
bio: state.bio.isEmpty ? null : state.bio,
|
||||||
}
|
preferredLocations: state.preferredLocations,
|
||||||
|
maxDistanceMiles: state.maxDistanceMiles,
|
||||||
final dc.StaffSession? session = dc.StaffSessionStore.instance.session;
|
industries: state.industries,
|
||||||
final String email = session?.user.email ?? '';
|
skills: state.skills,
|
||||||
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,
|
|
||||||
);
|
);
|
||||||
if (session != null) {
|
|
||||||
dc.StaffSessionStore.instance.setSession(
|
|
||||||
dc.StaffSession(user: session.user, staff: staff),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(state.copyWith(status: ProfileSetupStatus.success));
|
emit(state.copyWith(status: ProfileSetupStatus.success));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -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/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/sign_in_with_phone_usecase.dart';
|
||||||
import 'package:staff_authentication/src/domain/usecases/verify_otp_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/auth_bloc.dart';
|
||||||
import 'package:staff_authentication/src/presentation/blocs/profile_setup/profile_setup_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';
|
import 'package:staff_authentication/src/presentation/pages/get_started_page.dart';
|
||||||
@@ -35,10 +38,17 @@ class StaffAuthenticationModule extends Module {
|
|||||||
dataConnect: ExampleConnector.instance,
|
dataConnect: ExampleConnector.instance,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
i.addLazySingleton<ProfileSetupRepository>(
|
||||||
|
() => ProfileSetupRepositoryImpl(
|
||||||
|
firebaseAuth: firebase.FirebaseAuth.instance,
|
||||||
|
dataConnect: ExampleConnector.instance,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
// UseCases
|
// UseCases
|
||||||
i.addLazySingleton(SignInWithPhoneUseCase.new);
|
i.addLazySingleton(SignInWithPhoneUseCase.new);
|
||||||
i.addLazySingleton(VerifyOtpUseCase.new);
|
i.addLazySingleton(VerifyOtpUseCase.new);
|
||||||
|
i.addLazySingleton(SubmitProfileSetup.new);
|
||||||
|
|
||||||
// BLoCs
|
// BLoCs
|
||||||
i.addLazySingleton<AuthBloc>(
|
i.addLazySingleton<AuthBloc>(
|
||||||
@@ -49,8 +59,7 @@ class StaffAuthenticationModule extends Module {
|
|||||||
);
|
);
|
||||||
i.add<ProfileSetupBloc>(
|
i.add<ProfileSetupBloc>(
|
||||||
() => ProfileSetupBloc(
|
() => ProfileSetupBloc(
|
||||||
firebaseAuth: firebase.FirebaseAuth.instance,
|
submitProfileSetup: i.get<SubmitProfileSetup>(),
|
||||||
dataConnect: ExampleConnector.instance,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user