Skip to content

Commit

Permalink
more work on reimplementation
Browse files Browse the repository at this point in the history
  • Loading branch information
Airyzz committed Jun 4, 2024
1 parent d4bf7f2 commit a002c2f
Show file tree
Hide file tree
Showing 22 changed files with 611 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Future<void> onForegroundMessage(dynamic message) async {
var room = client.getRoom(roomId);
var event = await room!.getEvent(eventId);

var user = room.getMemberOrFallback(event!.senderId)!;
var user = room.getMemberOrFallback(event!.senderId);

Log.i("Dispatching notification");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class UnifiedPushNotifier implements Notifier {
var room = client.getRoom(roomId);
var event = await room!.getEvent(eventId);

var user = room.getMemberOrFallback(event!.senderId)!;
var user = room.getMemberOrFallback(event!.senderId);

NotificationManager.notify(MessageNotificationContent(
senderName: user.displayName,
Expand Down
26 changes: 13 additions & 13 deletions commet/lib/client/matrix/matrix_room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,13 @@ class MatrixRoom extends Room {
}
}

_onUpdateSubscription =
_matrixRoom.onUpdate.stream.listen(onMatrixRoomUpdate);
_onUpdateSubscription = _matrixRoom.client.onRoomState.stream
.where((event) => event.roomId == _matrixRoom.id)
.listen(onRoomStateUpdated);

_matrixRoom.client.onEvent.stream.listen(onEvent);
_matrixRoom.client.onEvent.stream
.where((event) => event.roomID == _matrixRoom.id)
.listen(onEvent);

_permissions = MatrixRoomPermissions(_matrixRoom);
}
Expand Down Expand Up @@ -238,10 +241,6 @@ class MatrixRoom extends Room {

var sender = getMemberOrFallback(event.senderId);

if (sender == null) {
return;
}

var notification = MessageNotificationContent(
senderName: sender.displayName,
senderId: sender.identifier,
Expand Down Expand Up @@ -371,9 +370,11 @@ class MatrixRoom extends Room {
await _matrixRoom.enableEncryption();
}

void onMatrixRoomUpdate(String event) async {
void onRoomStateUpdated(matrix.Event event) async {
_displayName = _matrixRoom.getLocalizedDisplayname();
_onUpdate.add(null);
if (event.type == "m.room.name") {
_onUpdate.add(null);
}
}

@override
Expand Down Expand Up @@ -509,7 +510,7 @@ class MatrixRoom extends Room {
bool get isMembersListComplete => _matrixRoom.participantListComplete;

@override
Member? getMemberOrFallback(String id) {
Member getMemberOrFallback(String id) {
return MatrixMember(
_matrixRoom.client, _matrixRoom.unsafeGetUserFromMemoryOrFallback(id));
}
Expand All @@ -522,9 +523,8 @@ class MatrixRoom extends Room {
var roles = (state.content["users"] as Map<String, dynamic>);
var ids = roles.keys;

var result = ids
.map((e) => (getMemberOrFallback(e)!, MatrixRole(roles[e])))
.toList();
var result =
ids.map((e) => (getMemberOrFallback(e), MatrixRole(roles[e]))).toList();

result.removeWhere((element) => element.$2.rank == 0);

Expand Down
6 changes: 5 additions & 1 deletion commet/lib/client/matrix/matrix_timeline_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,11 @@ class MatrixTimelineEvent implements TimelineEvent {
}

@override
Widget buildFormattedContent() {
Widget? buildFormattedContent() {
if (formattedBody == null) {
return null;
}

return MatrixHtmlParser.parse(formattedBody!, event.room.client);
}

Expand Down
2 changes: 1 addition & 1 deletion commet/lib/client/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ abstract class Room {

Future<TimelineEvent?> getEvent(String eventId);

Member? getMemberOrFallback(String id);
Member getMemberOrFallback(String id);

@override
bool operator ==(Object other) {
Expand Down
2 changes: 1 addition & 1 deletion commet/lib/client/timeline.dart
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ abstract class TimelineEvent {
/// If you want to display the same message twice, use `buildFormattedContent()` to create a new widget
Widget? get formattedContent;

Widget buildFormattedContent();
Widget? buildFormattedContent();

String? get relatedEventId;
String? get stateKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class BackgroundNotificationsManager {
Log.i("Found room: ${room?.displayName}");

var event = await room!.getEvent(eventId);
var user = room.getMemberOrFallback(event!.senderId)!;
var user = room.getMemberOrFallback(event!.senderId);

Log.i("Got user: $user ($user)");
Log.i("Got event: ${event.body}");
Expand Down
2 changes: 1 addition & 1 deletion commet/lib/ui/atoms/emoji_reaction.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class EmojiReaction extends StatelessWidget {
final int numReactions;
final bool highlighted;

BorderRadius get borderRadius => BorderRadius.circular(12);
BorderRadius get borderRadius => BorderRadius.circular(8);

@override
Widget build(BuildContext context) {
Expand Down
2 changes: 1 addition & 1 deletion commet/lib/ui/molecules/read_indicator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class _SingleUserReadIndicatorState extends State<SingleUserReadIndicator> {
late Member member;
@override
void initState() {
member = widget.room.getMemberOrFallback(widget.identifier)!;
member = widget.room.getMemberOrFallback(widget.identifier);
super.initState();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import 'dart:async';

import 'package:commet/client/timeline.dart';
import 'package:commet/config/build_config.dart';
import 'package:commet/debug/log.dart';
import 'package:commet/main.dart';
import 'package:commet/ui/molecules/timeline_events/timeline_event_layout.dart';
import 'package:commet/ui/molecules/timeline_events/timeline_view_entry.dart';
import 'package:flutter/material.dart';

Expand Down Expand Up @@ -34,6 +37,7 @@ class RoomTimelineWidgetViewState extends State<RoomTimelineWidgetView> {
GlobalKey firstFrameScrollViewKey = GlobalKey();
GlobalKey scrollViewKey = GlobalKey();
GlobalKey centerKey = GlobalKey();
GlobalKey recentItemsKey = GlobalKey();

late List<StreamSubscription> subscriptions;

Expand Down Expand Up @@ -73,6 +77,7 @@ class RoomTimelineWidgetViewState extends State<RoomTimelineWidgetView> {

void onEventAdded(int index) {
setState(() {});

if (index == 0 || index < recentItemsCount) {
recentItemsCount += 1;
} else {
Expand All @@ -96,6 +101,7 @@ class RoomTimelineWidgetViewState extends State<RoomTimelineWidgetView> {
}

void onEventChanged(int index) {
Log.d("Event changed: $index");
var event = widget.timeline.events[index];
var existing = eventKeys[index];
eventKeys[index] = (existing.$1, event.eventId);
Expand All @@ -106,7 +112,13 @@ class RoomTimelineWidgetViewState extends State<RoomTimelineWidgetView> {

assert(event.eventId == key.$2);

key.$1.currentState?.setState(() {});
var state = key.$1.currentState;

if (state is TimelineEventViewWidget) {
(state as TimelineViewEntryState).update(index);
} else {
Log.w("Failed to get state");
}
}

void onEventRemoved(int index) {
Expand Down Expand Up @@ -157,63 +169,93 @@ class RoomTimelineWidgetViewState extends State<RoomTimelineWidgetView> {

@override
Widget build(BuildContext context) {
return Offstage(
offstage: firstFrame,
child: Scaffold(
body: CustomScrollView(
return Material(
color: Colors.transparent,
child: Offstage(
offstage: firstFrame,
child: CustomScrollView(
key: firstFrame ? firstFrameScrollViewKey : scrollViewKey,
controller: controller,
reverse: true,
center: centerKey,
slivers: <Widget>[
SliverList(
key: recentItemsKey,
// Recent Items
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
int displayIndex = recentItemsCount - index - 1;
childCount: recentItemsCount,
addAutomaticKeepAlives: false,
(BuildContext context, int sliverIndex) {
int timelineIndex = recentItemsCount - sliverIndex - 1;
numBuilds += 1;

Log.d("Num Builds: $numBuilds");
var key = eventKeys[displayIndex];
var key = eventKeys[timelineIndex];
assert(
key.$2 == widget.timeline.events[displayIndex].eventId);
key.$2 == widget.timeline.events[timelineIndex].eventId);

return Container(
alignment: Alignment.center,
color: Colors.blue[200 + index % 4 * 100]!.withAlpha(30),
color: preferences.developerMode && BuildConfig.DEBUG
? Colors.blue[200 + sliverIndex % 4 * 100]!
.withAlpha(30)
: null,
child: TimelineViewEntry(
key: key.$1,
timeline: widget.timeline,
index: displayIndex),
initialIndex: timelineIndex),
);
},
childCount: recentItemsCount,
findChildIndexCallback: (key) {
var timelineIndex =
eventKeys.indexWhere((element) => element.$1 == key);
if (timelineIndex == -1) {
Log.w(
"Failed to get timeline index for key: $timelineIndex");
return null;
}

return recentItemsCount - timelineIndex - 1;
},
),
),
SliverList(
key: centerKey,
// History Items
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
addAutomaticKeepAlives: false,
childCount: historyItemsCount,
(BuildContext context, int sliverIndex) {
numBuilds += 1;
// ignore: avoid_print
Log.d("Num Builds: $numBuilds");
var displayIndex = recentItemsCount + index;
var timelineIndex = recentItemsCount + sliverIndex;

var key = eventKeys[displayIndex];
var key = eventKeys[timelineIndex];
assert(
key.$2 == widget.timeline.events[displayIndex].eventId);
key.$2 == widget.timeline.events[timelineIndex].eventId);

return Container(
alignment: Alignment.center,
color: Colors.red[200 + index % 4 * 100]!.withAlpha(30),
color: preferences.developerMode && BuildConfig.DEBUG
? Colors.red[200 + sliverIndex % 4 * 100]!.withAlpha(30)
: null,
child: TimelineViewEntry(
key: key.$1,
timeline: widget.timeline,
index: displayIndex),
initialIndex: timelineIndex),
);
},
childCount: historyItemsCount,
findChildIndexCallback: (key) {
var timelineIndex =
eventKeys.indexWhere((element) => element.$1 == key);
if (timelineIndex == -1) {
Log.w(
"Failed to get timeline index for key: $timelineIndex");
return null;
}

return timelineIndex - recentItemsCount;
},
),
),
],
Expand Down
8 changes: 4 additions & 4 deletions commet/lib/ui/molecules/timeline_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,11 @@ class _TimelineEventState extends State<TimelineEventView> {
name: "errorMessageFailedToSend");

String get displayName => widget.timeline.room
.getMemberOrFallback(widget.event.senderId)!
.getMemberOrFallback(widget.event.senderId)
.displayName;

ImageProvider? get avatar =>
widget.timeline.room.getMemberOrFallback(widget.event.senderId)!.avatar;
widget.timeline.room.getMemberOrFallback(widget.event.senderId).avatar;

Color get color => widget.timeline.room.getColorOfUser(widget.event.senderId);

Expand All @@ -135,7 +135,7 @@ class _TimelineEventState extends State<TimelineEventView> {
String? get relatedEventDisplayName => relatedEvent == null
? null
: widget.timeline.room
.getMemberOrFallback(relatedEvent!.senderId)!
.getMemberOrFallback(relatedEvent!.senderId)
.displayName;

UrlPreviewData? urlPreviews;
Expand Down Expand Up @@ -380,7 +380,7 @@ class _TimelineEventState extends State<TimelineEventView> {
// if the cache didnt have anything lets just build new content. This should really never happen though
formatted ??= widget.event.buildFormattedContent();

return formatted;
return formatted!;
}

if (widget.event.body != null)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:commet/client/attachment.dart';
import 'package:commet/ui/atoms/message_attachment.dart';
import 'package:flutter/material.dart';

class TimelineEventViewAttachments extends StatelessWidget {
const TimelineEventViewAttachments({required this.attachments, super.key});
final List<Attachment> attachments;
@override
Widget build(BuildContext context) {
return Wrap(
children: attachments
.map((e) => Padding(
padding: const EdgeInsets.fromLTRB(0, 2, 2, 2),
child: RepaintBoundary(
child: MessageAttachment(
e,
),
),
))
.toList(),
);
}
}
Loading

0 comments on commit a002c2f

Please sign in to comment.