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';
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
)
);
......
......@@ -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(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment