11import 'package:client/appConstants.dart' ;
2+ import 'package:client/appLocalizations.dart' ;
3+ import 'package:client/components/toastNotification.dart' ;
24import 'package:flutter/foundation.dart' ;
35import 'package:flutter/gestures.dart' ;
46import 'package:flutter/material.dart' ;
57import 'package:flutter_spinkit/flutter_spinkit.dart' ;
6- import 'package:webview_flutter/webview_flutter .dart' ;
8+ import 'package:flutter_inappwebview/flutter_inappwebview .dart' ;
79
810class OAuthHandler extends StatefulWidget {
911 final String authUrl;
1012 final Function promptForCredentials;
1113 final Function (String ) authCompleted;
14+ final Function errorOccured;
1215
13- OAuthHandler ({Key key, this .authUrl, this .promptForCredentials, this .authCompleted}) : super (key: key);
16+ OAuthHandler ({Key key, this .authUrl, this .promptForCredentials, this .authCompleted, this .errorOccured }) : super (key: key);
1417
1518 @override
16- _OAuthHandlerState createState () => new _OAuthHandlerState (authUrl, promptForCredentials, authCompleted);
19+ _OAuthHandlerState createState () => new _OAuthHandlerState (authUrl, promptForCredentials, authCompleted, errorOccured );
1720}
1821
1922class _OAuthHandlerState extends State <OAuthHandler > {
2023 final String authUrl;
2124 final Function promptForCredentials;
2225 final Function (String ) authCompleted;
26+ final Function errorOccured;
2327 String authOrigin;
24- WebViewController _controller;
28+ InAppWebViewController _controller;
2529 bool _loadingInProgress = false ;
2630
27- _OAuthHandlerState (this .authUrl, this .promptForCredentials, this .authCompleted);
31+ _OAuthHandlerState (this .authUrl, this .promptForCredentials, this .authCompleted, this .errorOccured );
2832
2933 @override
3034 initState () {
@@ -46,25 +50,37 @@ class _OAuthHandlerState extends State<OAuthHandler> {
4650 Visibility (
4751 visible: ! _loadingInProgress,
4852 maintainState: true ,
49- child: WebView (
53+ child: InAppWebView (
5054 initialUrl: authUrl,
51- userAgent: "Mozilla/5.0 Google" ,
55+ initialOptions: InAppWebViewGroupOptions (
56+ crossPlatform: InAppWebViewOptions (
57+ userAgent: 'Mozilla/5.0 Google'
58+ )
59+ ),
5260 gestureRecognizers: Set ()
5361 ..add (Factory <VerticalDragGestureRecognizer >(
5462 () => VerticalDragGestureRecognizer ()
5563 )
5664 ),
57- javascriptMode: JavascriptMode .unrestricted,
58- onWebViewCreated: (WebViewController webViewController) {
59- _controller = webViewController;
65+ onWebViewCreated: (InAppWebViewController controller) {
66+ _controller = controller;
67+ _controller.addJavaScriptHandler (handlerName: 'handleOAuthResponse' , callback: (args) {
68+ authCompleted (args[0 ]);
69+ });
70+
71+ },
72+ onLoadError: (InAppWebViewController controller, String url, int code, String message) async {
73+ errorOccured ();
74+ return ;
6075 },
61- javascriptChannels: < JavascriptChannel > [
62- _extractData (context),
63- ].toSet (),
64- onPageFinished: (String url) {
76+ onLoadHttpError: (InAppWebViewController controller, String url, int statusCode, String description) async {
77+ errorOccured ();
78+ return ;
79+ },
80+ onLoadStop: (InAppWebViewController controller, String url) async {
6581 // in case redirect url is requested, expected content will be already present
6682 if (url.startsWith (authOrigin)) {
67- _controller.evaluateJavascript ("(function(){OAuth.postMessage( document.documentElement.innerText)})();" );
83+ _controller.evaluateJavascript (source : "(function(){window.flutter_inappwebview.callHandler('handleOAuthResponse', document.documentElement.innerText)})();" );
6884 return ;
6985 }
7086
@@ -75,22 +91,18 @@ class _OAuthHandlerState extends State<OAuthHandler> {
7591 return ;
7692 }
7793 },
78- onPageStarted: (_) => { setState (() { _loadingInProgress = true ; }) },
79- gestureNavigationEnabled: true ,
94+ onLoadStart: (InAppWebViewController controller, String url) {
95+ if (url.startsWith (authOrigin))
96+ setState (() { _loadingInProgress = true ; });
97+ },
98+ onReceivedServerTrustAuthRequest: (InAppWebViewController controller, ServerTrustChallenge challenge) async {
99+ return ServerTrustAuthResponse (action: ServerTrustAuthResponseAction .PROCEED );
100+ }
80101 )
81102 )
82103 ]
83104 );
84105 }
85106 );
86107 }
87-
88- JavascriptChannel _extractData (BuildContext context) {
89- return JavascriptChannel (
90- name: 'OAuth' ,
91- onMessageReceived: (JavascriptMessage message) {
92- authCompleted (message.message);
93- },
94- );
95- }
96108}
0 commit comments