diff --git a/apps/lib/features/auth/presentation/cubits/register_cubit.dart b/apps/lib/features/auth/presentation/cubits/register_cubit.dart index de17149..44b045c 100644 --- a/apps/lib/features/auth/presentation/cubits/register_cubit.dart +++ b/apps/lib/features/auth/presentation/cubits/register_cubit.dart @@ -152,17 +152,28 @@ class RegisterCubit extends Cubit { } } - Future resendCode() async { - if (state.pendingEmail == null) return; + Future resendCode() async { + if (state.pendingEmail == null) return false; + + emit(state.copyWith(status: FormzSubmissionStatus.inProgress)); try { await _repository.signupResend( SignupResendRequest(email: state.pendingEmail!), ); - emit(state.copyWith(codeSent: true)); + emit( + state.copyWith(status: FormzSubmissionStatus.success, codeSent: true), + ); + return true; } catch (e) { - final message = e is ApiException ? e.message : e.toString(); - emit(state.copyWith(errorMessage: message)); + final message = e is ApiException ? e.message : '验证码发送失败,请重试'; + emit( + state.copyWith( + status: FormzSubmissionStatus.failure, + errorMessage: message, + ), + ); + return false; } } diff --git a/apps/lib/features/auth/ui/screens/register_verification_screen.dart b/apps/lib/features/auth/ui/screens/register_verification_screen.dart index 547767f..cc0e4ff 100644 --- a/apps/lib/features/auth/ui/screens/register_verification_screen.dart +++ b/apps/lib/features/auth/ui/screens/register_verification_screen.dart @@ -94,9 +94,9 @@ class _RegisterVerificationViewState extends State { Future _handleResendCode() async { final cubit = context.read(); - await cubit.resendCode(); + final success = await cubit.resendCode(); - if (cubit.state.codeSent && mounted) { + if (success && mounted) { _startCountdown(); } } diff --git a/apps/test/features/auth/presentation/cubits/register_cubit_test.dart b/apps/test/features/auth/presentation/cubits/register_cubit_test.dart index d85f41e..2afcf8a 100644 --- a/apps/test/features/auth/presentation/cubits/register_cubit_test.dart +++ b/apps/test/features/auth/presentation/cubits/register_cubit_test.dart @@ -21,6 +21,7 @@ void main() { registerFallbackValue( SignupStartRequest(username: '', email: '', password: ''), ); + registerFallbackValue(SignupResendRequest(email: '')); }); tearDown(() { @@ -145,4 +146,61 @@ void main() { }, ); }); + + group('resendCode', () { + blocTest( + 'returns true and sets status on success', + build: () => cubit, + seed: () => RegisterState(pendingEmail: 'test@example.com'), + setUp: () { + when(() => mockRepository.signupResend(any())).thenAnswer( + (_) async => SignupStartResponse( + status: 'ok', + email: 'test@example.com', + message: 'Code sent', + ), + ); + }, + act: (c) => c.resendCode(), + expect: () => [ + isA().having( + (s) => s.status, + 'status', + FormzSubmissionStatus.inProgress, + ), + isA().having( + (s) => s.status, + 'status', + FormzSubmissionStatus.success, + ), + ], + verify: (_) { + verify(() => mockRepository.signupResend(any())).called(1); + }, + ); + + blocTest( + 'returns false on error', + build: () => cubit, + seed: () => RegisterState(pendingEmail: 'test@example.com'), + setUp: () { + when( + () => mockRepository.signupResend(any()), + ).thenThrow(ServerException('Network error')); + }, + act: (c) => c.resendCode(), + expect: () => [ + isA().having( + (s) => s.status, + 'status', + FormzSubmissionStatus.inProgress, + ), + isA().having( + (s) => s.status, + 'status', + FormzSubmissionStatus.failure, + ), + ], + ); + }); }