i have a cubit named AuthCubit in which I have multiple functions related to authentication like login,resetPassword,...
the thing is all my functions need variable phoneNumber which is taken from user on on first screen, after checking if phoneNumber exists in server or not application navigates to different screens.
so my question is that is it ok to store phoneNumber in AuthCubit class and use it from there (like how it's done with Provider/ChangeNotifier)?
or should I make AuthState base class require a phoneNumber variable?
below is the code snippet from AuthCubit
class AuthCubit extends Cubit<AuthState> {
final LoginWithCredentialsUsecase _loginWithCredentialsUsecase;
final CheckPhoneNumberExistUsecase _checkPhoneNumberExistUsecase;
final SendOTPTokenUsecase _sendOTPTokenUsecase;
final VerifyOTPTokenUsecase _verifyOTPTokenUsecase;
final SendResetPasswordOtpUsecase _sendResetPasswordOtpUsecase;
AuthCubit(
{required LoginWithCredentialsUsecase loginWithCredentialsUsecase,
required CheckPhoneNumberExistUsecase checkPhoneNumberExistUsecase,
required SendOTPTokenUsecase sendOTPTokenUsecase,
required VerifyOTPTokenUsecase verifyOTPTokenUsecase,
required SendResetPasswordOtpUsecase sendResetPasswordOtpUsecase,
required VerifyResetPasswordOtpUsecase verifyResetPasswordOtpUsecase})
: _loginWithCredentialsUsecase = loginWithCredentialsUsecase,
_checkPhoneNumberExistUsecase = checkPhoneNumberExistUsecase,
_sendOTPTokenUsecase = sendOTPTokenUsecase,
_verifyOTPTokenUsecase = verifyOTPTokenUsecase,
_sendResetPasswordOtpUsecase = sendResetPasswordOtpUsecase,
super(AuthInitial());
Future<void> loginWithCredentianls(
{String password = '',
required String phoneNumber,
String otpCode = ''}) async {
emit(AuthLoading());
try {
final driver = await _loginWithCredentialsUsecase(
password: password, phoneNumber: phoneNumber, otpCode: otpCode);
emit(AuthSuccess(driver: driver));
} on LoginFieldsNotCorrectException catch (e) {
emit(AuthException(message: e.message));
} on LoginNoRemainingChangeDeviceException catch (e) {
emit(AuthException(message: e.message));
} on LoginNotADriverException catch (e) {
emit(AuthException(message: e.message));
} catch (e) {
emit(AuthFailed(message: e.toString()));
}
}
Future<void> sendOTPMessageToPhoneNumber(String phoneNumber) async {
emit(AuthLoading());
try {
final wasSuccess = await _sendOTPTokenUsecase(phoneNumber);
if (wasSuccess) {
emit(PhoneAuthOTPSent(phoneNumber: phoneNumber));
} else {
emit(phoneAuthFailedState);
}
} catch (e) {
emit(phoneAuthFailedState);
}
}
Future<void> checkPhoneAuthentication(String phoneNumber) async {
emit(AuthLoading());
try {
final phoneNumberAuth = await _checkPhoneNumberExistUsecase(phoneNumber);
if (phoneNumberAuth.isAuthenticated) {
emit(PhoneAuthenticated(phoneNumber: phoneNumber));
} else {
emit(PhoneNotAuthenticated(
message: phoneNumberAuth.message, phoneNumber: phoneNumber));
}
} catch (error) {
emit(phoneAuthFailedState);
}
}
Future<void> verifyOTPToken(String token, String phoneNumber) async {
emit(AuthLoading());
try {
final wasSuccess = await _verifyOTPTokenUsecase(token, phoneNumber);
if (wasSuccess) {
emit(PhoneAuthOTPVerified(phoneNumber: phoneNumber, otpCode: token));
} else {
emit(PhoneAuthOTPNotVerified(
message: 'کد وارد شده صحیح نیست', otpCode: token,phoneNumber: phoneNumber));
}
} catch (error) {
emit(phoneAuthFailedState);
}
}
Future<void> sendResetPasswordOtp(String phoneNumber) async {
emit(AuthLoading());
try {
await _sendResetPasswordOtpUsecase(phoneNumber);
emit(PhoneAuthOTPSent(phoneNumber: phoneNumber));
} on ResetPasswordException catch (e) {
emit(ResetPasswordExceptionState(message: e.message));
} catch (e) {
emit(phoneAuthFailedState);
}
}
}