This repository has been archived on 2022-04-20. You can view files and clone it, but cannot push or open issues or pull requests.
app/lib/global.dart

159 lines
4.5 KiB
Dart
Raw Permalink Normal View History

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
2018-09-22 20:56:16 +00:00
import 'package:vikunja_app/api/client.dart';
import 'package:vikunja_app/api/list_implementation.dart';
import 'package:vikunja_app/api/namespace_implementation.dart';
import 'package:vikunja_app/api/task_implementation.dart';
import 'package:vikunja_app/api/user_implementation.dart';
import 'package:vikunja_app/managers/user.dart';
import 'package:vikunja_app/models/user.dart';
import 'package:vikunja_app/service/services.dart';
class VikunjaGlobal extends StatefulWidget {
final Widget child;
final Widget login;
VikunjaGlobal({this.child, this.login});
@override
VikunjaGlobalState createState() => VikunjaGlobalState();
static VikunjaGlobalState of(BuildContext context) {
2018-09-16 19:47:53 +00:00
var widget = context.inheritFromWidgetOfExactType(_VikunjaGlobalInherited)
as _VikunjaGlobalInherited;
return widget.data;
}
}
class VikunjaGlobalState extends State<VikunjaGlobal> {
final FlutterSecureStorage _storage = new FlutterSecureStorage();
User _currentUser;
Client _client;
bool _loading = true;
User get currentUser => _currentUser;
2019-03-18 16:56:15 +00:00
Client get client => _client;
UserManager get userManager => new UserManager(_storage);
2019-03-18 16:56:15 +00:00
2018-10-08 14:26:01 +00:00
UserService newUserService(base) => new UserAPIService(Client(null, base));
2019-03-18 16:56:15 +00:00
NamespaceService get namespaceService => new NamespaceAPIService(client);
2019-03-18 16:56:15 +00:00
TaskService get taskService => new TaskAPIService(client);
2019-03-18 16:56:15 +00:00
ListService get listService => new ListAPIService(client);
@override
void initState() {
super.initState();
_loadCurrentUser();
}
2018-09-17 13:35:57 +00:00
void changeUser(User newUser, {String token, String base}) async {
setState(() {
_loading = true;
});
if (token == null) {
token = await _storage.read(key: newUser.id.toString());
} else {
// Write new token to secure storage
await _storage.write(key: newUser.id.toString(), value: token);
}
2018-09-17 13:35:57 +00:00
if (base == null) {
base = await _storage.read(key: "${newUser.id.toString()}_base");
} else {
// Write new base to secure storage
await _storage.write(key: "${newUser.id.toString()}_base", value: base);
}
// Set current user in storage
await _storage.write(key: 'currentUser', value: newUser.id.toString());
setState(() {
_currentUser = newUser;
2018-09-17 13:35:57 +00:00
_client = Client(token, base);
_loading = false;
});
}
2019-03-18 16:56:15 +00:00
void logoutUser(BuildContext context) {
_storage.deleteAll().then((_) {
Navigator.pop(context);
setState(() {
_client = null;
_currentUser = null;
});
}).catchError((err) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('An error occured while logging out!'),
));
});
}
void _loadCurrentUser() async {
var currentUser = await _storage.read(key: 'currentUser');
2018-09-17 13:35:57 +00:00
if (currentUser == null) {
setState(() {
_loading = false;
});
return;
}
var token = await _storage.read(key: currentUser);
var base = await _storage.read(key: '${currentUser}_base');
if (token == null || base == null) {
setState(() {
_loading = false;
});
return;
}
var client = Client(token, base);
var loadedCurrentUser;
try {
loadedCurrentUser = await UserAPIService(client).getCurrentUser();
} on ApiException catch (e) {
if (e.errorCode ~/ 100 == 4) {
setState(() {
_client = null;
_currentUser = null;
_loading = false;
});
return;
}
2020-04-27 15:02:55 +00:00
loadedCurrentUser = User(int.tryParse(currentUser), "", "");
} catch (otherExceptions) {
2020-04-27 15:02:55 +00:00
loadedCurrentUser = User(int.tryParse(currentUser), "", "");
}
2018-09-17 13:35:57 +00:00
setState(() {
_client = client;
_currentUser = loadedCurrentUser;
_loading = false;
});
}
@override
Widget build(BuildContext context) {
if (_loading) {
return new Center(child: new CircularProgressIndicator());
}
return new _VikunjaGlobalInherited(
data: this,
child: client == null ? widget.login : widget.child,
);
}
}
class _VikunjaGlobalInherited extends InheritedWidget {
final VikunjaGlobalState data;
_VikunjaGlobalInherited({Key key, this.data, Widget child})
: super(key: key, child: child);
@override
bool updateShouldNotify(_VikunjaGlobalInherited oldWidget) {
2018-09-16 19:47:53 +00:00
return (data.currentUser != null &&
data.currentUser.id != oldWidget.data.currentUser.id) ||
data.client != oldWidget.data.client;
}
}