Files
eatvio_app/lib/features/registration/presentation/pages/webview_registration_screen.dart
2025-06-20 14:12:54 +03:00

98 lines
2.8 KiB
Dart

import 'dart:convert';
import 'dart:developer';
import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebViewRegistrationScreen extends StatefulWidget {
const WebViewRegistrationScreen({super.key});
@override
State<WebViewRegistrationScreen> createState() => _WebViewRegistrationScreenState();
}
class _WebViewRegistrationScreenState extends State<WebViewRegistrationScreen> {
late final WebViewController _controller;
late final AuthCubit authCubit;
String? email;
String? password;
@override
void initState() {
super.initState();
authCubit = sl<AuthCubit>();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel(
'flutter_inject',
onMessageReceived: (JavaScriptMessage message) {
final data = jsonDecode(message.message);
if (data['type'] == 'email') {
email = data['value'];
log("Email: $email");
} else if (data['type'] == 'password') {
password = data['value'];
log("Password: $password");
}
},
)
..setNavigationDelegate(
NavigationDelegate(
onNavigationRequest: (NavigationRequest request) {
if (request.url.contains('profile')) {
authCubit.getTokenByCredentials(
email!,
password!,
);
}
return NavigationDecision.navigate;
},
),
)
..loadRequest(Uri.parse('$baseUrl/registration/step1'));
_injectJavaScript();
}
void _injectJavaScript() async {
await Future.delayed(const Duration(seconds: 2));
_controller.runJavaScript('''
function sendMessageToFlutter(data) {
window.flutter_inject.postMessage(JSON.stringify(data));
}
function trackInputChanges() {
let emailField = document.getElementById('inputEmail');
let passwordField = document.getElementById('inputPassword');
if (emailField && passwordField) {
emailField.addEventListener('input', function() {
sendMessageToFlutter({ type: 'email', value: emailField.value });
});
passwordField.addEventListener('input', function() {
sendMessageToFlutter({ type: 'password', value: passwordField.value });
});
}
}
trackInputChanges();
''');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
toolbarHeight: 0,
),
body: SafeArea(
child: WebViewWidget(controller: _controller),
),
);
}
}