/* * Copyright (c) 2019 Zender & Kurtz GbR. * * Authors: * Christian Pauly * Marcel Radzio * * This file is part of famedlysdk. * * famedlysdk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * famedlysdk is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with famedlysdk. If not, see . */ import 'dart:async'; import 'Event.dart'; import 'Room.dart'; import 'User.dart'; import 'sync/EventUpdate.dart'; /// Represents the timeline of a room. The callbacks [onUpdate], [onDelete], /// [onInsert] and [onResort] will be triggered automatically. The initial /// event list will be retreived when created by the [room.getTimeline] method. class Timeline { final Room room; List events = []; final onUpdateCallback onUpdate; final onInsertCallback onInsert; StreamSubscription sub; Timeline({this.room, this.events, this.onUpdate, this.onInsert}) { sub ??= room.client.connection.onEvent.stream.listen(_handleEventUpdate); } void _handleEventUpdate(EventUpdate eventUpdate) async { try { if (eventUpdate.roomID != room.id) return; if (eventUpdate.type == "timeline" || eventUpdate.type == "history") { if (!eventUpdate.content.containsKey("id")) eventUpdate.content["id"] = eventUpdate.content["event_id"]; User user = await room.client.store ?.getUser(matrixID: eventUpdate.content["sender"], room: room); if (user != null) { eventUpdate.content["displayname"] = user.displayName; eventUpdate.content["avatar_url"] = user.avatarUrl.mxc; } Event newEvent = Event.fromJson(eventUpdate.content, room); events.insert(0, newEvent); onInsert(0); } sortAndUpdate(); } catch (e) { print("[WARNING] ${e.toString()}"); sub.cancel(); } } sortAndUpdate() { events ?.sort((a, b) => b.time.toTimeStamp().compareTo(a.time.toTimeStamp())); onUpdate(); } } typedef onUpdateCallback = void Function(); typedef onInsertCallback = void Function(int insertID);