Implemented RichObjectString in text messages

This commit is contained in:
Elias Müller 2023-02-21 16:59:20 +01:00
parent cee122602f
commit 5f140821a8
7 changed files with 119 additions and 86 deletions

View File

@ -33,6 +33,7 @@ class GetChatResponseObject {
bool isReplyable; bool isReplyable;
String referenceId; String referenceId;
String message; String message;
@JsonKey(fromJson: _fromJson) Map<String, RichObjectString>? messageParameters;
GetChatResponseObject( GetChatResponseObject(
this.id, this.id,
@ -45,9 +46,45 @@ class GetChatResponseObject {
this.messageType, this.messageType,
this.isReplyable, this.isReplyable,
this.referenceId, this.referenceId,
this.message); this.message,
this.messageParameters);
factory GetChatResponseObject.fromJson(Map<String, dynamic> json) => _$GetChatResponseObjectFromJson(json); factory GetChatResponseObject.fromJson(Map<String, dynamic> json) => _$GetChatResponseObjectFromJson(json);
Map<String, dynamic> toJson() => _$GetChatResponseObjectToJson(this); Map<String, dynamic> toJson() => _$GetChatResponseObjectToJson(this);
} }
Map<String, RichObjectString>? _fromJson(json) {
if(json is Map<String, dynamic>) {
Map<String, RichObjectString> data = {};
for (var element in json.keys) {
data.putIfAbsent(element, () => RichObjectString.fromJson(json[element]));
}
return data;
}
return null;
}
@JsonSerializable(explicitToJson: true)
class RichObjectString {
RichObjectStringObjectType type;
String id;
String name;
String? path;
String? link;
RichObjectString(this.type, this.id, this.name, this.path, this.link);
factory RichObjectString.fromJson(Map<String, dynamic> json) => _$RichObjectStringFromJson(json);
Map<String, dynamic> toJson() => _$RichObjectStringToJson(this);
}
enum RichObjectStringObjectType {
@JsonValue("user") user,
@JsonValue("group") group,
@JsonValue("file") file,
@JsonValue("guest") guest,
@JsonValue("highlight") highlight,
}

View File

@ -34,6 +34,7 @@ GetChatResponseObject _$GetChatResponseObjectFromJson(
json['isReplyable'] as bool, json['isReplyable'] as bool,
json['referenceId'] as String, json['referenceId'] as String,
json['message'] as String, json['message'] as String,
_fromJson(json['messageParameters']),
); );
Map<String, dynamic> _$GetChatResponseObjectToJson( Map<String, dynamic> _$GetChatResponseObjectToJson(
@ -52,6 +53,8 @@ Map<String, dynamic> _$GetChatResponseObjectToJson(
'isReplyable': instance.isReplyable, 'isReplyable': instance.isReplyable,
'referenceId': instance.referenceId, 'referenceId': instance.referenceId,
'message': instance.message, 'message': instance.message,
'messageParameters':
instance.messageParameters?.map((k, e) => MapEntry(k, e.toJson())),
}; };
const _$GetRoomResponseObjectMessageActorTypeEnumMap = { const _$GetRoomResponseObjectMessageActorTypeEnumMap = {
@ -67,3 +70,29 @@ const _$GetRoomResponseObjectMessageTypeEnumMap = {
GetRoomResponseObjectMessageType.system: 'system', GetRoomResponseObjectMessageType.system: 'system',
GetRoomResponseObjectMessageType.command: 'command', GetRoomResponseObjectMessageType.command: 'command',
}; };
RichObjectString _$RichObjectStringFromJson(Map<String, dynamic> json) =>
RichObjectString(
$enumDecode(_$RichObjectStringObjectTypeEnumMap, json['type']),
json['id'] as String,
json['name'] as String,
json['path'] as String?,
json['link'] as String?,
);
Map<String, dynamic> _$RichObjectStringToJson(RichObjectString instance) =>
<String, dynamic>{
'type': _$RichObjectStringObjectTypeEnumMap[instance.type]!,
'id': instance.id,
'name': instance.name,
'path': instance.path,
'link': instance.link,
};
const _$RichObjectStringObjectTypeEnumMap = {
RichObjectStringObjectType.user: 'user',
RichObjectStringObjectType.group: 'group',
RichObjectStringObjectType.file: 'file',
RichObjectStringObjectType.guest: 'guest',
RichObjectStringObjectType.highlight: 'highlight',
};

View File

@ -0,0 +1,13 @@
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatResponse.dart';
class RichObjectStringProcessor {
static String parse(String message, Map<String, RichObjectString>? data) {
if(data == null) return message;
data.forEach((key, value) {
message = message.replaceAll(RegExp("{$key}"), value.name);
});
return message;
}
}

View File

@ -1,6 +1,8 @@
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/apiResponse.dart'; import 'package:marianum_mobile/api/apiResponse.dart';
import '../chat/getChatResponse.dart';
part 'getRoomResponse.g.dart'; part 'getRoomResponse.g.dart';
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
@ -48,7 +50,7 @@ class GetRoomResponseObject {
bool unreadMentionDirect; bool unreadMentionDirect;
int lastReadMessage; int lastReadMessage;
int lastCommonReadMessage; int lastCommonReadMessage;
GetRoomResponseObjectMessage lastMessage; GetChatResponseObject lastMessage;
String? status; String? status;
String? statusIcon; String? statusIcon;
String? statusMessage; String? statusMessage;
@ -104,37 +106,37 @@ enum GetRoomResponseObjectParticipantNotificationLevel {
@JsonValue(3) neverNotify, @JsonValue(3) neverNotify,
} }
@JsonSerializable(explicitToJson: true) // @JsonSerializable(explicitToJson: true)
class GetRoomResponseObjectMessage { // class GetRoomResponseObjectMessage {
int id; // int id;
String token; // String token;
GetRoomResponseObjectMessageActorType actorType; // GetRoomResponseObjectMessageActorType actorType;
String actorId; // String actorId;
String actorDisplayName; // String actorDisplayName;
int timestamp; // int timestamp;
String message; // String message;
String systemMessage; // String systemMessage;
GetRoomResponseObjectMessageType messageType; // GetRoomResponseObjectMessageType messageType;
bool isReplyable; // bool isReplyable;
String referenceId; // String referenceId;
//
//
GetRoomResponseObjectMessage( // GetRoomResponseObjectMessage(
this.id, // this.id,
this.token, // this.token,
this.actorType, // this.actorType,
this.actorId, // this.actorId,
this.actorDisplayName, // this.actorDisplayName,
this.timestamp, // this.timestamp,
this.message, // this.message,
this.systemMessage, // this.systemMessage,
this.messageType, // this.messageType,
this.isReplyable, // this.isReplyable,
this.referenceId); // this.referenceId);
//
factory GetRoomResponseObjectMessage.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectMessageFromJson(json); // factory GetRoomResponseObjectMessage.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectMessageFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomResponseObjectMessageToJson(this); // Map<String, dynamic> toJson() => _$GetRoomResponseObjectMessageToJson(this);
} // }
enum GetRoomResponseObjectMessageActorType { enum GetRoomResponseObjectMessageActorType {
@JsonValue("users") user, @JsonValue("users") user,

View File

@ -48,7 +48,7 @@ GetRoomResponseObject _$GetRoomResponseObjectFromJson(
json['unreadMentionDirect'] as bool, json['unreadMentionDirect'] as bool,
json['lastReadMessage'] as int, json['lastReadMessage'] as int,
json['lastCommonReadMessage'] as int, json['lastCommonReadMessage'] as int,
GetRoomResponseObjectMessage.fromJson( GetChatResponseObject.fromJson(
json['lastMessage'] as Map<String, dynamic>), json['lastMessage'] as Map<String, dynamic>),
json['status'] as String?, json['status'] as String?,
json['statusIcon'] as String?, json['statusIcon'] as String?,
@ -106,53 +106,3 @@ const _$GetRoomResponseObjectParticipantNotificationLevelEnumMap = {
GetRoomResponseObjectParticipantNotificationLevel.notifyOnMention: 2, GetRoomResponseObjectParticipantNotificationLevel.notifyOnMention: 2,
GetRoomResponseObjectParticipantNotificationLevel.neverNotify: 3, GetRoomResponseObjectParticipantNotificationLevel.neverNotify: 3,
}; };
GetRoomResponseObjectMessage _$GetRoomResponseObjectMessageFromJson(
Map<String, dynamic> json) =>
GetRoomResponseObjectMessage(
json['id'] as int,
json['token'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageActorTypeEnumMap, json['actorType']),
json['actorId'] as String,
json['actorDisplayName'] as String,
json['timestamp'] as int,
json['message'] as String,
json['systemMessage'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageTypeEnumMap, json['messageType']),
json['isReplyable'] as bool,
json['referenceId'] as String,
);
Map<String, dynamic> _$GetRoomResponseObjectMessageToJson(
GetRoomResponseObjectMessage instance) =>
<String, dynamic>{
'id': instance.id,
'token': instance.token,
'actorType':
_$GetRoomResponseObjectMessageActorTypeEnumMap[instance.actorType]!,
'actorId': instance.actorId,
'actorDisplayName': instance.actorDisplayName,
'timestamp': instance.timestamp,
'message': instance.message,
'systemMessage': instance.systemMessage,
'messageType':
_$GetRoomResponseObjectMessageTypeEnumMap[instance.messageType]!,
'isReplyable': instance.isReplyable,
'referenceId': instance.referenceId,
};
const _$GetRoomResponseObjectMessageActorTypeEnumMap = {
GetRoomResponseObjectMessageActorType.user: 'users',
GetRoomResponseObjectMessageActorType.guest: 'guests',
GetRoomResponseObjectMessageActorType.bot: 'bots',
GetRoomResponseObjectMessageActorType.bridge: 'bridged',
};
const _$GetRoomResponseObjectMessageTypeEnumMap = {
GetRoomResponseObjectMessageType.comment: 'comment',
GetRoomResponseObjectMessageType.deletedComment: 'comment_deleted',
GetRoomResponseObjectMessageType.system: 'system',
GetRoomResponseObjectMessageType.command: 'command',
};

View File

@ -2,6 +2,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/richObjectStringProcessor.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart'; import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
import 'package:marianum_mobile/data/chatList/chatListProps.dart'; import 'package:marianum_mobile/data/chatList/chatListProps.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -62,7 +63,7 @@ class _ChatListState extends State<ChatList> {
chats.add(ListTile( chats.add(ListTile(
title: Text(chatRoom.displayName), title: Text(chatRoom.displayName),
subtitle: Text("${Jiffy.unixFromSecondsSinceEpoch(chatRoom.lastMessage.timestamp).fromNow()}: ${chatRoom.lastMessage.message.replaceAll("\n", " ")}", overflow: TextOverflow.ellipsis), subtitle: Text("${Jiffy.unixFromSecondsSinceEpoch(chatRoom.lastMessage.timestamp).fromNow()}: ${RichObjectStringProcessor.parse(chatRoom.lastMessage.message.replaceAll("\n", " "), chatRoom.lastMessage.messageParameters)}", overflow: TextOverflow.ellipsis),
trailing: Visibility( trailing: Visibility(
visible: chatRoom.unreadMessages > 0, visible: chatRoom.unreadMessages > 0,
child: Container( child: Container(

View File

@ -2,6 +2,7 @@
import 'package:bubble/bubble.dart'; import 'package:bubble/bubble.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/richObjectStringProcessor.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart'; import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
import 'package:marianum_mobile/data/chatList/chatProps.dart'; import 'package:marianum_mobile/data/chatList/chatProps.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -96,7 +97,7 @@ class _ChatViewState extends State<ChatView> {
), ),
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: showMetadata ? 18 : 0), padding: EdgeInsets.symmetric(vertical: showMetadata ? 18 : 0),
child: Text(element.message), child: Text(RichObjectStringProcessor.parse(element.message, element.messageParameters)),
), ),
Visibility( Visibility(
visible: showMetadata, visible: showMetadata,