import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:percent_indicator/circular_percent_indicator.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../config/size.dart'; import '../../config/style.dart'; import '../../utils/text_style.dart'; class OAuthPageView extends StatefulWidget { final String provider; final String? appleUrl; const OAuthPageView({Key? key, required this.provider, this.appleUrl}) : super(key: key); @override State createState() => _OAuthPageViewState(); } class _OAuthPageViewState extends State { late final WebViewController _controller; int? progress; @override void initState() { super.initState(); // Initialize the WebViewController _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setUserAgent('random') ..setNavigationDelegate( NavigationDelegate( onProgress: (int progressValue) { setState(() { progress = progressValue; }); if (progressValue == 100) { setState(() { progress = null; }); } }, onPageFinished: (String url) { log(url.toString()); setState(() { progress = null; }); }, // onPageFinished: (String url) { // if (widget.appleUrl != null) { // if (url.startsWith('https://server.muaawana.com/signin/oauth2/redirect') || // url.startsWith('https://muaawana.com/signin/oauth2/redirect')) { // readResponse(context); // } // } // log(url.toString()); // }, onNavigationRequest: (NavigationRequest request) async { if (request.url.startsWith('https://server.muaawana.com/signin/oauth2/redirect')) { final responseUrl = Uri.parse(request.url); final token = responseUrl.queryParameters['token']; if (token != null) { // The token is in the URL, so we can pop immediately if (mounted) { Navigator.pop(context, token); } } else if (responseUrl.queryParameters['error'] != null) { final decodedErrorString = Uri.decodeComponent(responseUrl.queryParameters['error']!); Get.showSnackbar( GetSnackBar( title: "Sign in Error", message: decodedErrorString, duration: const Duration(seconds: 5), ), ); if (mounted) { Navigator.pop(context); } } return NavigationDecision.prevent; } return NavigationDecision.navigate; }, // onNavigationRequest: (NavigationRequest request) { // if (request.url.startsWith('https://server.muaawana.com/signin/oauth2/redirect')) { // var responseUrl = Uri.parse(request.url); // // if (responseUrl.query.split("=")[0] == "error") { // final decodedErrorString = Uri.decodeComponent(responseUrl.query.split("=")[1]); // Get.showSnackbar( // GetSnackBar( // title: "Sign in Error", // message: decodedErrorString, // duration: const Duration(seconds: 5), // ), // ); // // Since it's an error, just pop without returning a token // Navigator.pop(context); // } // log(responseUrl.toString()); // // readResponse(context); // //Navigator.pop(context, responseUrl); // // return NavigationDecision.prevent; // } // return NavigationDecision.navigate; // }, ), ) ..loadRequest(Uri.parse( 'https://server.muaawana.com/oauth2/authorize/google?redirect_uri=https://server.muaawana.com/signin/oauth2/redirect')); } void readResponse(BuildContext context) async { try { final value = await _controller.runJavaScriptReturningResult("document.documentElement.innerHTML"); if (value.toString().contains("id_token")) { final res = value.toString().split('id_token'); final result = res[1].replaceAll('"', ''); final result1 = result.replaceAll('/', ''); final result2 = result1.replaceAll(r'\}\u003Cpre>\u003Cbody>', ''); final result3 = result2.replaceAll(r'\\', ''); final result4 = result3.replaceAll(r'\:\', ''); Navigator.pop(context, result4); } else { Navigator.pop(context); } } catch (e) { log('Error reading response: $e'); Navigator.pop(context); } } @override Widget build(BuildContext context) { final hm = SizeConfig.heightMultiplier; final wm = SizeConfig.widthMultiplier; return Scaffold( body: Center( child: Stack( children: [ WebViewWidget(controller: _controller), Padding( padding: EdgeInsetsDirectional.only(start: wm * 2.0, bottom: hm * 2), child: SizedBox( width: wm * 10, height: hm * 8, child: IconButton( icon: Icon( Icons.arrow_back_ios, color: Colors.black, size: wm * 7, ), onPressed: () => Navigator.pop(context), ), ), ), if (progress != null) Center( child: CircularPercentIndicator( radius: SizeConfig.widthMultiplier * 12, lineWidth: SizeConfig.widthMultiplier, animation: false, percent: progress! / 100, center: Text("$progress%", style: tS('pop_regular', SizeConfig.textMultiplier * 2.5, FontWeight.normal, Colors.black)), circularStrokeCap: CircularStrokeCap.round, progressColor: AppStyle.primary, ), ), ], ), ), ); } }