From f333e9822104211a754c3cffa10b205337882c1b Mon Sep 17 00:00:00 2001 From: BLoC Date: Wed, 12 Feb 2025 16:32:11 +0300 Subject: [PATCH] fix: webview logic --- .../auth/auth_screen/auth_screen.dart | 98 ++++++++----------- 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/lib/features/auth/auth_screen/auth_screen.dart b/lib/features/auth/auth_screen/auth_screen.dart index 3fbc57e3..eebe03ac 100644 --- a/lib/features/auth/auth_screen/auth_screen.dart +++ b/lib/features/auth/auth_screen/auth_screen.dart @@ -30,17 +30,38 @@ class _AuthScreenState extends State { String email = ''; String password = ''; + bool needLogout = false; - Future logout() async { + 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) @@ -54,66 +75,25 @@ class _AuthScreenState extends State { ) ..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(); - } + onPageFinished: (String url) async { + if (needLogout) { + await logoutFromWeb(); + needLogout = false; + } else if (!url.contains('profile') && !url.contains('registration')) { + await _controller.runJavaScript(jsChannelAuthScript); + } else if (url.contains('profile')) { + await CredentialsStorage.saveCredentials(email, password); + await loginInApplication(); + } else { + 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) { + await loginInApplication(); } } - 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); }, ), )