-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
229 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
11 changes: 11 additions & 0 deletions
11
commet/lib/client/components/pinned_messages/pinned_messages_component.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import 'package:commet/client/client.dart'; | ||
import 'package:commet/client/components/room_component.dart'; | ||
|
||
abstract class PinnedMessagesComponent<R extends Client, T extends Room> | ||
implements RoomComponent<R, T> { | ||
List<String> getPinnedMessages(); | ||
|
||
Future<void> pinMessage(String eventId); | ||
|
||
bool get canPinMessages; | ||
} |
31 changes: 31 additions & 0 deletions
31
commet/lib/client/matrix/components/pinned_messages/matrix_pinned_messages_component.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import 'package:commet/client/components/pinned_messages/pinned_messages_component.dart'; | ||
import 'package:commet/client/matrix/matrix_client.dart'; | ||
import 'package:commet/client/matrix/matrix_room.dart'; | ||
import 'package:matrix/matrix_api_lite/model/event_types.dart'; | ||
|
||
class MatrixPinnedMessagesComponent | ||
extends PinnedMessagesComponent<MatrixClient, MatrixRoom> { | ||
@override | ||
MatrixClient client; | ||
|
||
@override | ||
MatrixRoom room; | ||
|
||
MatrixPinnedMessagesComponent(this.client, this.room); | ||
|
||
@override | ||
bool get canPinMessages => | ||
room.matrixRoom.canChangeStateEvent(EventTypes.RoomPinnedEvents); | ||
|
||
@override | ||
List<String> getPinnedMessages() { | ||
return room.matrixRoom.pinnedEventIds.reversed.toList(); | ||
} | ||
|
||
@override | ||
Future<void> pinMessage(String eventId) async { | ||
var pins = room.matrixRoom.pinnedEventIds.toList(); | ||
pins.add(eventId); | ||
await room.matrixRoom.setPinnedEvents(pins); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
commet/lib/client/matrix/timeline_events/matrix_timeline_event_pinned_messages.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import 'package:commet/client/matrix/timeline_events/matrix_timeline_event.dart'; | ||
import 'package:commet/client/timeline.dart'; | ||
import 'package:commet/client/timeline_events/timeline_event_generic.dart'; | ||
import 'package:flutter/material.dart'; | ||
|
||
class MatrixTimelineEventPinnedMessages extends MatrixTimelineEvent | ||
implements TimelineEventGeneric { | ||
MatrixTimelineEventPinnedMessages(super.event, {required super.client}); | ||
|
||
bool isNewEventPinned() { | ||
if (event.prevContent?.containsKey('pinned') == true) { | ||
var prevList = event.prevContent!['pinned'] as List<dynamic>; | ||
var currList = event.content['pinned'] as List<dynamic>; | ||
|
||
return currList.length > prevList.length; | ||
} else { | ||
return true; | ||
} | ||
} | ||
|
||
@override | ||
IconData get icon => Icons.push_pin; | ||
|
||
@override | ||
String get plainTextBody => getBody(); | ||
|
||
@override | ||
bool get showSenderAvatar => false; | ||
|
||
@override | ||
String getBody({Timeline? timeline}) { | ||
if (isNewEventPinned()) { | ||
return "Message pinned!"; | ||
} else { | ||
return "Message unpinned!"; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
86 changes: 86 additions & 0 deletions
86
commet/lib/ui/organisms/room_pinned_messages/room_pinned_messages_widget.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
import 'package:commet/client/components/pinned_messages/pinned_messages_component.dart'; | ||
import 'package:commet/client/room.dart'; | ||
import 'package:commet/client/timeline_events/timeline_event.dart'; | ||
import 'package:commet/ui/molecules/timeline_events/timeline_event_view_single.dart'; | ||
import 'package:flutter/material.dart'; | ||
import 'package:tiamat/tiamat.dart' as tiamat; | ||
|
||
class RoomPinnedMessagesWidget extends StatefulWidget { | ||
const RoomPinnedMessagesWidget( | ||
{required this.room, this.onEventClicked, super.key}); | ||
final Room room; | ||
final void Function(String eventId)? onEventClicked; | ||
|
||
@override | ||
State<RoomPinnedMessagesWidget> createState() => | ||
_RoomPinnedMessagesWidgetState(); | ||
} | ||
|
||
class _RoomPinnedMessagesWidgetState extends State<RoomPinnedMessagesWidget> { | ||
List<TimelineEvent>? events; | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
|
||
loadPinnedMessages(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
if (events == null) { | ||
return const tiamat.Tile( | ||
child: Center(child: CircularProgressIndicator())); | ||
} | ||
|
||
if (events!.isEmpty) { | ||
return tiamat.Tile( | ||
child: Center( | ||
child: tiamat.Text.label("No messages have been pinned!"))); | ||
} | ||
|
||
return tiamat.Tile.low( | ||
child: Column( | ||
children: [ | ||
Flexible( | ||
child: ListView.builder( | ||
itemCount: events!.length, | ||
itemBuilder: (context, index) { | ||
var data = events![index]; | ||
return Padding( | ||
padding: const EdgeInsets.fromLTRB(4, 2, 4, 2), | ||
child: ClipRRect( | ||
borderRadius: BorderRadius.circular(8), | ||
child: Material( | ||
borderRadius: BorderRadius.circular(8), | ||
child: InkWell( | ||
onTap: () => | ||
widget.onEventClicked?.call(data.eventId), | ||
child: Padding( | ||
padding: const EdgeInsets.all(4.0), | ||
child: TimelineEventViewSingle( | ||
room: widget.room, event: data), | ||
), | ||
)), | ||
), | ||
); | ||
}, | ||
), | ||
), | ||
], | ||
), | ||
); | ||
} | ||
|
||
void loadPinnedMessages() async { | ||
final comp = widget.room.getComponent<PinnedMessagesComponent>()!; | ||
var eventIds = comp.getPinnedMessages(); | ||
|
||
var allEvents = await Future.wait<TimelineEvent?>( | ||
eventIds.map((id) => widget.room.getEvent(id))); | ||
|
||
setState(() { | ||
events = List<TimelineEvent>.from(allEvents.where((e) => e != null)); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters