Skip to content
Snippets Groups Projects
home.dart 4.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • igorwork's avatar
    igorwork committed
    import 'package:flutter/material.dart';
    
    import 'package:flutter_web_browser/flutter_web_browser.dart';
    
    igorwork's avatar
    igorwork committed
    import 'package:flutter_app_auth_wrapper/flutter_app_auth_wrapper.dart';
    
    import 'package:url_launcher/url_launcher.dart';
    
    import 'dart:developer';
    
    import 'dart:convert';
    
    Markin Igor's avatar
    Markin Igor committed
    import 'package:shared_preferences/shared_preferences.dart';
    
    igorwork's avatar
    igorwork committed
    import '../../config.dart';
    
    igorwork's avatar
    igorwork committed
    
    
    class Home extends StatefulWidget {
    
      Home({@required this.mode, @required this.invokerURL, @required this.setMode, @required this.host});
    
      final String mode;
    
      final String invokerURL;
    
      final String host;
    
      final void Function(String) setMode;
    
    
      @override
      _HomeState createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
    
    Markin Igor's avatar
    Markin Igor committed
      String _host = Config.appFlavor == Flavor.DEVELOPMENT ? Config.HOSTS[0] : Config.DEFAULT_APP_HOST;
    
      @override
      initState() {
        super.initState();
    
    Markin Igor's avatar
    Markin Igor committed
        setState(() {
          _host = widget.host;
        });
    
    
        showMode(widget.mode);
    
    
        FlutterAppAuthWrapper.eventStream().listen((data) {
          var token = json.decode(data.toString())["access_token"];
          _showAlert(token);
    
    Markin Igor's avatar
    Markin Igor committed
          widget.setMode("");
        }, onError: (error) {
          log("Err $error");
          widget.setMode("");
    
        });
      }
    
      Future<void> _showAlert(token) {
        return showDialog<void>(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text('Authorization success'),
              actions: <Widget>[
                FlatButton(
                  child: Text('Go back'),
                  onPressed: () async {
                    Navigator.of(context).pop();
    
    igorwork's avatar
    igorwork committed
    
                    log("Open ${widget.invokerURL}");
                    try {
    
                      await launch("${widget.invokerURL}?token=$token&host=$_host");
    
    igorwork's avatar
    igorwork committed
                    } catch (e) {
                      log("Error launching url ${widget.invokerURL}");
                    }
    
      }
    
      @override
      void didUpdateWidget(Home oldWidget) {
        // this method IS called when parent widget passes new "props"
        // unlike React, this method IS called _before_ the build
        // unlike React, this method ISN'T called after setState()
    
    
        if (widget.host != oldWidget.host && widget.host != null) {
          setState(() {
            _host = widget.host;
          });
        }
    
    
        if (widget.mode != oldWidget.mode) {
          showMode(widget.mode);
        }
    
        super.didUpdateWidget(oldWidget);
      }
    
      showMode(mode) {
        if (mode == "app") {
    
          openVereign();
    
        } else if (mode == "oauth") {
    
          startOAuth();
    
      openVereign() {
    
        FlutterWebBrowser.openWebPage(url: _host, androidToolbarColor: Color(0xFFd51d32));
    
        var params = Config.getOAuthParams(host: _host);
    
    
        FlutterAppAuthWrapper.startAuth(
          AuthConfig(
    
            clientId: params["clientId"],
            clientSecret: params["clientSecret"],
            redirectUrl: params["redirectUrl"],
    
            state: "login",
            prompt: "consent",
            endpoint: AuthEndpoint(
    
                auth: params["authEndpoint"], token: params["tokenEndpoint"]),
    
            scopes: [
              "user_account_status",
              "user_territory",
              "user_profile"
            ],
          ),
        );
      }
    
    
    
    igorwork's avatar
    igorwork committed
      @override
      Widget build(BuildContext context) {
    
        var children = <Widget>[
          _urlButton(context, "Open Dashboard", openVereign),
          _urlButton(context, "Authorize with Vereign", startOAuth)
        ];
    
        if (Config.appFlavor == Flavor.DEVELOPMENT) {
          children.add(
            wrapInContainer(
              DropdownButton<String>(
                value: _host,
    
    Markin Igor's avatar
    Markin Igor committed
                onChanged: (String newValue) async {
    
                  setState(() {
                    _host = newValue;
                  });
    
    Markin Igor's avatar
    Markin Igor committed
    
                  final prefs = await SharedPreferences.getInstance();
                  prefs.setString("host", newValue);
    
    Markin Igor's avatar
    Markin Igor committed
                items: Config.HOSTS
    
                    .map<DropdownMenuItem<String>>((String value) {
                      return DropdownMenuItem<String>(
                        value: value,
                        child: Text(value),
                      );
                    })
                    .toList(),
                )
            )
          );
        }
    
    
    igorwork's avatar
    igorwork committed
        return Scaffold(
            body: SafeArea(
                child: SingleChildScrollView(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      crossAxisAlignment: CrossAxisAlignment.stretch,
    
                      children: children
    
    igorwork's avatar
    igorwork committed
                    ))));
      }
    
    
      Widget wrapInContainer(Widget widget) {
    
    igorwork's avatar
    igorwork committed
        return Container(
    
    Markin Igor's avatar
    Markin Igor committed
          padding: EdgeInsets.all(10.0),
    
          child: widget,
        );
      }
    
      Widget _urlButton(BuildContext context, String title, listener) {
        return wrapInContainer(
            FlatButton(
    
    igorwork's avatar
    igorwork committed
              color: Theme.of(context).primaryColor,
    
    igorwork's avatar
    igorwork committed
              textColor: Colors.white,
    
    igorwork's avatar
    igorwork committed
              padding: const EdgeInsets.symmetric(horizontal: 50.0, vertical: 15.0),
    
              child: Text(title),
              onPressed: listener
    
    igorwork's avatar
    igorwork committed
      }
    }