|
|
@@ -55,6 +55,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
bool isReverse = false;
|
|
|
bool openChat = false;
|
|
|
Uint8List? _image;
|
|
|
+ String locale = 'id';
|
|
|
|
|
|
@override
|
|
|
void initState() {
|
|
|
@@ -66,6 +67,13 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
super.initState();
|
|
|
}
|
|
|
|
|
|
+ @override
|
|
|
+ void didChangeDependencies() {
|
|
|
+ super.didChangeDependencies();
|
|
|
+ locale = context.locale.toString() == 'zh' ? 'zh-cn' : context.locale.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
getData() async {
|
|
|
idChat = U.decodeBase64Url(_sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessCode)!) + '-' + widget.data['ticketNo'];
|
|
|
if (!kIsWeb) imagePath = await token.getPath() + '/TelNow/Images/';
|
|
|
@@ -73,7 +81,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
if (res != null) {
|
|
|
username = res['userId'];
|
|
|
getMessage();
|
|
|
- getCollectionData();
|
|
|
+ // getCollectionData();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -91,16 +99,15 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
if (mymess.containsKey('_embedded')) {
|
|
|
List data = mymess['_embedded']['myMessages'];
|
|
|
for (int i = 0; i < data.length; i++) {
|
|
|
- if (username == data[i]['from']['user']) {
|
|
|
+ if (username == data[i]['from']['user'] && data[i]['senderType'] != 'SERVANT') {
|
|
|
data[i]['selected'] = false;
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
if(U.autoTranslate()){
|
|
|
data[i]['translate'] = '';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- setState(() => messageData.insert(0, data[i]));
|
|
|
+ messageData.insert(0, data[i]);
|
|
|
downloadImage(data[i]);
|
|
|
}
|
|
|
|
|
|
@@ -126,40 +133,56 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ getCollectionData();
|
|
|
}
|
|
|
|
|
|
- translateMessage(){
|
|
|
- var locale = context.locale.toString() == 'zh' ? 'zh-cn' : context.locale.toString();
|
|
|
+ translateMessage() async{
|
|
|
+ var loc = locale == 'zh' ? 'zh-cn' : locale;
|
|
|
messageData.forEach((element) async{
|
|
|
- if (username != element['from']['user'] && element['translate'] == '') {
|
|
|
- var translate = await translator.translate(element['msg']??'', to: locale);
|
|
|
- setState(() {
|
|
|
+ if (element['senderType'] == 'SERVANT' && element['translate'] == '') { // && username != element['from']['user']
|
|
|
+ try {
|
|
|
+ var translate = await translator.translate(element['msg'] ?? '', to: loc);
|
|
|
element['translate'] = translate.text;
|
|
|
- });
|
|
|
+ }catch(e){
|
|
|
+ print("Error translate: ${e.toString()}");
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
+ setState(() {});
|
|
|
}
|
|
|
|
|
|
getCollectionData() {
|
|
|
- FirebaseFirestore.instance.collection("tmMessages").doc('messages').collection(idChat!).snapshots().listen((querySnapshot) {
|
|
|
- setState(() {
|
|
|
+ try{
|
|
|
+ FirebaseFirestore.instance.collection("tmMessages").doc('messages').collection(idChat!).snapshots().listen((querySnapshot) {
|
|
|
querySnapshot.docChanges.forEach((result) async {
|
|
|
var data = result.doc.data();
|
|
|
if (result.type == DocumentChangeType.added && isAfterLoad) {
|
|
|
- if ((username == data!['from']['user'] && messageData.where((element) => element['uniqueId'] == data['uniqueId']).length > 0) || (username != data['from']['user'] && data['readStatus'] == 'DELETED')) {
|
|
|
+ if (
|
|
|
+ (
|
|
|
+ (username == data!['from']['user'] && data!['senderType'] != 'SERVANT') &&
|
|
|
+ messageData.where((element) => element['uniqueId'] == data['uniqueId']).isNotEmpty
|
|
|
+ ) ||
|
|
|
+ (username != data['from']['user'] && data['readStatus'] == 'DELETED')
|
|
|
+ ) {
|
|
|
int index = messageData.indexWhere((element) => element['uniqueId'] == data['uniqueId']);
|
|
|
messageData[index]['read'] = data['read'];
|
|
|
messageData[index]['readStatus'] = data['readStatus'];
|
|
|
messageData[index]['imageUrl'] = data['imageUrl'];
|
|
|
} else {
|
|
|
if(U.autoTranslate()){
|
|
|
- var locale = context.locale.toString() == 'zh' ? 'zh-cn' : context.locale.toString();
|
|
|
- var translate = await translator.translate(data['msg']??'', to: locale);
|
|
|
- data['translate'] = translate.text;
|
|
|
+ try{
|
|
|
+ var translate = await translator.translate(data['msg']??'', to: locale);
|
|
|
+ data['translate'] = translate.text;
|
|
|
+ }catch(e){
|
|
|
+ print("Error translate: ${e.toString()}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bool alreadyExists = messageData.any((element) => element['uniqueId'] == data['uniqueId']);
|
|
|
+ if (!alreadyExists) {
|
|
|
+ messageData.add(data);
|
|
|
}
|
|
|
- messageData.add(data);
|
|
|
}
|
|
|
-
|
|
|
downloadImage(data);
|
|
|
} else if (result.type == DocumentChangeType.modified && isAfterLoad) {
|
|
|
if (messageData.where((element) => element['uniqueId'] == data!['uniqueId']).length > 0) {
|
|
|
@@ -168,10 +191,16 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
messageData[index]['readStatus'] = data['readStatus'];
|
|
|
}
|
|
|
}
|
|
|
+ if(mounted) setState(() {});
|
|
|
});
|
|
|
+ });
|
|
|
+ }catch(e){}
|
|
|
+
|
|
|
+ if(mounted) {
|
|
|
+ setState(() {
|
|
|
isAfterLoad = true;
|
|
|
});
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Future<bool> cacheImage(String url, BuildContext context) async {
|
|
|
@@ -292,9 +321,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
child: Container(
|
|
|
alignment: Alignment.topCenter,
|
|
|
width: U.bodyWidth(context),
|
|
|
- child: messageData.length == 0 && !isAfterLoad ? loadingTemplate(() {
|
|
|
-
|
|
|
- },) : SingleChildScrollView(
|
|
|
+ child: messageData.length == 0 && !isAfterLoad ? loadingTemplate((){}) : SingleChildScrollView(
|
|
|
controller: scrollController,
|
|
|
reverse: isReverse,
|
|
|
padding: EdgeInsets.fromLTRB(10, 10, 10, 7),
|
|
|
@@ -304,7 +331,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
bool isNip = i == 0 ? true : !hideDate ? true : messageData[i]['from']['user'] == messageData[i - 1]['from']['user'] ? false : true;
|
|
|
return Column(
|
|
|
children: [
|
|
|
- !hideDate ? Container(margin: EdgeInsets.only(bottom: 5), child: bubble_chat(Text(convertDate(messageData[i]['datetime'], context.locale.toString()), textAlign: TextAlign.center, style: TextStyle(fontSize: 12)), null, false, false)) : Container(),
|
|
|
+ !hideDate ? Container(margin: EdgeInsets.only(bottom: 5), child: bubleChat(Text(convertDate(messageData[i]['datetime'], locale), textAlign: TextAlign.center, style: TextStyle(fontSize: 12)), null, false, false)) : Container(),
|
|
|
Builder(builder: (context) {
|
|
|
var isMe = username == messageData[i]['from']['user'] && messageData[i]['senderType'] == 'INFORMANT';
|
|
|
var isImage = messageData[i]['imageUrl'] != null && messageData[i]['imageUrl'] != '' && messageData[i]['readStatus'] != 'DELETED';
|
|
|
@@ -375,7 +402,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
onTap: () => kIsWeb ? navigateTo(context, PhotoPreview('forum'.tr(), messageData[i]['imageUrl'], true)) : File(imagePath! + getImageName(messageData[i]['imageUrl'])).existsSync() ? navigateTo(context, PhotoPreview('forum'.tr(), File(imagePath! + getImageName(messageData[i]['imageUrl'])), false)) : null,
|
|
|
),
|
|
|
) : Container(width: 1),
|
|
|
- messageData[i]['readStatus'] == 'DELETED' ? Text('deletedMessage'.tr(), style: TextStyle(fontSize: 14, color: Colors.white70, fontStyle: FontStyle.italic)) : messageData[i]['msg'] != null && messageData[i]['msg'] != '' ? SelectableAutoLinkText(
|
|
|
+ messageData[i]['readStatus'] == 'DELETED' ? Text('deletedMessage'.tr(), style: TextStyle(fontSize: 14, fontStyle: FontStyle.italic)) : messageData[i]['msg'] != null && messageData[i]['msg'] != '' ? SelectableAutoLinkText(
|
|
|
messageData[i]['msg'],
|
|
|
style: TextStyle(fontSize: 14, color: Colors.black),
|
|
|
linkStyle: TextStyle(color: Colors.blueAccent),
|
|
|
@@ -406,7 +433,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
text: TextSpan(children: [
|
|
|
TextSpan(text: DateFormat('HH:mm').format(DateTime.parse(messageData[i]['datetime'])), style: TextStyle(fontSize: 12, color: Colors.black38)),
|
|
|
WidgetSpan(
|
|
|
- child: Padding(
|
|
|
+ child: !isMe ? SizedBox() : Padding(
|
|
|
padding: const EdgeInsets.only(left: 3),
|
|
|
child: Icon(messageData[i]['read'] == null ? Icons.done : Icons.done_all, color: messageData[i]['read'] != null && messageData[i]['read'] ? Colors.green : Colors.black38, size: 15)
|
|
|
)
|
|
|
@@ -418,7 +445,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
flex: 8,
|
|
|
child: Column(
|
|
|
children: [
|
|
|
- bubble_chat(widget, timeBubble, isNip, isMe),
|
|
|
+ bubleChat(widget, timeBubble, isNip, isMe),
|
|
|
SizedBox(height: 5),
|
|
|
],
|
|
|
crossAxisAlignment: isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
|
|
|
@@ -612,7 +639,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
),
|
|
|
):U.getInternetStatus()?Center(child: Padding(
|
|
|
padding: EdgeInsets.symmetric(vertical: 20),
|
|
|
- child: bubble_chat(Text('chatClosed'.tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 12)), null, false, false),
|
|
|
+ child: bubleChat(Text('chatClosed'.tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 12)), null, false, false),
|
|
|
)):Container()
|
|
|
],
|
|
|
),
|
|
|
@@ -662,7 +689,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Widget bubble_chat(Widget child, Widget? time, bool isNip, bool isMe) {
|
|
|
+ Widget bubleChat(Widget child, Widget? time, bool isNip, bool isMe) {
|
|
|
bool isDate = false;
|
|
|
if (time == null) {
|
|
|
isDate = true;
|
|
|
@@ -670,6 +697,7 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
}
|
|
|
Color color = isMe ? primaryColor.withValues(alpha: 0.3) : isDate ? Color(0xffD5F5FF) : Color(0xffECECEC);
|
|
|
var clipPath = ClipPath(
|
|
|
+ clipper: isMe ? MyClipper(isNip) : YourClipper(isNip),
|
|
|
child: ConstrainedBox(
|
|
|
constraints: BoxConstraints(minWidth: 75),
|
|
|
child: Container(
|
|
|
@@ -694,7 +722,6 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
|
|
|
),
|
|
|
),
|
|
|
),
|
|
|
- clipper: isMe ? MyClipper(isNip) : YourClipper(isNip),
|
|
|
);
|
|
|
|
|
|
return Padding(padding: EdgeInsets.only(right: isNip && isMe ? 0 : 6, left: isNip && !isMe ? 0 : 6), child: clipPath);
|