import 'dart:convert'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/credentials_storage.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/features/auth/const/strings.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; class AuthScreen extends StatefulWidget { final bool needLogout; const AuthScreen({ this.needLogout = false, }); @override State createState() => _AuthScreenState(); } class _AuthScreenState extends State { bool checkboxState = false; bool hidePassword = true; final baseUrlController = TextEditingController(); late final WebViewController _controller; String email = ''; String password = ''; Future logout() async { await CredentialsStorage.removeCredentials(); await _controller.runJavaScript(''' document.querySelector('.header-list__link button[type="submit"]').click(); '''); } @override void initState() { super.initState(); _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..addJavaScriptChannel( 'FlutterChannel', onMessageReceived: (JavaScriptMessage message) { final data = jsonDecode(message.message); email = data['email']; password = data['password']; }, ) ..setNavigationDelegate( NavigationDelegate( onNavigationRequest: (NavigationRequest navigationRequest) async { if (navigationRequest.url.contains('profile')) { if (await CredentialsStorage.haveCredentialsInStorage()) { email = (await CredentialsStorage.getCredentialsFromStorage())['email']!; password = (await CredentialsStorage.getCredentialsFromStorage())['password']!; } else { if (email.isNotEmpty && password.isNotEmpty && !(await TokenStorage.haveTokenInStorage())) { await CredentialsStorage.saveCredentials(email, password); try { final Map credentials = { 'email': email, 'password': password, }; final response = await http.post( Uri.parse(baseUrl + '/api/login'), headers: {'Content-Type': 'application/json'}, body: json.encode(credentials), encoding: utf8, ); var res = await jsonDecode(response.body); final token = res['token']; await TokenStorage.saveTokenInStorage(token); GoRouter.of(context).go('/my-profile-screen'); await sl().getMyProfile(); } catch (e) { print(e); } } else { await logout(); } } } return NavigationDecision.navigate; }, onPageStarted: (String url) async { final bool tokenInStorage = await TokenStorage.haveTokenInStorage(); final bool credentialsInStorage = await CredentialsStorage.haveCredentialsInStorage(); if (tokenInStorage && credentialsInStorage) { GoRouter.of(context).go('/my-profile-screen'); } else if (!tokenInStorage && credentialsInStorage) { final credentialsFromStorage = await CredentialsStorage.getCredentialsFromStorage(); final Map credentials = { 'email': credentialsFromStorage['email']!, 'password': credentialsFromStorage['password']!, }; final response = await http.post( Uri.parse(baseUrl + '/api/login'), headers: {'Content-Type': 'application/json'}, body: json.encode(credentials), encoding: utf8, ); var res = await jsonDecode(response.body); final token = res['token']; await TokenStorage.saveTokenInStorage(token); GoRouter.of(context).go('/my-profile-screen'); await sl().getMyProfile(); } }, onPageFinished: (String url) async { await _controller.runJavaScript(jsChannelAuthScript); }, ), ) ..loadRequest(Uri.parse(baseUrl)); } @override Widget build(BuildContext context) { FlutterNativeSplash.remove(); return Scaffold( appBar: AppBar( toolbarHeight: 0, ), body: SafeArea( child: WebViewWidget(controller: _controller), ), ); } }