Handle card rendering errors to show in ui

This commit is contained in:
Yegor Vialov 2020-04-29 07:45:15 +00:00
parent 7d746fd546
commit bc045344a5
4 changed files with 122 additions and 55 deletions

View File

@ -12,6 +12,7 @@ class CardData {
EntityWrapper get entity => entities.isNotEmpty ? entities[0] : null; EntityWrapper get entity => entities.isNotEmpty ? entities[0] : null;
factory CardData.parse(Map<String, dynamic> rawData) { factory CardData.parse(Map<String, dynamic> rawData) {
try {
switch (rawData['type']) { switch (rawData['type']) {
case CardType.ENTITIES: case CardType.ENTITIES:
return EntitiesCardData(rawData); return EntitiesCardData(rawData);
@ -64,13 +65,24 @@ class CardData {
} }
return CardData(rawData); return CardData(rawData);
} }
} catch (error) {
Logger.e('Error parsing card: $error');
return ErrorCardData(rawData);
}
} }
CardData(Map<String, dynamic> rawData) { CardData(Map<String, dynamic> rawData) {
if (rawData != null) {
type = rawData['type'] ?? CardType.ENTITIES; type = rawData['type'] ?? CardType.ENTITIES;
conditions = rawData['conditions'] ?? []; conditions = rawData['conditions'] ?? [];
showEmpty = rawData['show_empty'] ?? true; showEmpty = rawData['show_empty'] ?? true;
stateFilter = rawData['state_filter'] ?? []; stateFilter = rawData['state_filter'] ?? [];
} else {
type = CardType.UNKNOWN;
conditions = [];
showEmpty = true;
stateFilter = [];
}
} }
Widget buildCardWidget() { Widget buildCardWidget() {
@ -288,7 +300,7 @@ class ButtonCardData extends CardData {
ButtonCardData(Map<String, dynamic> rawData) : super(rawData) { ButtonCardData(Map<String, dynamic> rawData) : super(rawData) {
//Parsing card data //Parsing card data
name = rawData['name']; name = rawData['name'];
icon = rawData['icon']; icon = rawData['icondd'].replace('d','');
showName = rawData['show_name'] ?? true; showName = rawData['show_name'] ?? true;
showIcon = rawData['show_icon'] ?? true; showIcon = rawData['show_icon'] ?? true;
stateColor = rawData['state_color'] ?? true; stateColor = rawData['state_color'] ?? true;
@ -508,3 +520,18 @@ class MediaControlCardData extends CardData {
} }
} }
class ErrorCardData extends CardData {
String cardConfig;
@override
Widget buildCardWidget() {
return ErrorCard(card: this);
}
ErrorCardData(Map<String, dynamic> rawData) : super(rawData) {
cardConfig = '$rawData';
}
}

38
lib/cards/error_card.dart Normal file
View File

@ -0,0 +1,38 @@
part of '../main.dart';
class ErrorCard extends StatelessWidget {
final ErrorCardData card;
const ErrorCard({Key key, this.card}) : super(key: key);
@override
Widget build(BuildContext context) {
return CardWrapper(
child: Padding(
padding: EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, Sizes.rowPadding),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
'There was an error rendering card: ${card.type}. Please copy card config to clipboard and report this issue. Thanks!',
textAlign: TextAlign.center,
),
RaisedButton(
onPressed: () {
Clipboard.setData(new ClipboardData(text: card.cardConfig));
},
child: Text('Copy card config'),
),
RaisedButton(
onPressed: () {
Launcher.launchURL("https://github.com/estevez-dev/ha_client/issues/new?assignees=&labels=&template=bug_report.md&title=");
},
child: Text('Report issue'),
)
],
),
)
);
}
}

View File

@ -119,6 +119,7 @@ class CardType {
static const MARKDOWN = "markdown"; static const MARKDOWN = "markdown";
static const LIGHT = "light"; static const LIGHT = "light";
static const ENTITY_FILTER = "entity-filter"; static const ENTITY_FILTER = "entity-filter";
static const UNKNOWN = "unknown";
} }
class Sizes { class Sizes {

View File

@ -142,6 +142,7 @@ part 'cards/horizontal_srack_card.dart';
part 'cards/markdown_card.dart'; part 'cards/markdown_card.dart';
part 'cards/media_control_card.dart'; part 'cards/media_control_card.dart';
part 'cards/unsupported_card.dart'; part 'cards/unsupported_card.dart';
part 'cards/error_card.dart';
part 'cards/vertical_stack_card.dart'; part 'cards/vertical_stack_card.dart';
part 'cards/glance_card.dart'; part 'cards/glance_card.dart';
part 'pages/play_media.page.dart'; part 'pages/play_media.page.dart';