Skip to content
Snippets Groups Projects
Commit a13f1396 authored by Markin Igor's avatar Markin Igor
Browse files

Introduce app modes. Refactor screens. Hide authorize button for standalone mode.

parent b67d77eb
No related branches found
No related tags found
1 merge request!2Resolve "Rework auth flow."
...@@ -9,6 +9,17 @@ import 'package:shared_preferences/shared_preferences.dart'; ...@@ -9,6 +9,17 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:uni_links/uni_links.dart'; import 'package:uni_links/uni_links.dart';
enum AppMode {
Default,
Authorization,
}
enum Screen {
App,
OAuth,
Dashboard
}
class App extends StatelessWidget { class App extends StatelessWidget {
Future<Widget> initApplication() async { Future<Widget> initApplication() async {
Uri initialUri; Uri initialUri;
...@@ -58,11 +69,12 @@ class MainApp extends StatefulWidget { ...@@ -58,11 +69,12 @@ class MainApp extends StatefulWidget {
class _MainAppState extends State<MainApp> { class _MainAppState extends State<MainApp> {
StreamSubscription _sub; 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 // Url of the app which invoked OAuth
String _invokerURL; String _invokerURL;
String _host;
@override @override
initState() { initState() {
...@@ -89,22 +101,17 @@ class _MainAppState extends State<MainApp> { ...@@ -89,22 +101,17 @@ class _MainAppState extends State<MainApp> {
updateAppMode(Uri uri) { updateAppMode(Uri uri) {
if (uri?.path == "/authorize") { if (uri?.path == "/authorize") {
setState(() { setState(() {
_appMode = "oauth"; _appMode = AppMode.Authorization;
_invokerURL = uri.queryParameters["invokerUrl"]; _invokerURL = uri.queryParameters["invokerUrl"];
}); });
} else { } else {
setState(() { setState(() {
_appMode = "app"; _appMode = AppMode.Default;
}); });
} }
} }
setMode(String mode) {
setState(() {
_appMode = mode;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new Scaffold( return new Scaffold(
...@@ -112,7 +119,6 @@ class _MainAppState extends State<MainApp> { ...@@ -112,7 +119,6 @@ class _MainAppState extends State<MainApp> {
body: Home( body: Home(
mode: _appMode, mode: _appMode,
invokerURL: _invokerURL, invokerURL: _invokerURL,
setMode: setMode,
host: widget.initialHost host: widget.initialHost
) )
); );
......
...@@ -8,13 +8,18 @@ import 'dart:async'; ...@@ -8,13 +8,18 @@ import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../../config.dart'; import '../../config.dart';
import '../app.dart';
class Home extends StatefulWidget { class Home extends StatefulWidget {
Home({@required this.mode, @required this.invokerURL, @required this.setMode, @required this.host}); Home({
final String mode; @required this.mode,
@required this.invokerURL,
@required this.host,
});
final AppMode mode;
final String invokerURL; final String invokerURL;
final String host; final String host;
final void Function(String) setMode;
@override @override
_HomeState createState() => _HomeState(); _HomeState createState() => _HomeState();
...@@ -24,24 +29,28 @@ class _HomeState extends State<Home> { ...@@ -24,24 +29,28 @@ class _HomeState extends State<Home> {
String _host = Config.appFlavor == Flavor.DEVELOPMENT ? Config.HOSTS[0] : Config.DEFAULT_APP_HOST; String _host = Config.appFlavor == Flavor.DEVELOPMENT ? Config.HOSTS[0] : Config.DEFAULT_APP_HOST;
bool _hidden = true; bool _hidden = true;
Screen _currentScreen = Screen.App;
@override @override
initState() { initState() {
super.initState(); super.initState();
// Set up initial host
if (widget.host != null) { if (widget.host != null) {
setState(() { setState(() {
_host = widget.host; _host = widget.host;
}); });
} }
showMode(widget.mode); setScreenByMode(widget.mode);
FlutterAppAuthWrapper.eventStream().listen((data) { FlutterAppAuthWrapper.eventStream().listen((data) {
var token = json.decode(data.toString())["access_token"]; var token = json.decode(data.toString())["access_token"];
_showAlert(token); _showAlert(token);
widget.setMode(""); setScreen(Screen.App);
}, onError: (error) { }, onError: (error) {
log("Err $error"); log("Err $error");
widget.setMode(""); setScreen(Screen.App);
}); });
Timer( Timer(
...@@ -54,6 +63,25 @@ class _HomeState extends State<Home> { ...@@ -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) { Future<void> _showAlert(token) {
return showDialog<void>( return showDialog<void>(
context: context, context: context,
...@@ -93,17 +121,17 @@ class _HomeState extends State<Home> { ...@@ -93,17 +121,17 @@ class _HomeState extends State<Home> {
} }
if (widget.mode != oldWidget.mode) { if (widget.mode != oldWidget.mode) {
showMode(widget.mode); setScreenByMode(widget.mode);
} }
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
} }
showMode(mode) { setScreenByMode(AppMode mode) {
if (mode == "app") { if (mode == AppMode.Authorization) {
openVereign(); setScreen(Screen.OAuth);
} else if (mode == "oauth") { } else if (mode == AppMode.Default) {
startOAuth(); setScreen(Screen.Dashboard);
} }
} }
...@@ -141,10 +169,13 @@ class _HomeState extends State<Home> { ...@@ -141,10 +169,13 @@ class _HomeState extends State<Home> {
} }
var children = <Widget>[ var children = <Widget>[
_urlButton(context, "Open Dashboard", openVereign), _urlButton(context, "Open Dashboard", () => setScreen(Screen.Dashboard)),
_urlButton(context, "Authorize with Vereign", startOAuth)
]; ];
if (widget.mode == AppMode.Authorization) {
children.add(_urlButton(context, "Authorize with Vereign", () => setScreen(Screen.OAuth)));
}
if (Config.appFlavor == Flavor.DEVELOPMENT) { if (Config.appFlavor == Flavor.DEVELOPMENT) {
children.add( children.add(
wrapInContainer( wrapInContainer(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment