WIP #340 Refactor getting data and error handling
This commit is contained in:
		| @@ -91,6 +91,8 @@ class HomeAssistant { | ||||
|   }*/ | ||||
|  | ||||
|   Future fetch() { | ||||
|     //return _connection().then((_) => _getData()); | ||||
|  | ||||
|     if ((_fetchCompleter != null) && (!_fetchCompleter.isCompleted)) { | ||||
|       Logger.w("Previous fetch is not complited"); | ||||
|     } else { | ||||
| @@ -208,7 +210,11 @@ class HomeAssistant { | ||||
|     await Future.wait(futures).then((_) { | ||||
|       _createUI(); | ||||
|       _completeFetching(null); | ||||
|     }).catchError((e) => _completeFetching(e)); | ||||
|     }).catchError((e) { | ||||
|       disconnect().then((_) => | ||||
|           _completeFetching(e) | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   void _completeFetching(error) { | ||||
| @@ -256,11 +262,12 @@ class HomeAssistant { | ||||
|       logout(); | ||||
|       _completeConnecting({"errorCode": 62, "errorMessage": "${data["message"]}"}); | ||||
|     } else if (data["type"] == "result") { | ||||
|       Logger.d("[Received] <== id: ${data['id']}, success: ${data['success']}"); | ||||
|       if (data["success"]) { | ||||
|         Logger.d("[Received] <== Request id ${data['id']} was successful"); | ||||
|         _messageResolver[data["id"]]?.complete(data["result"]); | ||||
|       } else { | ||||
|         _messageResolver[data["id"]]?.completeError(data["error"]); | ||||
|         Logger.e("[Received] <== Error received on request id ${data['id']}: ${data['error']}"); | ||||
|         _messageResolver[data["id"]]?.completeError(data['error']["message"]); | ||||
|       } | ||||
|       _messageResolver.remove(data["id"]); | ||||
|     } else if (data["type"] == "event") { | ||||
| @@ -288,69 +295,71 @@ class HomeAssistant { | ||||
|   } | ||||
|  | ||||
|   Future _getConfig() async { | ||||
|     await _sendSocketMessage(type: "get_config").then((data) { | ||||
|       if (data["success"]) { | ||||
|         _instanceConfig = Map.from(data["result"]); | ||||
|       } else { | ||||
|         Logger.w("Couldn't get instance config: ${data["error"].toString()}"); | ||||
|       } | ||||
|     return _sendSocketMessage(type: "get_config").then((data) { | ||||
|       _instanceConfig = Map.from(data); | ||||
|     }).catchError((e) { | ||||
|       throw {"errorCode": 1, "errorMessage": "Error getting config: $e"}; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getStates() async { | ||||
|     //TODO last change here. Try run!! | ||||
|     return _sendSocketMessage(type: "get_states").then((data) => entities.parse(data)); | ||||
|     return _sendSocketMessage(type: "get_states").then( | ||||
|             (data) => entities.parse(data) | ||||
|     ).catchError((e) { | ||||
|       throw {"errorCode": 1, "errorMessage": "Error getting states: $e"}; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getLongLivedToken() async { | ||||
|     await _sendSocketMessage(type: "auth/long_lived_access_token", additionalData: {"client_name": "HA Client app ${DateTime.now().millisecondsSinceEpoch}", "lifespan": 365}).then((data) { | ||||
|       if (data['success']) { | ||||
|         Logger.d("Got long-lived token: ${data['result']}"); | ||||
|         _token = data['result']; | ||||
|         _tempToken = null; | ||||
|         final storage = new FlutterSecureStorage(); | ||||
|         storage.write(key: "hacl_llt", value: _token); | ||||
|       } else { | ||||
|         logout(); | ||||
|         Logger.e("Error getting long-lived token: ${data['error'].toString()}"); | ||||
|       } | ||||
|     return _sendSocketMessage(type: "auth/long_lived_access_token", additionalData: {"client_name": "HA Client app ${DateTime.now().millisecondsSinceEpoch}", "lifespan": 365}).then((data) { | ||||
|       Logger.d("Got long-lived token."); | ||||
|       _token = data; | ||||
|       _tempToken = null; | ||||
|       final storage = new FlutterSecureStorage(); | ||||
|       storage.write(key: "hacl_llt", value: _token); | ||||
|     }).catchError((e) { | ||||
|       Logger.e("Error getting long-lived token: ${e.toString()}"); | ||||
|       logout(); | ||||
|       throw {"errorCode": 63, "errorMessage": "Authentication error: $e"}; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getLovelace() async { | ||||
|     await _sendSocketMessage(type: "lovelace/config").then((data) => _rawLovelaceData = data["result"]); | ||||
|     return _sendSocketMessage(type: "lovelace/config").then((data) => _rawLovelaceData = data).catchError((e) { | ||||
|       throw {"errorCode": 1, "errorMessage": "Error getting lovelace config: $e"}; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getUserInfo() async { | ||||
|     _userName = null; | ||||
|     await _sendSocketMessage(type: "auth/current_user").then((data) => _userName = data["result"]["name"]); | ||||
|     return _sendSocketMessage(type: "auth/current_user").then((data) => _userName = data["name"]).catchError((e) { | ||||
|       Logger.w("Can't get user info: ${e}"); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getServices() async { | ||||
|     await _sendSocketMessage(type: "get_services").then((data) => Logger.d("We actually don`t need the list of servcies for now")); | ||||
|     return _sendSocketMessage(type: "get_services").then((data) => Logger.d("Services received")).catchError((e) { | ||||
|       Logger.w("Can't get services: ${e}"); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Future _getPanels() async { | ||||
|     panels.clear(); | ||||
|     await _sendSocketMessage(type: "get_panels").then((data) { | ||||
|       if (data["success"]) { | ||||
|         data["result"].forEach((k,v) { | ||||
|             String title = v['title'] == null ? "${k[0].toUpperCase()}${k.substring(1)}" : "${v['title'][0].toUpperCase()}${v['title'].substring(1)}"; | ||||
|             panels.add(Panel( | ||||
|                 id: k, | ||||
|                 type: v["component_name"], | ||||
|                 title: title, | ||||
|                 urlPath: v["url_path"], | ||||
|                 config: v["config"], | ||||
|                 icon: v["icon"] | ||||
|             ) | ||||
|             ); | ||||
|         }); | ||||
|       } | ||||
|     }); | ||||
|     return _sendSocketMessage(type: "get_panels").then((data) { | ||||
|       data.forEach((k,v) { | ||||
|         String title = v['title'] == null ? "${k[0].toUpperCase()}${k.substring(1)}" : "${v['title'][0].toUpperCase()}${v['title'].substring(1)}"; | ||||
|         panels.add(Panel( | ||||
|             id: k, | ||||
|             type: v["component_name"], | ||||
|             title: title, | ||||
|             urlPath: v["url_path"], | ||||
|             config: v["config"], | ||||
|             icon: v["icon"] | ||||
|         ) | ||||
|         ); | ||||
|       }); | ||||
|     }).catchError((e) { | ||||
|       throw {"errorCode": 1, "errorMessage": "Error getting panels list: $e"}; | ||||
|     });; | ||||
|   } | ||||
|  | ||||
|   _incrementMessageId() { | ||||
|   | ||||
| @@ -307,7 +307,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker | ||||
|       Logger.e(e.toString()); | ||||
|       Logger.e("${e.stackTrace}"); | ||||
|       _showErrorBottomBar( | ||||
|           message: "There was some error", | ||||
|           message: "Unknown error", | ||||
|           errorCode: 13 | ||||
|       ); | ||||
|     } else { | ||||
| @@ -528,6 +528,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|         case 63: | ||||
|         case 61: { | ||||
|           _bottomBarAction = FlatButton( | ||||
|             child: Text("Try again", style: textStyle), | ||||
| @@ -583,17 +584,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker | ||||
|       } | ||||
|       setState(() { | ||||
|         _bottomBarProgress = false; | ||||
|         _bottomBarText = "$message (code: $errorCode)"; | ||||
|         _bottomBarText = "$message"; | ||||
|         _showBottomBar = true; | ||||
|       }); | ||||
|       /*_scaffoldKey.currentState.hideCurrentSnackBar(); | ||||
|       _scaffoldKey.currentState.showSnackBar( | ||||
|         SnackBar( | ||||
|           content: Text("$message (code: $errorCode)"), | ||||
|           action: action, | ||||
|           duration: Duration(hours: 1), | ||||
|         ) | ||||
|       );*/ | ||||
|   } | ||||
|  | ||||
|   final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user