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
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;
|
|
}
|
|
}
|