From 48f5b642230c70fe3c32406c754028ff03975355 Mon Sep 17 00:00:00 2001 From: Username1548 Date: Thu, 14 Aug 2025 16:54:13 +0300 Subject: [PATCH 1/3] feat(emailVerification): added timer for email code resending --- .../pages/verify_email_screen.dart | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/lib/features/registration/presentation/pages/verify_email_screen.dart b/lib/features/registration/presentation/pages/verify_email_screen.dart index ed4ea11f..b05b40a0 100644 --- a/lib/features/registration/presentation/pages/verify_email_screen.dart +++ b/lib/features/registration/presentation/pages/verify_email_screen.dart @@ -1,9 +1,15 @@ +import 'dart:async'; + import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/utils/toasts.dart'; +import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_cubit.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:go_router/go_router.dart'; class VerifyEmailScreen extends StatefulWidget { @@ -18,11 +24,15 @@ class _VerifyEmailScreenState extends State { final List _controllers = List.generate(4, (_) => TextEditingController()); String email = ''; late final GoRouter goRouter; - + late Timer _timer; + int _secondsRemaining = 60; + bool _canSendAgain = false; @override void initState() { super.initState(); goRouter = GoRouter.of(context); + FlutterNativeSplash.remove(); + _startTimer(); } @override @@ -36,6 +46,23 @@ class _VerifyEmailScreenState extends State { super.dispose(); } + void _startTimer() { + setState(() { + _canSendAgain = false; + _secondsRemaining = 60; + }); + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + setState(() { + if (_secondsRemaining > 0) { + _secondsRemaining--; + } else { + _canSendAgain = true; + _timer.cancel(); + } + }); + }); + } + void _checkAndSubmitCode(BuildContext context) { final code = _controllers.map((c) => c.text).join(); if (code.length == 4) { @@ -74,18 +101,25 @@ class _VerifyEmailScreenState extends State { children: [ Text("Код отправлен на почту\n$email", textAlign: TextAlign.center), const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: List.generate(4, (index) => _buildCodeField(context, index)), - ), - const SizedBox(height: 20), - const Text("Запросить код повторно", style: TextStyle(color: Colors.grey)), - TextButton( - onPressed: () { - context.read().sendEmailCode(); + Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: List.generate(4, (index) => _buildCodeField(context, index))), + const SizedBox(height: 40), + CustomOutlinedButton( + text: 'Запросить код повторно', + height: 52, + isDisabled: !_canSendAgain, + buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700), + buttonStyle: ButtonStyle( + side: const WidgetStatePropertyAll(BorderSide.none), + backgroundColor: WidgetStatePropertyAll(_canSendAgain ? appTheme.blueA400 : appTheme.gray), + ), + onPressed: () async { + await context.read().sendEmailCode(); + _startTimer(); }, - child: const Text("Не приходит код?"), ), + const SizedBox(height: 8), + if (!_canSendAgain) + Text("Зпросить код повторно можно через $_secondsRemaining с.", style: TextStyles.textSMedium.copyWith(color: appTheme.gray)), ], ), ), From 62c0914fe27ce099a84ac6a7aae8a9934541940d Mon Sep 17 00:00:00 2001 From: Username1548 Date: Thu, 14 Aug 2025 16:55:15 +0300 Subject: [PATCH 2/3] fix --- .../registration/presentation/pages/verify_email_screen.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/features/registration/presentation/pages/verify_email_screen.dart b/lib/features/registration/presentation/pages/verify_email_screen.dart index b05b40a0..311eb219 100644 --- a/lib/features/registration/presentation/pages/verify_email_screen.dart +++ b/lib/features/registration/presentation/pages/verify_email_screen.dart @@ -30,8 +30,7 @@ class _VerifyEmailScreenState extends State { @override void initState() { super.initState(); - goRouter = GoRouter.of(context); - FlutterNativeSplash.remove(); + goRouter = GoRouter.of(context); _startTimer(); } From 45774c38755dd97abc0f5184e6d316ce7f6ad4e2 Mon Sep 17 00:00:00 2001 From: Username1548 Date: Thu, 14 Aug 2025 16:58:00 +0300 Subject: [PATCH 3/3] fix --- .../registration/presentation/pages/verify_email_screen.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/features/registration/presentation/pages/verify_email_screen.dart b/lib/features/registration/presentation/pages/verify_email_screen.dart index 311eb219..f50d4960 100644 --- a/lib/features/registration/presentation/pages/verify_email_screen.dart +++ b/lib/features/registration/presentation/pages/verify_email_screen.dart @@ -9,7 +9,6 @@ import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_ import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:go_router/go_router.dart'; class VerifyEmailScreen extends StatefulWidget {