You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

224 lines
5.8 KiB

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 = <String>[].obs;
final commentList = <pcd.Records>[].obs;
final page = 1.obs;
final size = 10.obs;
final parentId = "0".obs;
late final EasyRefreshController listRefreshController;
final message = ''.obs;
final messageController = TextEditingController().obs;
@override
void onInit() {
super.onInit();
listRefreshController = EasyRefreshController(
controlFinishRefresh: true,
controlFinishLoad: true,
);
// 从全局依赖中获取HomeApi
_homeApi = Get.find<HomeApi>();
getPostData();
getCommentData();
}
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;
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<Widget> buildInputContentWidgets() {
final List<Widget> 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;
}
}