import 'dart:async'; import 'package:easy_debounce/easy_debounce.dart'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/utils/image_constant.dart'; import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:eatvio_app/features/auth/presentation/bloc/auth_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher.dart'; import '../bloc/auth_state.dart'; class AuthScreen extends StatefulWidget { const AuthScreen({super.key}); @override State createState() => _AuthScreenState(); } class _AuthScreenState extends State { final emailController = TextEditingController(); final passwordController = TextEditingController(); bool checkboxState = false; bool hidePassword = true; final authCubit = sl(); late StreamSubscription keyboardSubscription; bool isFocused = false; int tapsCount = 0; @override void initState() { super.initState(); var keyboardVisibilityController = KeyboardVisibilityController(); keyboardSubscription = keyboardVisibilityController.onChange.listen((bool visible) { setState(() { isFocused = visible; }); }); } @override Widget build(BuildContext context) { final s = S.of(context); FlutterNativeSplash.remove(); return BlocProvider( create: (BuildContext context) => authCubit, child: BlocBuilder( builder: (BuildContext context, AuthState state) { return Scaffold( appBar: AppBar( centerTitle: true, toolbarHeight: isFocused ? 64 : MediaQuery.of(context).size.width - 64, title: GestureDetector( onTap: () { tapsCount++; if (tapsCount == 6) { tapsCount = 0; // showModalBottomSheet(context: context, builder: (context) => ); } EasyDebounce.debounce('change env', Durations.medium4, () { tapsCount = 0; }); }, child: SvgPicture.asset( ImageConstant.imgLogoEatvio, height: isFocused ? 64 : MediaQuery.of(context).size.width - 64, fit: BoxFit.contain, ), ), ), body: SafeArea( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(s.email), const SizedBox(height: 4), CustomTextFormField( controller: emailController, textInputAction: TextInputAction.next, keyboardType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress, hintText: 'Введите email', ), const SizedBox(height: 16), Text(s.password), const SizedBox(height: 4), CustomTextFormField( obscureText: hidePassword, controller: passwordController, hintText: 'Введите пароль', suffix: IconButton( onPressed: () { setState(() { hidePassword = !hidePassword; }); }, icon: Icon( hidePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, color: Colors.grey, ), ), ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Нет аккаунта? '), GestureDetector( onTap: () => GoRouter.of(context).goNamed('webViewRegistrationScreen'), child: Text( 'Зарегистрироваться', style: TextStyle( color: appTheme.blueA400, decorationColor: appTheme.blueA400, decoration: TextDecoration.underline, ), ), ), ], ), const Spacer(), Center( child: RichText( textAlign: TextAlign.center, text: TextSpan( text: 'Нажимая "Войти", Вы соглашаетесь \n', style: const TextStyle( fontSize: 12, color: Colors.black, ), children: [ const TextSpan(text: 'c '), TextSpan( text: ' Публичной офертой', style: TextStyle( fontSize: 12, color: appTheme.blueA400, decorationColor: appTheme.blueA400, decoration: TextDecoration.underline, ), recognizer: TapGestureRecognizer()..onTap = () async => await launchUrl(Uri.parse('$baseUrl/oferta_bs.pdf')), ), ], ), ), ), const SizedBox(height: 16), SizedBox( height: 48, width: MediaQuery.of(context).size.width - 32, child: FloatingActionButton.extended( heroTag: 'authButton', highlightElevation: 0, elevation: 0, focusElevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), backgroundColor: state is AuthStateLoading ? Colors.black.withAlpha(50) : appTheme.blueA400, onPressed: state is AuthStateLoading ? null : () async { final isAuthenticated = await authCubit.getTokenByCredentials( emailController.text, passwordController.text, ); if (isAuthenticated) { if (context.mounted) { context.read().getMyProfile(); context.read().getChatRoomsWithLoading(); } } }, label: state is AuthStateLoading ? const CupertinoActivityIndicator() : Text( 'Войти', style: theme.textTheme.titleSmall!.copyWith(color: Colors.white), ), ), ), ], ), ), ), ); }, ), ); } }