import 'dart:convert'; import 'package:eatvio_app/core/app_export.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:eatvio_app/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:url_launcher/url_launcher.dart'; import 'package:validators/validators.dart'; import 'bloc/auth_bloc.dart'; import 'models/auth_model.dart'; class AuthScreen extends StatefulWidget { static Widget builder(BuildContext context) { return BlocProvider( create: (context) => AuthBloc( AuthState( authModelObj: AuthModel(), ), )..add( AuthInitialEvent(), ), child: AuthScreen(), ); } @override State createState() => _AuthScreenState(); } class _AuthScreenState extends State { bool checkboxState = false; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: true, title: AppbarTitleImage(imagePath: ImageConstant.imgLogoEatvio), ), body: Padding( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("email".tr), SizedBox(height: 4), BlocSelector( selector: (state) => state.emailController, builder: (context, emailController) { return CustomTextFormField( controller: emailController, textInputAction: TextInputAction.next, textInputType: TextInputType.emailAddress, hintText: 'Введите email', ); }, ), SizedBox(height: 16), Text("password".tr), SizedBox(height: 4), BlocSelector( selector: (state) => state.passwordController, builder: (context, passwordController) { return CustomTextFormField( obscureText: true, controller: passwordController, hintText: 'Введите пароль', ); }, ), SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Нет аккаунта? '), GestureDetector( onTap: () => GoRouter.of(context).goNamed('registrationScreen'), child: Text( 'Зарегистрироваться', style: TextStyle( color: appTheme.blueA400, decorationColor: appTheme.blueA400, decoration: TextDecoration.underline, ), ), ), ], ), Spacer(), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Нажимая "Войти", Вы соглашаетесь с ', style: TextStyle( fontSize: 12, ), ), GestureDetector( onTap: () async { await launchUrl(Uri.parse(baseUrl + '/oferta_bs.pdf')); }, child: Text( 'Публичной офертой', style: TextStyle( fontSize: 12, color: appTheme.blueA400, decorationColor: appTheme.blueA400, decoration: TextDecoration.underline, ), ), ), ], ), SizedBox(height: 16), BlocBuilder( builder: (context, state) { return Container( height: 48, width: MediaQuery.of(context).size.width - 32, child: FloatingActionButton.extended( heroTag: 'nextButtonRegistration', highlightElevation: 0, elevation: 0, focusElevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), backgroundColor: appTheme.blueA400, onPressed: onTapAuth(state, context), label: Text( 'Войти', style: theme.textTheme.titleSmall, ), ), ); }, ), ], ), ), ); } onTapAuth(AuthState state, BuildContext context) { return () async { List errors = validateFields(state.emailController!.text, state.passwordController!.text); if (errors.isEmpty) { final Map credentials = { 'email': state.emailController!.text, 'password': state.passwordController!.text, }; final response = await http.post( Uri.parse(baseUrl + '/api/login'), headers: {'Content-Type': 'application/json'}, body: json.encode(credentials), encoding: utf8, ); print(response.statusCode); if (response.statusCode == 200) { var res = await jsonDecode(response.body); final box = await Hive.openBox('token'); final token = res['token']; box.put('token', token); await TokenStorage.saveTokenInStorage(token); GoRouter.of(context).go('/my-profile-screen'); } else { showDialog( context: context, builder: (context) => AlertDialog( title: Text('Ошибка'), content: Text('wrong_credentials'.tr), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text('OK'), ), ], ), ); } } else { String errorMessage = ''; for (var error in errors) { errorMessage += error + '\n\n'; } showDialog( context: context, builder: (context) => AlertDialog( title: Text('Ошибка'), content: Text(errorMessage), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text('OK'), ), ], ), ); } }; } List validateFields(String email, String password) { List errors = []; if (!isEmail(email)) { errors.add('email_invalid'.tr); } if (email.isEmpty) { errors.add('email_empty'.tr); } if (password.isEmpty) { errors.add('password_empty'.tr); } if (password.length < 6) { errors.add('password_short'.tr); } return errors; } }