import 'package:dating_touchme_app/config/emoji_config.dart'; import 'package:dating_touchme_app/model/home/post_data.dart'; import 'package:dating_touchme_app/network/home_api.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:dating_touchme_app/model/home/post_comment_data.dart' as pcd; class TimelineInfoController extends GetxController { final String id; TimelineInfoController({required this.id}); final showInput = false.obs; late final HomeApi _homeApi; final item = Records().obs; final imgList = [].obs; final commentList = [].obs; final page = 1.obs; final size = 10.obs; final parentId = "0".obs; late final EasyRefreshController listRefreshController; final message = ''.obs; final messageController = TextEditingController().obs; final focusNode = FocusNode().obs; @override void onInit() { super.onInit(); listRefreshController = EasyRefreshController( controlFinishRefresh: true, controlFinishLoad: true, ); // 从全局依赖中获取HomeApi _homeApi = Get.find(); getPostData(); getCommentData(); } @override void onClose() { super.onClose(); focusNode.value.dispose(); } getPostData() async { try { final response = await _homeApi.userPagePostDetail(id: id); if (response.data.isSuccess && response.data.data != null) { item.value = response.data.data ?? Records(); if(item.value.mediaUrls != null && item.value.mediaUrls != ""){ imgList.value = item.value.mediaUrls!.split(","); } } else { // 响应失败,抛出异常 throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ print('详情获取失败: $e'); SmartDialog.showToast('详情获取失败'); rethrow; } } getCommentData() async { try { final response = await _homeApi.userPagePostComment( postId: id, pageNum: page.value, pageSize: size.value ); if (response.data.isSuccess && response.data.data != null) { final data = response.data.data?.records ?? []; commentList.addAll(data); if((data.length ?? 0) == size.value){ listRefreshController.finishLoad(IndicatorResult.success); } else { listRefreshController.finishLoad(IndicatorResult.noMore); } } else { // 响应失败,抛出异常 throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ print('详情获取失败: $e'); SmartDialog.showToast('详情获取失败'); rethrow; } } likePost() async { try { final response = await _homeApi.userLikePost({ "id": id, "isLiked": !(item.value.isLiked ?? false), }); if (response.data.isSuccess) { if(item.value.isLiked ?? false){ SmartDialog.showToast('取消点赞成功'); } else { SmartDialog.showToast('点赞成功'); } getPostData(); } else { // 响应失败,抛出异常 throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ print('帖子发布失败: $e'); SmartDialog.showToast('帖子发布失败'); rethrow; } } sendComment() async { try { if(message.value == ""){ SmartDialog.showToast('请输入评论'); return; } final response = await _homeApi.userCreatePostComment({ "postId": id, "parentId": parentId.value, "content": message.value, }); if (response.data.isSuccess) { page.value = 1; commentList.clear(); getPostData(); getCommentData(); showInput.value = false; FocusScope.of(Get.context!).unfocus(); parentId.value = "0"; message.value = ""; messageController.value.value = TextEditingValue( text: message.value, selection: TextSelection.fromPosition(TextPosition(offset: message.value.length)), ); } else { // 响应失败,抛出异常 throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ print('帖子发布失败: $e'); SmartDialog.showToast('帖子发布失败'); rethrow; } } /// 构建输入框内容(文本+表情) List buildInputContentWidgets() { final List widgets = []; final text = item.value.content ?? ""; final RegExp emojiRegex = RegExp(r'\[emoji:(\d+)\]'); int lastMatchEnd = 0; final matches = emojiRegex.allMatches(text); for (final match in matches) { // 添加表情之前的文本 if (match.start > lastMatchEnd) { final textPart = text.substring(lastMatchEnd, match.start); widgets.add( Text( textPart, style: TextStyle(fontSize: 14.sp, color: Colors.black), ), ); } // 添加表情图片 final emojiId = match.group(1); if (emojiId != null) { final emoji = EmojiConfig.getEmojiById(emojiId); if (emoji != null) { widgets.add( Padding( padding: EdgeInsets.symmetric(horizontal: 0), child: Image.asset( emoji.path, width: 24.w, height: 24.w, fit: BoxFit.contain, ), ), ); } } lastMatchEnd = match.end; } // 添加剩余的文本 if (lastMatchEnd < text.length) { final textPart = text.substring(lastMatchEnd); widgets.add( Text( textPart, style: TextStyle(fontSize: 14.sp, color: Colors.black), ), ); } return widgets; } }