simple-chat-client/lib/chat/view/in_message_box.dart
Linloir c3d0a91c48
Core Function
- Chat page available
- File transfer available
2022-10-15 15:30:09 +08:00

92 lines
3.1 KiB
Dart

/*
* @Author : Linloir
* @Date : 2022-10-14 13:49:47
* @LastEditTime : 2022-10-15 10:24:35
* @Description :
*/
import 'package:flutter/material.dart';
import 'package:tcp_client/chat/model/chat_history.dart';
import 'package:tcp_client/chat/view/common/file_box.dart';
import 'package:tcp_client/chat/view/common/image_box.dart';
import 'package:tcp_client/chat/view/common/text_box.dart';
import 'package:tcp_client/repositories/common_models/message.dart';
class InMessageBox extends StatelessWidget {
const InMessageBox({
required this.history,
super.key
});
final ChatHistory history;
@override
Widget build(BuildContext context) {
return AnimatedContainer(
key: ValueKey(history.message.contentmd5),
duration: const Duration(milliseconds: 375),
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8
),
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(8.0),
topRight: Radius.circular(8.0),
bottomLeft: Radius.zero,
bottomRight: Radius.circular(8.0)
),
boxShadow: [BoxShadow(blurRadius: 5.0, color: Colors.grey.withOpacity(0.3))]
),
child: ClipRRect(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(8.0),
topRight: Radius.circular(8.0),
bottomLeft: Radius.zero,
bottomRight: Radius.circular(8.0)
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
if(history.message.type == MessageType.file)
FileBox(history: history),
if(history.message.type == MessageType.image)
ImageBox(history: history),
if(history.message.type == MessageType.plaintext)
TextBox(history: history),
const SizedBox(height: 4.0,),
Text(
_getTimeStamp(history.message.timeStamp),
style: TextStyle(
fontSize: 12,
color: Colors.grey[400],
),
)
],
),
)
);
}
String _getTimeStamp(int timeStamp) {
var date = DateTime.fromMillisecondsSinceEpoch(timeStamp);
var weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
//If date is today, return time
if(date.day == DateTime.now().day) {
return '${date.hour}:${date.minute.toString().padLeft(2, '0')}';
}
//If date is yesterday, return 'yesterday'
if(date.day == DateTime.now().day - 1) {
return 'yesterday ${date.hour}:${date.minute.toString().padLeft(2, '0')}';
}
//If date is within this week, return the weekday in english
if(date.weekday < DateTime.now().weekday) {
return '${weekdays[date.weekday - 1]} ${date.hour}:${date.minute.toString().padLeft(2, '0')}';
}
//Otherwise return the date in english
return '${date.month}/${date.day} ${date.hour}:${date.minute.toString().padLeft(2, '0')}';
}
}