load method

dynamic load()

Implementation

load() async {
  setState(() {
    errorOccurred = false;
  });
  final prefs = await SharedPreferences.getInstance();
  if (!prefs.containsKey(solidChatSessionIdKey)) {
    await prefs.setString(solidChatSessionIdKey, Uuid().v4());
  }

  controller =
      WebViewController()
        ..setJavaScriptMode(JavaScriptMode.unrestricted)
        ..clearCache()
        ..clearLocalStorage()
        ..setNavigationDelegate(
          NavigationDelegate(
            onNavigationRequest: (NavigationRequest request) {
              if (request.url.contains('solidchat')) {
                return NavigationDecision.navigate;
              }
              return NavigationDecision.prevent;
            },
          ),
        )
        ..addJavaScriptChannel(
          'mobileSdk',
          onMessageReceived: (JavaScriptMessage message) {
            var payload = jsonDecode(message.message);
            if (payload['action'] == 'close') {
              close();
              return;
            }
            if (payload['action'] == 'link') {
              var link = payload['link'] as String;
              try {
                launchUrl(
                  Uri.parse(link),
                  mode:
                      link.contains('solidchat')
                          ? LaunchMode.externalApplication
                          : LaunchMode.platformDefault,
                );
              } catch (_) {}
            }
            if (payload['action'] == 'route') {
              var href = payload['href'] as String;
              setState(() {
                backgroundColor =
                    href.contains('conversation_')
                        ? Color(0xFFF5F5F5)
                        : Colors.white;
              });
            }
          },
        )
        ..setNavigationDelegate(
          NavigationDelegate(
            onProgress: (int current) {
              setState(() {
                progress = current;
                _progressAnimation = Tween<double>(
                  begin: _progressAnimation.value,
                  end: current / 100,
                ).animate(_animationController);
                _animationController.forward(from: 0);
              });
            },
            onPageStarted: (String url) {},
            onPageFinished: (String url) {},
            onNavigationRequest: (NavigationRequest request) {
              return NavigationDecision.navigate;
            },
            onHttpError: (err) {
              if (err.request?.uri.toString().contains('sentry') ?? true) {
                return;
              }
              setState(() {
                errorOccurred = true;
              });
            },
            onWebResourceError: (err) {
              setState(() {
                errorOccurred = true;
              });
            },
          ),
        );

  await controller.setJavaScriptMode(JavaScriptMode.unrestricted);
  if (controller.platform is WebKitWebViewController) {
    await (controller.platform as WebKitWebViewController).setInspectable(
      true,
    );
    await (controller.platform as WebKitWebViewController).setOverScrollMode(
      WebViewOverScrollMode.never,
    );
  }
  await controller.loadRequest(
    Uri.parse(
      'https://app.solidchat.io/widget/${widget.options.key}/${(widget.options.initialTab ?? SolidChatTab.home).path}?mobile=true&chat_session_id=${prefs.getString('solidchat_session_id')}',
    ),
  );
}