190 lines
6.3 KiB
Dart
190 lines
6.3 KiB
Dart
// ignore_for_file: must_be_immutable
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:pilipala/common/widgets/network_img_layer.dart';
|
|
import 'package:pilipala/utils/utils.dart';
|
|
|
|
class ChatItem extends StatelessWidget {
|
|
dynamic item;
|
|
|
|
ChatItem({
|
|
super.key,
|
|
this.item,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
bool isOwner = item.senderUid == 17340771;
|
|
bool isPic = item.msgType == 2;
|
|
bool isText = item.msgType == 1;
|
|
bool isSystem =
|
|
item.msgType == 18 || item.msgType == 10 || item.msgType == 13;
|
|
int msgType = item.msgType;
|
|
Map content = item.content ?? '';
|
|
return isSystem
|
|
? (msgType == 10
|
|
? SystemNotice(item: item)
|
|
: msgType == 13
|
|
? SystemNotice2(item: item)
|
|
: const SizedBox())
|
|
: Row(
|
|
children: [
|
|
if (!isOwner) const SizedBox(width: 12),
|
|
if (isOwner) const Spacer(),
|
|
Container(
|
|
constraints: const BoxConstraints(
|
|
maxWidth: 300.0, // 设置最大宽度为200.0
|
|
),
|
|
decoration: BoxDecoration(
|
|
color: isOwner
|
|
? Theme.of(context).colorScheme.primary
|
|
: Theme.of(context).colorScheme.secondaryContainer,
|
|
borderRadius: BorderRadius.only(
|
|
topLeft: const Radius.circular(16),
|
|
topRight: const Radius.circular(16),
|
|
bottomLeft: Radius.circular(isOwner ? 16 : 6),
|
|
bottomRight: Radius.circular(isOwner ? 6 : 16),
|
|
),
|
|
),
|
|
margin: const EdgeInsets.only(top: 12),
|
|
padding: EdgeInsets.only(
|
|
top: 8,
|
|
bottom: 6,
|
|
left: isPic ? 8 : 12,
|
|
right: isPic ? 8 : 12,
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: isOwner
|
|
? CrossAxisAlignment.end
|
|
: CrossAxisAlignment.start,
|
|
children: [
|
|
isText
|
|
? Text(
|
|
content['content'],
|
|
style: TextStyle(
|
|
color: isOwner
|
|
? Theme.of(context).colorScheme.onPrimary
|
|
: Theme.of(context)
|
|
.colorScheme
|
|
.onSecondaryContainer),
|
|
)
|
|
: isPic
|
|
? NetworkImgLayer(
|
|
width: 220,
|
|
height:
|
|
220 * content['height'] / content['width'],
|
|
src: content['url'],
|
|
)
|
|
: const SizedBox(),
|
|
SizedBox(height: isPic ? 7 : 2),
|
|
Text(
|
|
Utils.dateFormat(item.timestamp),
|
|
style: Theme.of(context).textTheme.labelSmall!.copyWith(
|
|
color: isOwner
|
|
? Theme.of(context)
|
|
.colorScheme
|
|
.onPrimary
|
|
.withOpacity(0.8)
|
|
: Theme.of(context)
|
|
.colorScheme
|
|
.onSecondaryContainer
|
|
.withOpacity(0.8)),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
if (!isOwner) const Spacer(),
|
|
if (isOwner) const SizedBox(width: 12),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class SystemNotice extends StatelessWidget {
|
|
dynamic item;
|
|
SystemNotice({super.key, this.item});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Map content = item.content ?? '';
|
|
return Row(
|
|
children: [
|
|
const SizedBox(width: 12),
|
|
Container(
|
|
constraints: const BoxConstraints(
|
|
maxWidth: 300.0, // 设置最大宽度为200.0
|
|
),
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).colorScheme.secondaryContainer,
|
|
borderRadius: const BorderRadius.only(
|
|
topLeft: Radius.circular(16),
|
|
topRight: Radius.circular(16),
|
|
bottomLeft: Radius.circular(6),
|
|
bottomRight: Radius.circular(16),
|
|
),
|
|
),
|
|
margin: const EdgeInsets.only(top: 12),
|
|
padding: const EdgeInsets.all(12),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(content['title'],
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleMedium!
|
|
.copyWith(fontWeight: FontWeight.bold)),
|
|
Text(
|
|
Utils.dateFormat(item.timestamp),
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.labelSmall!
|
|
.copyWith(color: Theme.of(context).colorScheme.outline),
|
|
)
|
|
],
|
|
),
|
|
Divider(
|
|
color: Theme.of(context).colorScheme.primary.withOpacity(0.1),
|
|
),
|
|
Text(
|
|
content['text'],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
const Spacer(),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class SystemNotice2 extends StatelessWidget {
|
|
dynamic item;
|
|
SystemNotice2({super.key, this.item});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Map content = item.content ?? '';
|
|
return Row(
|
|
children: [
|
|
const SizedBox(width: 12),
|
|
Container(
|
|
constraints: const BoxConstraints(
|
|
maxWidth: 300.0, // 设置最大宽度为200.0
|
|
),
|
|
margin: const EdgeInsets.only(top: 12),
|
|
padding: const EdgeInsets.only(bottom: 6),
|
|
child: NetworkImgLayer(
|
|
width: 320,
|
|
height: 150,
|
|
src: content['pic_url'],
|
|
),
|
|
),
|
|
const Spacer(),
|
|
],
|
|
);
|
|
}
|
|
}
|