Resolves #341 Add logout
This commit is contained in:
parent
20d3498bfd
commit
b7d5a53e86
@ -48,6 +48,9 @@ class HomeAssistant {
|
|||||||
}
|
}
|
||||||
String get userName => _userName ?? locationName;
|
String get userName => _userName ?? locationName;
|
||||||
String get userAvatarText => userName.length > 0 ? userName[0] : "";
|
String get userAvatarText => userName.length > 0 ? userName[0] : "";
|
||||||
|
bool get isNoEntities => entities == null || entities.isEmpty;
|
||||||
|
bool get isNoViews => ui == null || ui.isEmpty;
|
||||||
|
bool get isAuthenticated => _token != null;
|
||||||
//int get viewsCount => entities.views.length ?? 0;
|
//int get viewsCount => entities.views.length ?? 0;
|
||||||
|
|
||||||
HomeAssistant() {
|
HomeAssistant() {
|
||||||
@ -106,14 +109,14 @@ class HomeAssistant {
|
|||||||
return _fetchCompleter.future;
|
return _fetchCompleter.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnect() async {
|
Future disconnect() async {
|
||||||
Logger.d( "Socket disconnecting...");
|
Logger.d( "Socket disconnecting...");
|
||||||
await _socketSubscription?.cancel();
|
await _socketSubscription?.cancel();
|
||||||
await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 3),
|
await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 4),
|
||||||
onTimeout: () => Logger.d( "Socket sink closed")
|
onTimeout: () => Logger.d( "Socket sink close timeout")
|
||||||
);
|
);
|
||||||
_hassioChannel = null;
|
_hassioChannel = null;
|
||||||
|
Logger.d( "..Disconnected");
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _connection() {
|
Future _connection() {
|
||||||
@ -263,10 +266,12 @@ class HomeAssistant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future logout() async {
|
Future logout() async {
|
||||||
|
Logger.d("Logging out...");
|
||||||
_token = null;
|
_token = null;
|
||||||
_tempToken = null;
|
_tempToken = null;
|
||||||
//TODO proper clear
|
|
||||||
await SharedPreferences.getInstance().then((prefs) => prefs.remove("hassio-token"));
|
await SharedPreferences.getInstance().then((prefs) => prefs.remove("hassio-token"));
|
||||||
|
ui?.clear();
|
||||||
|
entities?.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _sendSubscribe() {
|
void _sendSubscribe() {
|
||||||
|
@ -367,7 +367,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
if (widget.homeAssistant != null && widget.homeAssistant.panels.isNotEmpty) {
|
if (widget.homeAssistant.panels.isNotEmpty) {
|
||||||
widget.homeAssistant.panels.forEach((Panel panel) {
|
widget.homeAssistant.panels.forEach((Panel panel) {
|
||||||
if (!panel.isHidden) {
|
if (!panel.isHidden) {
|
||||||
menuItems.add(
|
menuItems.add(
|
||||||
@ -379,16 +379,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
menuItems.addAll([
|
}
|
||||||
|
if (widget.homeAssistant.isSettingsLoaded) {
|
||||||
|
menuItems.add(
|
||||||
new ListTile(
|
new ListTile(
|
||||||
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant")),
|
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant")),
|
||||||
title: Text("Open Web UI"),
|
title: Text("Open Web UI"),
|
||||||
onTap: () => HAUtils.launchURL(widget.homeAssistant.httpWebHost),
|
onTap: () => HAUtils.launchURL(widget.homeAssistant.httpWebHost),
|
||||||
),
|
)
|
||||||
Divider()
|
);
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
menuItems.addAll([
|
menuItems.addAll([
|
||||||
|
Divider(),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:login-variant")),
|
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:login-variant")),
|
||||||
title: Text("Connection settings"),
|
title: Text("Connection settings"),
|
||||||
@ -396,16 +398,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pushNamed('/connection-settings', arguments: {"homeAssistant", widget.homeAssistant});
|
Navigator.of(context).pushNamed('/connection-settings', arguments: {"homeAssistant", widget.homeAssistant});
|
||||||
},
|
},
|
||||||
),
|
)
|
||||||
ListTile(
|
]);
|
||||||
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:logout-variant")),
|
menuItems.addAll([
|
||||||
title: Text("Logout"),
|
|
||||||
onTap: () {
|
|
||||||
widget.homeAssistant.logout().then((_) {
|
|
||||||
widget.homeAssistant.disconnect().then((__) => _refreshData());
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
Divider(),
|
Divider(),
|
||||||
new ListTile(
|
new ListTile(
|
||||||
leading: Icon(Icons.insert_drive_file),
|
leading: Icon(Icons.insert_drive_file),
|
||||||
@ -603,6 +598,24 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
|
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
|
||||||
|
|
||||||
Widget _buildScaffoldBody(bool empty) {
|
Widget _buildScaffoldBody(bool empty) {
|
||||||
|
List<PopupMenuItem<String>> popupMenuItems = [];
|
||||||
|
if (widget.homeAssistant.isAuthenticated) {
|
||||||
|
popupMenuItems.addAll([
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: new Text("Reload"),
|
||||||
|
value: "reload",
|
||||||
|
),
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: new Text("Logout"),
|
||||||
|
value: "logout",
|
||||||
|
)]);
|
||||||
|
} else {
|
||||||
|
popupMenuItems.addAll([
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: new Text("Connect"),
|
||||||
|
value: "reload",
|
||||||
|
)]);
|
||||||
|
}
|
||||||
return NestedScrollView(
|
return NestedScrollView(
|
||||||
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
|
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
|
||||||
return <Widget>[
|
return <Widget>[
|
||||||
@ -610,7 +623,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
floating: true,
|
floating: true,
|
||||||
pinned: true,
|
pinned: true,
|
||||||
primary: true,
|
primary: true,
|
||||||
title: Text(widget.homeAssistant != null ? widget.homeAssistant.locationName : ""),
|
title: Text(widget.homeAssistant.locationName ?? ""),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(MaterialDesignIcons.getIconDataFromIconName(
|
icon: Icon(MaterialDesignIcons.getIconDataFromIconName(
|
||||||
@ -619,13 +632,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
showMenu(
|
showMenu(
|
||||||
position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0),
|
position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0),
|
||||||
context: context,
|
context: context,
|
||||||
items: [PopupMenuItem<String>(
|
items: popupMenuItems
|
||||||
child: new Text("Reload"),
|
|
||||||
value: "reload",
|
|
||||||
)]
|
|
||||||
).then((String val) {
|
).then((String val) {
|
||||||
if (val == "reload") {
|
if (val == "reload") {
|
||||||
_refreshData();
|
_refreshData();
|
||||||
|
} else if (val == "logout") {
|
||||||
|
widget.homeAssistant.disconnect().then((_) {
|
||||||
|
widget.homeAssistant.logout().then((_) {
|
||||||
|
setState(() {
|
||||||
|
_refreshData();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -652,9 +670,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant"),
|
MaterialDesignIcons.getIconDataFromIconName("mdi:border-none-variant"),
|
||||||
size: 100.0,
|
size: 100.0,
|
||||||
color: Colors.blue,
|
color: Colors.black26,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
@ -717,7 +735,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This method is rerun every time setState is called.
|
// This method is rerun every time setState is called.
|
||||||
if (widget.homeAssistant.ui == null || widget.homeAssistant.ui.views == null) {
|
if (widget.homeAssistant.isNoViews) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
key: _scaffoldKey,
|
key: _scaffoldKey,
|
||||||
primary: false,
|
primary: false,
|
||||||
|
@ -4,6 +4,8 @@ class HomeAssistantUI {
|
|||||||
List<HAView> views;
|
List<HAView> views;
|
||||||
String title;
|
String title;
|
||||||
|
|
||||||
|
bool get isEmpty => views == null || views.isEmpty;
|
||||||
|
|
||||||
HomeAssistantUI() {
|
HomeAssistantUI() {
|
||||||
views = [];
|
views = [];
|
||||||
}
|
}
|
||||||
@ -25,4 +27,8 @@ class HomeAssistantUI {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
views.clear();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user