From 4a525400060b94208aee625efe03c7f1e7153d0d Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 13 Feb 2022 23:11:53 +0100 Subject: [PATCH] fix: exception on removed widgets And widgets without a name. fixes #267 --- lib/src/room.dart | 13 ++++++----- lib/widget.dart | 2 +- test/room_test.dart | 56 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index 894be747..8225357a 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -374,12 +374,13 @@ class Room { List get widgets => { ...states['m.widget'] ?? {}, ...states['im.vector.modular.widgets'] ?? {}, - } - .values - .map( - (e) => MatrixWidget.fromJson(e.content, this), - ) - .toList(); + }.values.expand((e) { + try { + return [MatrixWidget.fromJson(e.content, this)]; + } catch (_) { + return []; + } + }).toList(); /// Your current client instance. final Client client; diff --git a/lib/widget.dart b/lib/widget.dart index 2537f6b1..22fae796 100644 --- a/lib/widget.dart +++ b/lib/widget.dart @@ -5,7 +5,7 @@ class MatrixWidget { final String? creatorUserId; final Map? data; final String? id; - final String name; + final String? name; final String type; /// use [buildWidgetUrl] instead diff --git a/test/room_test.dart b/test/room_test.dart index bed29e6f..867f196a 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -923,6 +923,62 @@ void main() { test('Widgets', () { expect(room.widgets.isEmpty, true); + room.states['m.widget'] = { + 'test': Event.fromJson({ + 'content': { + 'creatorUserId': '@rxl881:matrix.org', + 'data': {'title': 'Bridges Dashboard', 'dateRange': '1y'}, + 'id': 'grafana_@rxl881:matrix.org_1514573757015', + 'name': 'Grafana', + 'type': 'm.grafana', + 'url': 'https://matrix.org/grafana/whatever', + 'waitForIframeLoad': true + }, + 'room_id': '!foo:bar', + 'event_id': '\$15104760642668662QICBu:matrix.org', + 'sender': '@rxl881:matrix.org', + 'state_key': 'test', + 'origin_server_ts': 1432735824653, + 'type': 'm.widget' + }, room), + }; + expect(room.widgets.length, 1); + room.states['m.widget'] = { + 'test2': Event.fromJson({ + 'content': { + 'creatorUserId': '@rxl881:matrix.org', + 'data': {'title': 'Bridges Dashboard', 'dateRange': '1y'}, + 'id': 'grafana_@rxl881:matrix.org_1514573757016', + 'type': 'm.grafana', + 'url': 'https://matrix.org/grafana/whatever', + 'waitForIframeLoad': true + }, + 'room_id': '!foo:bar', + 'event_id': '\$15104760642668663QICBu:matrix.org', + 'sender': '@rxl881:matrix.org', + 'state_key': 'test2', + 'origin_server_ts': 1432735824653, + 'type': 'm.widget' + }, room), + }; + expect(room.widgets.length, 1); + room.states['m.widget'] = { + 'test3': Event.fromJson({ + 'content': { + 'creatorUserId': '@rxl881:matrix.org', + 'data': {'title': 'Bridges Dashboard', 'dateRange': '1y'}, + 'type': 'm.grafana', + 'waitForIframeLoad': true + }, + 'room_id': '!foo:bar', + 'event_id': '\$15104760642668662QICBu:matrix.org', + 'sender': '@rxl881:matrix.org', + 'state_key': 'test3', + 'origin_server_ts': 1432735824655, + 'type': 'm.widget' + }, room), + }; + expect(room.widgets.length, 0); }); test('Spaces', () async {