diff --git a/lib/src/app.dart b/lib/src/app.dart index 3e2b29d60263127e11faa00ddc88778a5d9eabd1..fbedba3885efb6cbc2ee9f5fc4b948572a12ff32 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -9,6 +9,17 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:uni_links/uni_links.dart'; +enum AppMode { + Default, + Authorization, +} + +enum Screen { + App, + OAuth, + Dashboard +} + class App extends StatelessWidget { Future<Widget> initApplication() async { Uri initialUri; @@ -58,11 +69,12 @@ class MainApp extends StatefulWidget { class _MainAppState extends State<MainApp> { StreamSubscription _sub; - String _appMode = ""; + /// "Default" when you open app, "Authorization" when app initiated + /// from third party app + AppMode _appMode; // Url of the app which invoked OAuth String _invokerURL; - String _host; @override initState() { @@ -89,22 +101,17 @@ class _MainAppState extends State<MainApp> { updateAppMode(Uri uri) { if (uri?.path == "/authorize") { setState(() { - _appMode = "oauth"; + _appMode = AppMode.Authorization; _invokerURL = uri.queryParameters["invokerUrl"]; + }); } else { setState(() { - _appMode = "app"; + _appMode = AppMode.Default; }); } } - setMode(String mode) { - setState(() { - _appMode = mode; - }); - } - @override Widget build(BuildContext context) { return new Scaffold( @@ -112,7 +119,6 @@ class _MainAppState extends State<MainApp> { body: Home( mode: _appMode, invokerURL: _invokerURL, - setMode: setMode, host: widget.initialHost ) ); diff --git a/lib/src/screens/home.dart b/lib/src/screens/home.dart index a336e144994788c2e649399288ebdb6afc92cf78..4f3de27332b692f034901bd73ca48b5230a4e94f 100644 --- a/lib/src/screens/home.dart +++ b/lib/src/screens/home.dart @@ -8,13 +8,18 @@ import 'dart:async'; import 'package:shared_preferences/shared_preferences.dart'; import '../../config.dart'; +import '../app.dart'; class Home extends StatefulWidget { - Home({@required this.mode, @required this.invokerURL, @required this.setMode, @required this.host}); - final String mode; + Home({ + @required this.mode, + @required this.invokerURL, + @required this.host, + }); + + final AppMode mode; final String invokerURL; final String host; - final void Function(String) setMode; @override _HomeState createState() => _HomeState(); @@ -24,24 +29,28 @@ class _HomeState extends State<Home> { String _host = Config.appFlavor == Flavor.DEVELOPMENT ? Config.HOSTS[0] : Config.DEFAULT_APP_HOST; bool _hidden = true; + Screen _currentScreen = Screen.App; + @override initState() { super.initState(); + + // Set up initial host if (widget.host != null) { setState(() { _host = widget.host; }); } - showMode(widget.mode); + setScreenByMode(widget.mode); FlutterAppAuthWrapper.eventStream().listen((data) { var token = json.decode(data.toString())["access_token"]; _showAlert(token); - widget.setMode(""); + setScreen(Screen.App); }, onError: (error) { log("Err $error"); - widget.setMode(""); + setScreen(Screen.App); }); Timer( @@ -54,6 +63,25 @@ class _HomeState extends State<Home> { ); } + setScreen(Screen screen) { + if ( + _currentScreen == screen && + screen != Screen.Dashboard // ATM we can not determine whether dashboard was closed or not, so we avoid this case + ) { + return; + } + + setState(() { + _currentScreen = screen; + }); + + if (_currentScreen == Screen.Dashboard) { + openVereign(); + } else if (_currentScreen == Screen.OAuth) { + startOAuth(); + } + } + Future<void> _showAlert(token) { return showDialog<void>( context: context, @@ -93,17 +121,17 @@ class _HomeState extends State<Home> { } if (widget.mode != oldWidget.mode) { - showMode(widget.mode); + setScreenByMode(widget.mode); } super.didUpdateWidget(oldWidget); } - showMode(mode) { - if (mode == "app") { - openVereign(); - } else if (mode == "oauth") { - startOAuth(); + setScreenByMode(AppMode mode) { + if (mode == AppMode.Authorization) { + setScreen(Screen.OAuth); + } else if (mode == AppMode.Default) { + setScreen(Screen.Dashboard); } } @@ -141,10 +169,13 @@ class _HomeState extends State<Home> { } var children = <Widget>[ - _urlButton(context, "Open Dashboard", openVereign), - _urlButton(context, "Authorize with Vereign", startOAuth) + _urlButton(context, "Open Dashboard", () => setScreen(Screen.Dashboard)), ]; + if (widget.mode == AppMode.Authorization) { + children.add(_urlButton(context, "Authorize with Vereign", () => setScreen(Screen.OAuth))); + } + if (Config.appFlavor == Flavor.DEVELOPMENT) { children.add( wrapInContainer(