Skip to content

Commit

Permalink
Merge pull request #411 from gtalha07/issue139_emoji-reactions
Browse files Browse the repository at this point in the history
Issue139 emoji reactions fixes
  • Loading branch information
gtalha07 authored Dec 29, 2022
2 parents ff793bc + 17a2ab5 commit f7f4972
Show file tree
Hide file tree
Showing 11 changed files with 715 additions and 289 deletions.
237 changes: 131 additions & 106 deletions app/lib/controllers/chat_room_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,17 @@ class ChatRoomController extends GetxController {
// filter only message from other not me
// it is processed in handleSendPressed
types.Message m = await _prepareMessage(event);
_insertMessage(_messages.length, m);
RoomEventItem? eventItem = event.eventItem();
if (eventItem != null) {
if (eventItem.sender() != client.userId().toString()) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_insertMessage(m);
RoomEventItem? eventItem = event.eventItem();
if (eventItem != null) {
if (eventItem.sender() != client.userId().toString()) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
}
}
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
Expand Down Expand Up @@ -149,14 +151,40 @@ class ChatRoomController extends GetxController {
List<RoomMessage> values = event.values()!.toList();
for (RoomMessage msg in values) {
types.Message m = await _prepareMessage(msg);
_insertMessage(0, m);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_insertMessage(m);
if (m.metadata != null &&
m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo']['eventId'],
m.id,
);
}
RoomEventItem? eventItem = msg.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
}
}
}
}
break;
case 'InsertAt':
debugPrint('chat room message insert at');
RoomMessage value = event.value()!;
types.Message m = await _prepareMessage(value);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_insertMessage(m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
RoomEventItem? eventItem = msg.eventItem();
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
Expand All @@ -167,68 +195,61 @@ class ChatRoomController extends GetxController {
}
}
break;
case 'InsertAt':
debugPrint('chat room message insert at');
int index = event.index()!;
RoomMessage value = event.value()!;
types.Message m = await _prepareMessage(value);
_insertMessage(_messages.length - index, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
}
}
break;
case 'UpdateAt':
debugPrint('chat room message update at');
int index = event.index()!;
RoomMessage value = event.value()!;
types.Message m = await _prepareMessage(value);
_updateMessage(_messages.length - index, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_updateMessage(m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
}
}
}
}
break;
case 'Push':
debugPrint('chat room message push');
RoomMessage value = event.value()!;
types.Message m = await _prepareMessage(value);
_insertMessage(0, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_messages.insert(0, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
RoomEventItem? eventItem = value.eventItem();
if (eventItem != null) {
if (isLoading.isFalse) {
update(['Chat']);
}
if (eventItem.msgtype() == 'm.image') {
_fetchMessageContent(m.id);
}
}
}
}
break;
Expand All @@ -247,15 +268,17 @@ class ChatRoomController extends GetxController {
i += 1;
}
types.Message m = _messages.removeAt(_messages.length - oldIndex);
_messages.insert(i, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
if (isLoading.isFalse) {
update(['Chat']);
if (m is! types.CustomMessage && m is! types.UnsupportedMessage) {
_messages.insert(i, m);
if (m.metadata != null && m.metadata!.containsKey('repliedTo')) {
_fetchOriginalContent(
m.metadata?['repliedTo'],
m.id,
);
}
if (isLoading.isFalse) {
update(['Chat']);
}
}
break;
case 'Pop':
Expand All @@ -277,11 +300,12 @@ class ChatRoomController extends GetxController {
isLoading.value = false;
return;
}
bool hasMore = await _stream!.paginateBackwards(10);
debugPrint('backward pagination has more: $hasMore');
if (hasMore && _messages.length < 10) {
await _stream!.paginateBackwards(10);
}
bool hasMore = true;
do {
hasMore = await _stream!.paginateBackwards(10);
// wait for diff rx to be finished
sleep(const Duration(milliseconds: 500));
} while (hasMore && _messages.length < 10);
// load receipt status of room
var receiptController = Get.find<ReceiptController>();
var receipts = (await convoRoom.userReceipts()).toList();
Expand Down Expand Up @@ -551,40 +575,35 @@ class ChatRoomController extends GetxController {
update(['Chat']);
}

void _insertMessage(int index, types.Message m) {
void _insertMessage(types.Message m) {
var receiptController = Get.find<ReceiptController>();
if (m.type != types.MessageType.unsupported &&
m.type != types.MessageType.custom) {
List<String> seenByList = receiptController.getSeenByList(
_currentRoom!.getRoomId(),
m.createdAt!,
);
if (m.author.id == client.userId().toString()) {
types.Status status = seenByList.length < activeMembers.length
? types.Status.delivered
: types.Status.seen;
_messages.insert(index, m.copyWith(showStatus: true, status: status));
return;
}
List<String> seenByList = receiptController.getSeenByList(
_currentRoom!.getRoomId(),
m.createdAt!,
);
if (m.author.id == client.userId().toString()) {
types.Status status = seenByList.length < activeMembers.length
? types.Status.delivered
: types.Status.seen;
_messages.add(m.copyWith(showStatus: true, status: status));
return;
}
_messages.insert(index, m);
_messages.add(m);
}

void _updateMessage(int index, types.Message m) {
void _updateMessage(types.Message m) {
var receiptController = Get.find<ReceiptController>();
if (m.type != types.MessageType.unsupported &&
m.type != types.MessageType.custom) {
List<String> seenByList = receiptController.getSeenByList(
_currentRoom!.getRoomId(),
m.createdAt!,
);
if (m.author.id == client.userId().toString()) {
types.Status status = seenByList.length < activeMembers.length
? types.Status.delivered
: types.Status.seen;
_messages[index] = m.copyWith(showStatus: true, status: status);
return;
}
int index = _messages.indexWhere((msg) => m.id == msg.id);
List<String> seenByList = receiptController.getSeenByList(
_currentRoom!.getRoomId(),
m.createdAt!,
);
if (m.author.id == client.userId().toString()) {
types.Status status = seenByList.length < activeMembers.length
? types.Status.delivered
: types.Status.seen;
_messages[index] = m.copyWith(showStatus: true, status: status);
return;
}
_messages[index] = m;
}
Expand All @@ -594,6 +613,7 @@ class ChatRoomController extends GetxController {
if (eventItem == null) {
// should not return null, before we can keep track of index in diff receiver
return types.UnsupportedMessage(
createdAt: DateTime.now().millisecondsSinceEpoch,
author: types.User(id: client.userId().toString()),
id: UniqueKey().toString(),
metadata: const {
Expand Down Expand Up @@ -757,7 +777,6 @@ class ChatRoomController extends GetxController {
id: originalId,
createdAt: orgEventItem.originServerTs(),
text: orgEventItem.textDesc()!.body(),
type: types.MessageType.text,
metadata: repliedToContent,
);
} else if (orgMsgType == 'm.image') {
Expand All @@ -771,7 +790,6 @@ class ChatRoomController extends GetxController {
name: orgEventItem.imageDesc()!.name(),
size: orgEventItem.imageDesc()!.size()!,
uri: '',
type: types.MessageType.image,
metadata: repliedToContent,
);
} else if (orgMsgType == 'm.file') {
Expand All @@ -785,7 +803,6 @@ class ChatRoomController extends GetxController {
name: orgEventItem.fileDesc()!.name(),
size: orgEventItem.fileDesc()!.size()!,
uri: '',
type: types.MessageType.file,
metadata: repliedToContent,
);
} else if (orgMsgType == 'm.sticker') {
Expand Down Expand Up @@ -842,4 +859,12 @@ class ChatRoomController extends GetxController {
isEmojiContainerVisible = !isEmojiContainerVisible;
update(['emoji-reaction']);
}

Future<void> sendEmojiReaction(String eventId, String emoji) async {
await _currentRoom!.sendReaction(eventId, emoji);
}

Future<void> redactRoomMessage(String eventId) async {
await _currentRoom!.redactMessage(eventId, '', null);
}
}
7 changes: 5 additions & 2 deletions app/lib/screens/HomeScreens/chat/ChatScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,12 @@ class _ChatScreenState extends State<ChatScreen> {
),
),
GestureDetector(
onTap: () {
onTap: () async {
if (controller.isAuthor()) {
// TODO add unsent message call
// redact message call
await roomController
.redactRoomMessage(roomController.repliedToMessage!.id);
roomController.toggleEmojiContainer();
} else {
showDialog(
context: context,
Expand Down
Loading

0 comments on commit f7f4972

Please sign in to comment.