Browse Source

增加月任务展示

dev-2.0
王子贤 1 month ago
parent
commit
e402dca8d0
10 changed files with 368 additions and 123 deletions
  1. 4
      lib/controller/discover/room_controller.dart
  2. 4
      lib/model/home/user_info_data.dart
  3. 4
      lib/model/live/live_chat_message.dart
  4. 4
      lib/pages/discover/settlement_page.dart
  5. 5
      lib/service/live_chat_message_service.dart
  6. 56
      lib/widget/live/live_room_anchor_showcase.dart
  7. 35
      lib/widget/live/live_room_chat_item.dart
  8. 2
      lib/widget/live/live_room_notice_chat_panel.dart
  9. 375
      lib/widget/live/live_room_user_profile_dialog.dart
  10. 2
      lib/widget/live/month_task_dialog.dart

4
lib/controller/discover/room_controller.dart

@ -316,10 +316,10 @@ class RoomController extends GetxController with WidgetsBindingObserver {
final taskData = TaskData().obs;
getTaskData() async {
getTaskData(int type) async {
try{
final response = await _networkService.userApi.userGetUserTaskComplete(
taskType: 1,
taskType: type,
);
if (response.data.isSuccess) {
if(response.data.data == null){

4
lib/model/home/user_info_data.dart

@ -1,6 +1,7 @@
class UserInfoData {
String? id;
bool? isDelete;
bool? isFriend;
String? createTime;
String? updateTime;
Null? event;
@ -99,6 +100,7 @@ class UserInfoData {
UserInfoData(
{this.id,
this.isDelete,
this.isFriend,
this.createTime,
this.updateTime,
this.event,
@ -197,6 +199,7 @@ class UserInfoData {
UserInfoData.fromJson(Map<String, dynamic> json) {
id = json['id'];
isDelete = json['isDelete'];
isFriend = json['isFriend'];
createTime = json['createTime'];
updateTime = json['updateTime'];
event = json['event'];
@ -309,6 +312,7 @@ class UserInfoData {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['isDelete'] = this.isDelete;
data['isFriend'] = this.isFriend;
data['createTime'] = this.createTime;
data['updateTime'] = this.updateTime;
data['event'] = this.event;

4
lib/model/live/live_chat_message.dart

@ -4,6 +4,7 @@ class LiveChatMessage {
final int? uid;
final String userName;
final String? avatar;
final String? miId;
final String content;
final int timestamp;
@ -11,6 +12,7 @@ class LiveChatMessage {
required this.userId,
required this.userName,
this.avatar,
this.miId,
this.uid,
required this.content,
required this.timestamp,
@ -21,6 +23,7 @@ class LiveChatMessage {
userId: json['userId'],
userName: json['userName'],
avatar: json['avatar'],
miId: json['miId'],
uid: json['uid'],
content: json['content'],
timestamp: json['timestamp'],
@ -32,6 +35,7 @@ class LiveChatMessage {
'userId': userId,
'userName': userName,
'avatar': avatar,
'miId': miId,
'content': content,
'timestamp': timestamp,
};

4
lib/pages/discover/settlement_page.dart

@ -229,7 +229,7 @@ class _SettlementPageState extends State<SettlementPage> {
).onTap(() async {
try{
await _roomController.getTaskData();
await _roomController.getTaskData(1);
FocusScope.of(context).unfocus();
// overlay
@ -260,7 +260,7 @@ class _SettlementPageState extends State<SettlementPage> {
width: 325.w,
).onTap(() async {
try{
await _roomController.getTaskData();
await _roomController.getTaskData(3);
FocusScope.of(context).unfocus();
// overlay

5
lib/service/live_chat_message_service.dart

@ -161,9 +161,13 @@ class LiveChatMessageService {
final avatar = userData?.profilePhoto;
RoomController controller = Get.find<RoomController>();
final uid = controller.rtcChannel.value?.uid;
print(userId);
print(userData?.id);
print("userData?.id");
return {
'type': 'chat_message',
'userId': userId,
'miId': userData?.id,
'userName': userName,
'uid': uid,
'avatar': avatar,
@ -254,6 +258,7 @@ class LiveChatMessageService {
userId: messageData['userId'] as String,
userName: messageData['userName'] as String,
avatar: messageData['avatar'] as String?,
miId: messageData['miId'] as String?,
content: messageData['content'] as String,
timestamp: messageData['timestamp'] as int,
);

56
lib/widget/live/live_room_anchor_showcase.dart

@ -4,6 +4,7 @@ import 'package:dating_touchme_app/controller/global.dart';
import 'package:dating_touchme_app/extension/ex_widget.dart';
import 'package:dating_touchme_app/generated/assets.dart';
import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart';
import 'package:dating_touchme_app/network/user_api.dart';
import 'package:dating_touchme_app/rtc/rtc_manager.dart';
import 'package:dating_touchme_app/widget/live/live_gift_popup.dart';
import 'package:dating_touchme_app/widget/live/live_room_guest_list_dialog.dart';
@ -335,13 +336,13 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
),
),
),
if(!isCurrentUser && userInfo.isFriend != true)
if(userInfo.isFriend != true)
Positioned(
bottom: 5.w,
right: 5.w,
child: Row(
children: [
GestureDetector(
if(!isCurrentUser) GestureDetector(
onTap: (){
if(userInfo.isFriend == true){
return;
@ -368,7 +369,7 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
),
),
),
SizedBox(width: 5.w,),
if(!isCurrentUser) SizedBox(width: 5.w,),
Container(
width: 20.w,
height: 20.w,
@ -421,27 +422,48 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
);
},
),
).onTap(() {
).onTap(() async {
//
final currentUserId = GlobalData().userId ?? GlobalData().userData?.id;
if (currentUserId != null && currentUserId == userInfo.userId) {
//
return;
}
//
showUserProfileDialog(
context,
LiveChatMessage(
userId: userInfo.userId,
uid: userInfo.uid,
userName: userInfo.nickName,
avatar: userInfo.profilePhoto,
content: "",
timestamp: 0
),
() =>
try {
final _userApi = Get.find<UserApi>();
final response = await _userApi.getDongwoMarriageInformationDetail(miId: userInfo.miId);
if (response.data.isSuccess && response.data.data != null) {
//
showUserProfileDialog(
context,
LiveChatMessage(
userId: userInfo.userId,
uid: userInfo.uid,
userName: userInfo.nickName,
avatar: userInfo.profilePhoto,
miId: userInfo.miId,
content: "",
timestamp: 0
),
() =>
_showGiftPopupForUser(userInfo, 1),
);
response.data.data!
);
} else {
//
final errorMsg = response.data.message ?? '获取数据失败';
SmartDialog.showToast(errorMsg);
}
} catch(e, stackTrace){
print('获取用户信息失败: $e');
print('堆栈跟踪: $stackTrace');
SmartDialog.showToast('获取用户信息失败,请稍后重试');
// rethrow退
}
}),
SizedBox(width: 5.w),
SizedBox(

35
lib/widget/live/live_room_chat_item.dart

@ -3,6 +3,7 @@ import 'package:dating_touchme_app/controller/global.dart';
import 'package:dating_touchme_app/extension/ex_widget.dart';
import 'package:dating_touchme_app/generated/assets.dart';
import 'package:dating_touchme_app/model/live/live_chat_message.dart';
import 'package:dating_touchme_app/network/user_api.dart';
import 'package:dating_touchme_app/widget/live/live_gift_popup.dart';
import 'package:dating_touchme_app/widget/live/live_room_user_profile_dialog.dart';
import 'package:flutter/material.dart';
@ -80,19 +81,41 @@ class LiveRoomChatItem extends StatelessWidget {
width: 25.w,
height: 25.w,
),
).onTap(() {
).onTap(() async {
//
final currentUserId = GlobalData().userId ?? GlobalData().userData?.id;
if (currentUserId != null && currentUserId == message.userId) {
//
return;
}
try {
final _userApi = Get.find<UserApi>();
final response = await _userApi.getDongwoMarriageInformationDetail(miId: message.miId ?? "");
if (response.data.isSuccess && response.data.data != null) {
showUserProfileDialog(
context,
message,
() => _showGiftPopup(context, 1),
response.data.data!
);
} else {
//
final errorMsg = response.data.message ?? '获取数据失败';
SmartDialog.showToast(errorMsg);
}
} catch(e, stackTrace){
print('获取用户信息失败: $e');
print('堆栈跟踪: $stackTrace');
SmartDialog.showToast('获取用户信息失败,请稍后重试');
// rethrow退
}
//
showUserProfileDialog(
context,
message,
() => _showGiftPopup(context, 1),
);
})
: Image.asset(
Assets.imagesUserAvatar,

2
lib/widget/live/live_room_notice_chat_panel.dart

@ -222,7 +222,7 @@ class _LiveRoomNoticeChatPanelState extends State<LiveRoomNoticeChatPanel> {
//
try{
await roomController.getTaskData();
await roomController.getTaskData(1);
FocusScope.of(context).unfocus();
// overlay

375
lib/widget/live/live_room_user_profile_dialog.dart

@ -2,6 +2,7 @@ import 'package:dating_touchme_app/controller/discover/room_controller.dart';
import 'package:dating_touchme_app/controller/overlay_controller.dart';
import 'package:dating_touchme_app/extension/ex_widget.dart';
import 'package:dating_touchme_app/generated/assets.dart';
import 'package:dating_touchme_app/model/home/user_info_data.dart';
import 'package:dating_touchme_app/model/live/live_chat_message.dart';
import 'package:dating_touchme_app/pages/message/chat_page.dart';
import 'package:flutter/material.dart';
@ -14,6 +15,7 @@ void showUserProfileDialog(
BuildContext context,
LiveChatMessage message,
VoidCallback onShowGiftPopup,
UserInfoData userData,
) {
@ -33,7 +35,7 @@ void showUserProfileDialog(
topRight: Radius.circular(20.w),
),
),
height: 230.w,
height: 210.w,
margin: EdgeInsets.only(top: 40.w),
padding: EdgeInsets.symmetric(horizontal: 15.w),
child: Column(
@ -41,16 +43,190 @@ void showUserProfileDialog(
children: [
SizedBox(height: 10.w,),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
GestureDetector(
onTap: () => SmartDialog.dismiss(),
child: Icon(
Icons.close,
size: 24.w,
color: const Color.fromRGBO(153, 153, 153, 1),
),
),
],
),
SizedBox(height: 15.w,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
message.userName,
style: TextStyle(
fontSize: 18.w,
fontWeight: FontWeight.w600,
color: const Color.fromRGBO(51, 51, 51, 1),
),
)
],
),
Row(
children: [
SizedBox(width: 30.w),
//
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 8.w),
//
Center(
child: Wrap(
spacing: 6.w,
runSpacing: 6.w,
runAlignment: WrapAlignment.center,
children: [
if(userData.genderCode == 0) Container(
width: 33.w,
height: 13.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(13.w)),
color: const Color.fromRGBO(237, 245, 255, 1)
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
Assets.imagesMale,
width: 8.w,
height: 8.w,
),
SizedBox(width: 2.w,),
Text(
"${
calculateAge(
(userData.birthDate != null && userData.birthDate!.isNotEmpty) ?
(userData.birthDate ?? "") : userData.birthYear != null && userData.birthYear!.isNotEmpty ?
"${userData.birthYear}-01-01" : "")
}",
style: TextStyle(
fontSize: 11.w,
color: const Color.fromRGBO(120, 140, 255, 1)
),
)
],
),
),
if(userData.genderCode == 1) Container(
width: 33.w,
height: 13.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(13.w)),
color: const Color.fromRGBO(255, 237, 255, 1)
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
Assets.imagesFemale,
width: 8.w,
height: 8.w,
),
SizedBox(width: 2.w,),
Text(
"${
calculateAge(
(userData.birthDate != null && userData.birthDate!.isNotEmpty) ?
(userData.birthDate ?? "") : userData.birthYear != null && userData.birthYear!.isNotEmpty ?
"${userData.birthYear}-01-01" : "")
}",
style: TextStyle(
fontSize: 11.w,
color: const Color.fromRGBO(255, 66, 236, 1)
),
)
],
),
),
if(userData.height != null && userData.height != 0) Container(
width: 33.w,
height: 13.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(13.w)),
color: const Color.fromRGBO(245, 247, 255, 1)
),
child: Center(
child: Text(
"${userData.height}",
style: TextStyle(
fontSize: 11.w,
),
),
),
),
if(userData.provinceName != null && userData.provinceName != "") Container(
width: 33.w,
height: 13.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(13.w)),
color: const Color.fromRGBO(245, 247, 255, 1)
),
child: Center(
child: Text(
"${userData.provinceName}",
style: TextStyle(
fontSize: 11.w,
),
),
),
),
if(userData.occupation != null && userData.occupation != "") Container(
width: 33.w,
height: 13.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(13.w)),
color: const Color.fromRGBO(245, 247, 255, 1)
),
child: Center(
child: Text(
"${userData.occupation}",
style: TextStyle(
fontSize: 11.w,
),
),
),
),
],
),
),
],
),
),
],
),
SizedBox(height: 10.w,),
if(isHost) Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(width: 110.w,),
if(isHost) Container(
width: 100.w,
height: 30.w,
margin: EdgeInsets.only(right: 10.w),
if(
(userData.genderCode == 0 &&
roomController.rtcChannelDetail.value?.maleInfo?.userId != userData.miUserId) ||
(userData.genderCode == 1 &&
roomController.rtcChannelDetail.value?.femaleInfo?.userId != userData.miUserId)
) Container(
width: 165.w,
height: 35.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(9.w)),
borderRadius: BorderRadius.all(Radius.circular(8.w)),
color: const Color.fromRGBO(253, 43, 84, 1),
gradient: const LinearGradient(
colors: [
Color.fromRGBO(117, 98, 249, 1),
Color.fromRGBO(152, 124, 255, 1),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(
child: Text(
@ -70,19 +246,53 @@ void showUserProfileDialog(
roomController.setDialogDismiss(false);
}),
if(isHost) Container(
width: 81.w,
height: 30.w,
margin: EdgeInsets.only(right: 10.w),
if(
(userData.genderCode == 0 &&
roomController.rtcChannelDetail.value?.maleInfo?.userId == userData.miUserId) ||
(userData.genderCode == 1 &&
roomController.rtcChannelDetail.value?.femaleInfo?.userId == userData.miUserId)
) Container(
width: 165.w,
height: 35.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(9.w)),
color: const Color.fromRGBO(245, 245, 245, 1),
borderRadius: BorderRadius.all(Radius.circular(8.w)),
color: const Color.fromRGBO(253, 43, 84, 1),
gradient: const LinearGradient(
colors: [
Color.fromRGBO(117, 98, 249, 1),
Color.fromRGBO(152, 124, 255, 1),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(
child: Text(
"踢出房间",
"抱下麦",
style: TextStyle(
color: const Color.fromRGBO(144, 144, 144, 1)
color: Colors.white
),
),
),
).onTap(() async {
await roomController.endMic(
channelId: roomController.rtcChannelDetail.value!.channelId,
kickingUId: message.uid ?? 0);
SmartDialog.dismiss();
}),
if(userData.isFriend ?? false) Container(
width: 165.w,
height: 35.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8 .w)),
color: const Color.fromRGBO(51, 51, 51, 1),
),
child: Center(
child: Text(
"提出房间",
style: TextStyle(
color: Colors.white
),
),
),
@ -98,83 +308,26 @@ void showUserProfileDialog(
SmartDialog.dismiss();
roomController.setDialogDismiss(false);
}),
GestureDetector(
onTap: () => SmartDialog.dismiss(),
child: Icon(
Icons.close,
size: 24.w,
color: const Color.fromRGBO(153, 153, 153, 1),
if(!(userData.isFriend ?? false)) Container(
width: 165.w,
height: 35.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8 .w)),
color: const Color.fromRGBO(245, 154, 35, 1),
),
),
],
),
SizedBox(height: 10.w,),
//
Row(
children: [
SizedBox(width: 30.w),
//
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
message.userName,
style: TextStyle(
fontSize: 18.w,
fontWeight: FontWeight.w600,
color: const Color.fromRGBO(51, 51, 51, 1),
),
),
SizedBox(height: 8.w),
//
Wrap(
spacing: 6.w,
runSpacing: 6.w,
children: [
_buildTag(
'在线',
const Color.fromRGBO(198, 246, 213, 1),
),
],
child: Center(
child: Text(
"加好友",
style: TextStyle(
color: Colors.white
),
],
),
),
],
),
SizedBox(height: 25.w),
//
GestureDetector(
onTap: () {
SmartDialog.dismiss();
onShowGiftPopup();
},
child: Container(
width: double.infinity,
height: 44.w,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [
Color.fromRGBO(117, 98, 249, 1),
Color.fromRGBO(152, 124, 255, 1),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
borderRadius: BorderRadius.circular(22.w),
),
child: Center(
child: Text(
'送礼物',
style: TextStyle(
fontSize: 16.w,
color: Colors.white,
fontWeight: FontWeight.w500,
),
),
),
),
).onTap(() async {
SmartDialog.dismiss();
onShowGiftPopup();
}),
],
),
SizedBox(height: 15.w),
//
@ -189,11 +342,29 @@ void showUserProfileDialog(
}),
Container(
width: 1.w,
height: 12.w,
color: const Color.fromRGBO(229, 229, 229, 1),
height: 15.w,
color: const Color.fromRGBO(212, 212, 212, 1),
margin: EdgeInsets.symmetric(horizontal: 15.w),
),
if(!(userData.isFriend ?? false)) _buildActionLink('踢出房间', () async {
//
await roomController.kickingRtcChannelUser(
channelId: roomController.rtcChannelDetail.value!.channelId,
kickingUId: message.uid ?? 0);
//
FocusScope.of(context).unfocus();
// overlay
SmartDialog.dismiss();
roomController.setDialogDismiss(false);
}),
if(!(userData.isFriend ?? false)) Container(
width: 1.w,
height: 15.w,
color: const Color.fromRGBO(212, 212, 212, 1),
margin: EdgeInsets.symmetric(horizontal: 15.w),
),
_buildActionLink('送礼物加好友', () {
_buildActionLink('送礼物', () {
SmartDialog.dismiss();
onShowGiftPopup();
}),
@ -203,7 +374,7 @@ void showUserProfileDialog(
),
),
Container(
margin: EdgeInsets.only(left: 30.w),
margin: EdgeInsets.only(left: 147.5.w),
child: ClipOval(
child: message.avatar != null && message.avatar!.isNotEmpty
? Image.network(
@ -255,10 +426,26 @@ Widget _buildActionLink(String text, VoidCallback onTap) {
child: Text(
text,
style: TextStyle(
fontSize: 12.w,
color: const Color.fromRGBO(153, 153, 153, 1),
fontSize: 14.w,
fontWeight: FontWeight.w500,
color: const Color.fromRGBO(117, 98, 249, 1),
),
),
);
}
int calculateAge(String birthdayStr) {
final birthday = DateTime.parse(birthdayStr); // 1996-1-20
final today = DateTime.now();
int age = today.year - birthday.year;
// 1
if (today.month < birthday.month ||
(today.month == birthday.month && today.day < birthday.day)) {
age--;
}
return age;
}

2
lib/widget/live/month_task_dialog.dart

@ -143,7 +143,7 @@ class _TaskItemState extends State<TaskItem> {
),
),
Text(
"${widget.item.completeCount ?? ""}/${widget.item.requiredCount ?? ""}${widget.item.sort == 1 ? "分钟" : widget.item.sort == 2 ? "" : ""}",
"${widget.item.completeCount ?? ""}/${widget.item.requiredCount ?? ""}${widget.item.subTaskType == 4 ? "玫瑰" : widget.item.subTaskType == 1 ? "分钟" : widget.item.subTaskType == 2 ? "" : ""}",
style: TextStyle(
fontSize: 12.w,
color: const Color.fromRGBO(144, 144, 144, 1)

Loading…
Cancel
Save