import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/utils/toasts.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:go_router/go_router.dart'; class VerifyEmailScreen extends StatefulWidget { const VerifyEmailScreen({super.key}); @override State createState() => _VerifyEmailScreenState(); } class _VerifyEmailScreenState extends State { final List _focusNodes = List.generate(4, (_) => FocusNode()); final List _controllers = List.generate(4, (_) => TextEditingController()); String email = ''; late final GoRouter goRouter; @override void initState() { super.initState(); goRouter = GoRouter.of(context); } @override void dispose() { for (var controller in _controllers) { controller.dispose(); } for (var node in _focusNodes) { node.dispose(); } super.dispose(); } void _checkAndSubmitCode(BuildContext context) { final code = _controllers.map((c) => c.text).join(); if (code.length == 4) { context.read().tryVerify(code); } } @override Widget build(BuildContext context) { return BlocProvider( create: (_) => sl()..sendEmailCode(), child: BlocConsumer( listener: (context, state) { if (state is VerifyEmailStateLoaded) { setState(() { email = state.email; }); } else if (state is VerifyEmailStateVerifySuccess) { showSuccessToast('Почта успешно подтверждена'); goRouter.pushNamed('feedScreen'); } else if (state is VerifyEmailStateVerifyError) { showErrorToast("Неверный код. Попробуйте снова."); for (var controller in _controllers) { controller.clear(); } FocusScope.of(context).requestFocus(_focusNodes[0]); } }, builder: (context, state) { return Scaffold( appBar: AppBar(title: const Text("Подтвердите почту")), body: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, 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(); }, child: const Text("Не приходит код?"), ), ], ), ), ); }, ), ); } Widget _buildCodeField(BuildContext context, int index) { return SizedBox( width: 50, child: TextField( controller: _controllers[index], focusNode: _focusNodes[index], keyboardType: TextInputType.number, textAlign: TextAlign.center, maxLength: 1, style: const TextStyle(fontSize: 24), decoration: InputDecoration( counterText: "", border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.0)), ), onChanged: (value) { if (value.isNotEmpty && index < 3) { FocusScope.of(context).requestFocus(_focusNodes[index + 1]); } if (value.isEmpty && index > 0) { FocusScope.of(context).requestFocus(_focusNodes[index - 1]); } _checkAndSubmitCode(context); }, ), ); } }