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 = ''; bool needLogout = false; Future logoutFromWeb() async { await CredentialsStorage.removeCredentials(); await _controller.runJavaScript(''' document.querySelector('.header-list__link button[type="submit"]').click(); '''); } Future loginInApplication() async { 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); await Future.delayed(Duration.zero, () => GoRouter.of(context).go('/my-profile-screen')); await sl().getMyProfile(); } @override void initState() { super.initState(); needLogout = widget.needLogout; _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..addJavaScriptChannel( 'FlutterChannel', onMessageReceived: (JavaScriptMessage message) { final data = jsonDecode(message.message); email = data['email']; password = data['password']; }, ) ..setNavigationDelegate( NavigationDelegate( onPageFinished: (String url) async { final bool tokenInStorage = await TokenStorage.haveTokenInStorage(); final bool credentialsInStorage = await CredentialsStorage.haveCredentialsInStorage(); if (needLogout) { await logoutFromWeb(); needLogout = false; } else if (!url.contains('profile') && !url.contains('registration')) { await _controller.runJavaScript(jsChannelAuthScript); } else if (url.contains('profile')) { if (credentialsInStorage) { await loginInApplication(); } else { if (email.isNotEmpty && password.isNotEmpty) { await CredentialsStorage.saveCredentials(email, password); await loginInApplication(); } else { await logoutFromWeb(); } } } else { if (tokenInStorage && credentialsInStorage) { GoRouter.of(context).go('/my-profile-screen'); } else if (!tokenInStorage && credentialsInStorage) { await loginInApplication(); } } }, ), ) ..loadRequest(Uri.parse(baseUrl)); } @override Widget build(BuildContext context) { FlutterNativeSplash.remove(); return Scaffold( appBar: AppBar( toolbarHeight: 0, ), body: SafeArea( child: WebViewWidget(controller: _controller), ), ); } }