Commit acb9d7e1 authored by skeyboy's avatar skeyboy

百晓通聊天列表多选分享

parent 7209ed34
......@@ -12,6 +12,7 @@ class ChatMessage {
this.mentions,
this.status = MessageStatus.none,
this.replyTo,
this.showMenu = false
});
/// Create a ChatMessage instance from json data
......@@ -77,6 +78,8 @@ class ChatMessage {
/// If the message is a reply of another one TODO:
ChatMessage? replyTo;
bool? showMenu = false;
bool? selected = false;
/// Convert a ChatMessage into a json
Map<String, dynamic> toJson() {
......
......@@ -33,7 +33,8 @@ class MessageOptions {
this.messageMediaBuilder,
this.onLongPressStart,
this.onLongPressEnd,
this.shareMenuBuilder});
this.shareMenuBuilder,
this.multiSelectedBuilder});
//长按
......@@ -158,9 +159,14 @@ class MessageOptions {
/// Will not work with the default video player
final void Function(ChatMedia media)? onTapMedia;
/// 多选
final ChatRowSelected? Function(ChatMessage chatMessage)?
multiSelectedBuilder;
final Widget? Function(
ChatMessage message,
CustomPopupMenuController controller,
Widget chatMessageBody,
bool? showMenus)? shareMenuBuilder;
}
typedef ChatRowSelected = void Function(ChatMessage message, bool? value);
......@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:chart/common/apis/apis.dart';
import 'package:chart/common/routers/routes.dart';
import 'package:chart/common/store/store.dart';
import 'package:chart/common/values/colors.dart';
import 'package:chart/common/values/server.dart';
import 'package:chart/entity/user_entity.dart';
import 'package:chart/package/chat_dash/dash_chat_2.dart' as Chat;
......@@ -45,6 +46,10 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
late Animation<double> _animation;
bool _isRotated = false;
/// 选中的分享条目
RxList<ChatMessage> selectedItems = <ChatMessage>[].obs;
RxBool chatRowCheckRadioShowed = false.obs;
// ignore: prefer_typing_uninitialized_variables
late var sse;
......@@ -73,6 +78,61 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
/// 事件
/// 右上角分享管理相关菜单
List<Widget> topRightBarMenus() {
/// 选中数据不为空 或者 展示选择菜单右侧即显示 分享相关控制
return (selectedItems.isEmpty == true && chatRowCheckRadioShowed.value == false)
? [
RotationTransition(
turns: animation,
child: IconButton(
tooltip: '重置',
icon: const Icon(
Icons.settings_backup_restore_sharp,
color: AppColors.primaryElementText,
),
onPressed: () {
reset();
},
),
),
IconButton(
tooltip: '设置',
icon: const Icon(
Icons.settings,
color: AppColors.primaryElementText,
),
onPressed: () {
share();
},
)
]
: [
IconButton(
tooltip: "分享",
onPressed: () async {
selectedItems.sort((l, r) => r.createdAt
.difference(DateTime.now())
.compareTo(l.createdAt.difference(DateTime.now())));
String sharedMsg = selectedItems.reversed
.map((element) => element.text)
.join("\n\n");
ShareResult result = await Share.shareWithResult(sharedMsg);
if (result.status == ShareResultStatus.success) {
EasyLoading.showToast("分享成功");
} else {
EasyLoading.showToast("分享取消");
}
},
icon: const Icon(Icons.share)),
IconButton(
onPressed: () {
_hideChatMessageCheckbox();
},
icon: const Icon(Icons.cancel_outlined))
];
}
bool gotoLoginPage() {
if (UserStore.to.isLogin == false) {
Get.toNamed(AppRoutes.SIGN_IN);
......@@ -420,47 +480,67 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
// }
}
List<ItemModel> menuItems = [
ItemModel(
'复制',
Icons.content_copy,
(ChatMessage message, CustomPopupMenuController controller) {
FlutterClipboard.copy(message.text).then((value) {
EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
controller.hideMenu();
// Get.back();
});
// controller.hideMenu();
},
),
ItemModel(
'转发',
Icons.share,
(ChatMessage message, CustomPopupMenuController controller) async {
if (message.text.isNotEmpty) {
await Share.share(
"${message.text}\n\n",
);
List<ItemModel> get menuItems => [
ItemModel(
'复制',
Icons.content_copy,
(ChatMessage message, CustomPopupMenuController controller) {
FlutterClipboard.copy(message.text).then((value) {
EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
controller.hideMenu();
// Get.back();
});
// controller.hideMenu();
},
),
ItemModel(
'转发',
Icons.share,
(ChatMessage message, CustomPopupMenuController controller) async {
if (message.text.isNotEmpty) {
await Share.share(
"${message.text}\n\n",
);
controller.hideMenu();
} else {
EasyLoading.showToast("分享内容不能为空",
maskType: EasyLoadingMaskType.none);
}
// FlutterClipboard.copy(message.text).then((value) {
// EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
// controller.hideMenu();
// // Get.back();
// });
},
),
// ItemModel('收藏', Icons.collections),
// ItemModel('删除', Icons.delete),
ItemModel('多选', Icons.playlist_add_check, (message, controller) {
state.messageList.forEach((element) {
element.showMenu = true;
});
state.messageList
.replaceRange(0, state.messageList.length - 1, state.messageList);
controller.hideMenu();
} else {
EasyLoading.showToast("分享内容不能为空", maskType: EasyLoadingMaskType.none);
}
// FlutterClipboard.copy(message.text).then((value) {
// EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
// controller.hideMenu();
// // Get.back();
// });
},
),
// ItemModel('收藏', Icons.collections),
// ItemModel('删除', Icons.delete),
// ItemModel('多选', Icons.playlist_add_check),
// ItemModel('引用', Icons.format_quote),
// ItemModel('提醒', Icons.add_alert),
// ItemModel('搜一搜', Icons.search),
];
chatRowCheckRadioShowed.value = true;
}),
// ItemModel('引用', Icons.format_quote),
// ItemModel('提醒', Icons.add_alert),
// ItemModel('搜一搜', Icons.search),
];
_hideChatMessageCheckbox() {
state.messageList.forEach((element) {
element.showMenu = false;
element.selected = false;
});
state.messageList
.replaceRange(0, state.messageList.length - 1, state.messageList);
selectedItems.value.clear();
chatRowCheckRadioShowed.value = false;
}
Widget shareMenuBody(
ChatMessage message, CustomPopupMenuController controller) {
......@@ -506,6 +586,28 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
);
}
// 分享菜单回调事项
ChatRowSelected? multiSelectedBuilder(ChatMessage message) {
return (message, value) {
_update(message, value: value);
};
}
_update(ChatMessage message, {bool? value = false}) {
message.selected = value ?? false;
int index = state.messageList.indexWhere((element) => element == message);
state.messageList.replaceRange(index, index + 1, [message]);
if (value == false) {
selectedItems.remove(message);
} else {
selectedItems.add(message);
selectedItems.value.sort();
}
selectedItems.forEach((element) {
print(element.text);
});
}
/// 根据需要自己判断怎么构建长按菜单
Widget? shareMenuBuilder(
ChatMessage message,
......
......@@ -49,36 +49,11 @@ class _HomePageState extends State<_HomePage>
@override
Widget build(BuildContext context) {
final cc = Get.put(HomeController());
return Obx(() =>
Scaffold(
return Obx(() => Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Color.fromARGB(0, 0, 0, 0),
appBar: transparentAppBar(
actions: [
RotationTransition(
turns: controller.animation,
child: IconButton(
tooltip: '重置',
icon: const Icon(
Icons.settings_backup_restore_sharp,
color: AppColors.primaryElementText,
),
onPressed: () {
controller.reset();
},
),
),
IconButton(
tooltip: '设置',
icon: const Icon(
Icons.settings,
color: AppColors.primaryElementText,
),
onPressed: () {
controller.share();
},
)
],
actions: controller.topRightBarMenus(),
title: RichText(
textAlign: TextAlign.center,
text: TextSpan(children: [
......@@ -119,8 +94,7 @@ class _HomePageState extends State<_HomePage>
),
Text("订阅",
style: TextStyle(
color: Color.fromARGB(255, 95, 54, 0),
fontSize: 16)),
color: Color.fromARGB(255, 95, 54, 0), fontSize: 16)),
]),
callback: () => controller.virtualPay()),
),
......@@ -148,41 +122,43 @@ class _HomePageState extends State<_HomePage>
// GradientButton(
// child: Icon(Icons.text_fields_sharp), callback: () {}),
/*Android语音转换文字有问题暂时屏蔽掉*/
(Platform.isAndroid ? Container() : Container(
margin: const EdgeInsets.only(right: 10),
child: InkWell(
borderRadius: BorderRadius.circular(100),
onTap: cc.changeInput,
child: Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
border: GradientBoxBorder(
gradient: LinearGradient(colors: [
Color(0xFFbe6afb),
// Color(0xFF9c67f6),
Color(0xFF7965f8)
]),
width: 2,
),
),
padding: const EdgeInsets.all(10),
child: Icon(
!cc.state.isInputText
? Icons.keyboard
: Icons.keyboard_voice,
),
)))
// padding: EdgeInsets.all(10),
// margin: EdgeInsets.only(right: 10),
// child: Icon(Icons.text_fields_sharp),
// decoration: const BoxDecoration(
// shape: BoxShape.circle,
// border: GradientBoxBorder(
// gradient: LinearGradient(
// colors: [Colors.pink, Colors.orange]),
// width: 2,
// ),
// ),
(Platform.isAndroid
? Container()
: Container(
margin: const EdgeInsets.only(right: 10),
child: InkWell(
borderRadius: BorderRadius.circular(100),
onTap: cc.changeInput,
child: Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
border: GradientBoxBorder(
gradient: LinearGradient(colors: [
Color(0xFFbe6afb),
// Color(0xFF9c67f6),
Color(0xFF7965f8)
]),
width: 2,
),
),
padding: const EdgeInsets.all(10),
child: Icon(
!cc.state.isInputText
? Icons.keyboard
: Icons.keyboard_voice,
),
)))
// padding: EdgeInsets.all(10),
// margin: EdgeInsets.only(right: 10),
// child: Icon(Icons.text_fields_sharp),
// decoration: const BoxDecoration(
// shape: BoxShape.circle,
// border: GradientBoxBorder(
// gradient: LinearGradient(
// colors: [Colors.pink, Colors.orange]),
// width: 2,
// ),
// ),
),
// Container(
// padding: EdgeInsets.all(10),
......@@ -225,8 +201,8 @@ class _HomePageState extends State<_HomePage>
),
inputToolbarMargin: EdgeInsets.all(0),
sendButtonBuilder: null,
inputToolbarPadding: EdgeInsets.only(
top: 15, right: 15, left: 15, bottom: 10),
inputToolbarPadding:
EdgeInsets.only(top: 15, right: 15, left: 15, bottom: 10),
),
currentUser: _user,
onSend: cc.sendMessage,
......@@ -234,13 +210,13 @@ class _HomePageState extends State<_HomePage>
messageOptions: Chat.MessageOptions(
onPressMessage: cc.tabMessage,
onLongPressMessage: (mes) => {},
shareMenuBuilder: cc.shareMenuBuilder
// containerColor: Colors.black,
),
shareMenuBuilder: cc.shareMenuBuilder,
multiSelectedBuilder: cc.multiSelectedBuilder
// containerColor: Colors.black,
),
),
),
)
);
));
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment