1- import 'dart:convert' ;
21import 'dart:io' ;
32
43import 'package:file_picker/file_picker.dart' ;
@@ -16,22 +15,33 @@ typedef OnNewMessage = void Function();
1615typedef OnError = void Function (String message);
1716
1817class Webview extends StatefulWidget {
18+ /// The unique identifier of the channel
1919 final String channelId;
20+
21+ /// The user information to be passed to the widget
2022 final Map <String , dynamic >? user;
23+
24+ /// Callback when the widget has loaded
2125 final OnLoaded ? onLoaded;
26+
27+ /// Callback when the widget has been closed
2228 final OnClosed ? onClosedWidget;
29+
30+ /// Callback when a new message has been received
2331 final OnNewMessage ? onNewMessage;
32+
33+ /// Callback when an error has occurred
2434 final OnError ? onError;
2535
2636 const Webview ({
27- Key ? key,
37+ super . key,
2838 required this .channelId,
2939 this .user,
3040 this .onLoaded,
3141 this .onClosedWidget,
3242 this .onNewMessage,
3343 this .onError,
34- }) : super (key : key) ;
44+ });
3545
3646 @override
3747 State <Webview > createState () => WebviewState ();
@@ -72,7 +82,7 @@ class WebviewState extends State<Webview> {
7282
7383 /// Handles JavaScript messages received from the WebView
7484 void _handleJavaScriptMessage (JavaScriptMessage message) {
75- final parsedData = _parseJson (message.message);
85+ final parsedData = parseJson (message.message);
7686
7787 switch (parsedData['event' ]) {
7888 case 'closed' :
@@ -93,15 +103,6 @@ class WebviewState extends State<Webview> {
93103 }
94104 }
95105
96- /// Safely parses a JSON string into a Map
97- Map <String , dynamic > _parseJson (String message) {
98- try {
99- return jsonDecode (message) as Map <String , dynamic >;
100- } catch (e) {
101- return {};
102- }
103- }
104-
105106 /// Creates a NavigationDelegate for the WebView
106107 NavigationDelegate _createNavigationDelegate () {
107108 return NavigationDelegate (
@@ -203,6 +204,12 @@ class WebviewState extends State<Webview> {
203204
204205 /// Displays an external WebView when the URL is outside the widgetUrl
205206 void _showExternalWebView (String url) {
207+ Uri uri = Uri .parse (url);
208+
209+ if (uri.scheme != 'https' && uri.scheme != 'http' ) {
210+ return ;
211+ }
212+
206213 _externalController = WebViewController ()
207214 ..setJavaScriptMode (JavaScriptMode .unrestricted)
208215 ..loadRequest (Uri .parse (url));
0 commit comments