chatapp3-flutter/lib/modules/admin/editing/sc_editing_user_room_page.dart
2026-04-09 21:32:23 +08:00

702 lines
33 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_debouncer/flutter_debouncer.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/app/config/business_logic_strategy.dart';
import 'package:yumi/ui_kit/components/sc_compontent.dart';
import 'package:yumi/ui_kit/components/text/sc_text.dart';
import 'package:yumi/shared/tools/sc_pick_utils.dart';
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
import 'package:yumi/shared/data_sources/sources/repositories/sc_room_repository_imp.dart';
import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart';
import 'package:yumi/shared/business_logic/models/res/login_res.dart';
import 'package:yumi/ui_kit/components/appbar/socialchat_appbar.dart';
import 'package:yumi/ui_kit/components/sc_tts.dart';
import 'package:yumi/app/constants/sc_screen.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/app/routes/sc_fluro_navigator.dart';
import 'package:yumi/shared/tools/sc_room_utils.dart';
import 'package:yumi/shared/business_logic/models/res/room_res.dart';
import 'package:yumi/modules/index/main_route.dart';
class SCEditingUserRoomPage extends StatefulWidget {
final String type;
///被举报的id(用户id或者房间id)
final SocialChatUserProfile? userProfile;
final SocialChatRoomRes? roomProfile;
const SCEditingUserRoomPage({
Key? key,
required this.type,
this.userProfile,
this.roomProfile,
}) : super(key: key);
@override
_SCEditingUserRoomPageState createState() => _SCEditingUserRoomPageState();
}
class _SCEditingUserRoomPageState extends State<SCEditingUserRoomPage> {
// 业务逻辑策略访问器
BusinessLogicStrategy get _strategy => SCGlobalConfig.businessLogicStrategy;
num selectedIndex = 0;
String reportReason = "";
List<String> imageUrls = []; // 动态图片URL列表
int violationType = 1;
final TextEditingController _descriptionController = TextEditingController();
Debouncer debouncer = Debouncer();
@override
void initState() {
super.initState();
final violationTypeMapping = _strategy.getAdminEditingViolationTypeMapping(widget.type);
if (violationTypeMapping.isNotEmpty) {
// 获取第一个值作为默认违规类型
violationType = violationTypeMapping.values.first;
}
// 初始化图片URL列表长度为最大上传数量
final maxImageCount = _strategy.getAdminEditingMaxImageUploadCount();
imageUrls = List.generate(maxImageCount, (index) => '');
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.asset(
_strategy.getAdminEditingBackgroundImage(),
width: ScreenUtil().screenWidth,
height: ScreenUtil().screenHeight,
fit: BoxFit.fill,
),
Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: false,
appBar: SocialChatStandardAppBar(
actions: [],
title:
widget.type == "User"
? SCAppLocalizations.of(context)!.userEditing
: SCAppLocalizations.of(context)!.roomEditing,
backgroundColor: Colors.transparent,
),
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
widget.type == "User"
? Container(
padding: EdgeInsets.symmetric(
vertical: 8.w,
horizontal: 5.w,
),
margin: EdgeInsets.symmetric(horizontal: 15.w),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.black12, width: 1.w),
borderRadius: BorderRadius.all(Radius.circular(12.w)),
),
child: Row(
children: [
GestureDetector(
onTap: () {
SCNavigatorUtils.push(
context,
"${SCMainRoute.person}?isMe=${AccountStorage().getCurrentUser()?.userProfile?.id == widget.userProfile?.id}&tageId=${widget.userProfile?.id}",
);
},
behavior: HitTestBehavior.opaque,
child: head(
url: widget.userProfile?.userAvatar ?? "",
width: 55.w,
),
),
SizedBox(width: 2.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: <Widget>[
xb(
widget.userProfile?.userSex,
color:
widget.userProfile?.userSex == 1
? Colors.blue
: Colors.purpleAccent,
),
SizedBox(width: 5.w),
// richText(
// txt: data.userNickname ?? "",
// key: (widget as SearchUserList).text,
// highlight: SocialChatTheme.primaryColor,
// defaultColor: Colors.black,
// ),
Expanded(
child: text(
widget.userProfile?.userNickname ??
"",
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.black,
),
),
SizedBox(width: 5.w),
// dj(data.level.toString()),
],
),
Row(
children: [
GestureDetector(
child: Container(
padding: EdgeInsets.symmetric(
vertical: 8.w,
),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
(widget.userProfile
?.hasSpecialId() ??
false)
? _strategy.getAdminEditingIcon('specialIdBg')
: _strategy.getAdminEditingIcon('normalIdBg'),
),
fit: BoxFit.fitWidth,
),
),
child: Row(
textDirection: TextDirection.ltr,
children: [
SizedBox(width: 38.w),
text(
widget.userProfile?.getID() ??
"",
fontSize: 12.sp,
textColor: Colors.white,
fontWeight: FontWeight.bold,
),
SizedBox(width: 5.w),
Image.asset(
_strategy.getAdminEditingIcon('copyId'),
width: 12.w,
height: 12.w,
),
SizedBox(width: 8.w),
],
),
),
onTap: () {
Clipboard.setData(
ClipboardData(
text:
widget.userProfile?.getID() ??
"",
),
);
SCTts.show(
SCAppLocalizations.of(
context,
)!.copiedToClipboard,
);
},
),
],
),
],
),
),
SizedBox(width: 5.w),
],
),
)
: Container(
padding: EdgeInsets.symmetric(
vertical: 8.w,
horizontal: 5.w,
),
margin: EdgeInsets.symmetric(horizontal: 15.w),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.black12, width: 1.w),
borderRadius: BorderRadius.all(Radius.circular(12.w)),
),
child: Row(
children: [
GestureDetector(
onTap: () {
SCRoomUtils.goRoom(
widget.roomProfile?.id ?? "",
context,
);
},
behavior: HitTestBehavior.opaque,
child: head(
url: widget.roomProfile?.roomCover ?? "",
width: 55.w,
),
),
SizedBox(width: 2.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: <Widget>[
Expanded(
child: text(
widget.roomProfile?.roomName ?? "",
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.black,
),
),
SizedBox(width: 5.w),
// dj(data.level.toString()),
],
),
Row(
children: [
GestureDetector(
child: Container(
padding: EdgeInsets.symmetric(
vertical: 8.w,
),
child: Row(
textDirection: TextDirection.ltr,
children: [
SizedBox(width: 5.w),
text(
"ID:${widget.roomProfile?.roomAccount}",
fontSize: 12.sp,
textColor: Colors.black26,
fontWeight: FontWeight.bold,
),
SizedBox(width: 5.w),
Image.asset(
_strategy.getAdminEditingIcon('copyId'),
width: 12.w,
height: 12.w,
color: Colors.black26,
),
SizedBox(width: 8.w),
],
),
),
onTap: () {
Clipboard.setData(
ClipboardData(
text:
widget
.roomProfile
?.roomAccount ??
"",
),
);
SCTts.show(
SCAppLocalizations.of(
context,
)!.copiedToClipboard,
);
},
),
],
),
],
),
),
SizedBox(width: 5.w),
],
),
),
SizedBox(height: 10.w),
Row(
children: [
SizedBox(width: 15.w),
text(
SCAppLocalizations.of(
context,
)!.pleaseSelectTheTypeToProcess,
fontSize: 14.sp,
fontWeight: FontWeight.w600,
textColor: Colors.black,
),
SizedBox(width: 15.w),
],
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
border: Border.all(color: Color(0xffE6E6E6), width: 1.w),
),
margin: EdgeInsets.only(top: 10.w, left: 15.w, right: 15.w),
padding: EdgeInsets.symmetric(horizontal: 15.w),
child: Column(
children: [
// 动态生成违规类型选项
..._buildViolationTypeOptions(context),
SizedBox(height: 20.w,),
Row(
children: [
text(
SCAppLocalizations.of(context)!.description,
fontSize: 14.sp,
fontWeight: FontWeight.w500,
textColor: Colors.black,
),
Spacer(),
],
),
SizedBox(height: 8.w),
Container(
padding: EdgeInsets.all(5.w),
decoration: _strategy.getAdminEditingInputDecoration(),
child: TextField(
controller: _descriptionController,
onChanged: (text) {},
maxLength: _strategy.getAdminEditingDescriptionMaxLength(),
maxLines: 5,
decoration: InputDecoration(
hintText:
SCAppLocalizations.of(context)!.inputDesHint,
hintStyle: TextStyle(
color: Colors.black45,
fontSize: 14.sp,
),
contentPadding: EdgeInsets.only(top: 0.w),
isDense: true,
filled: false,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
border: InputBorder.none,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
disabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
// enabledBorder: UnderlineInputBorder(
// borderSide: BorderSide(width: 0.5,color: Colors.white,style: BorderStyle.solid),),
// focusedBorder: UnderlineInputBorder(
// borderSide: BorderSide(width: 0.5,color: Colors.white,style: BorderStyle.solid),),
// prefixIcon: Padding(padding: EdgeInsets.all(8.w), child: Image.asset("images/login/sc_icon_phone.png",width: 20.w, height: 20.w,fit: BoxFit.fill,),),
fillColor: Colors.black45,
),
style: TextStyle(
fontSize: sp(15),
color: Colors.black,
textBaseline: TextBaseline.alphabetic,
),
),
),
SizedBox(height: 5.w),
Row(
children: [
text(
SCAppLocalizations.of(context)!.screenshotTips,
fontSize: 14.sp,
textColor: Colors.black,
fontWeight: FontWeight.w500,
),
Spacer(),
],
),
SizedBox(height: 8.w),
Row(
children: [
// 动态生成图片上传组件
...List.generate(_strategy.getAdminEditingMaxImageUploadCount(), (index) {
return Expanded(
child: GestureDetector(
child: Stack(
children: [
imageUrls[index].isNotEmpty
? netImage(url: imageUrls[index], height: 100.w)
: Image.asset(
_strategy.getAdminEditingIcon('addPic'),
height: 100.w,
),
imageUrls[index].isNotEmpty
? Positioned(
top: 5.w,
right: 5.w,
child: GestureDetector(
child: Image.asset(
_strategy.getAdminEditingIcon('closePic'),
width: 14.w,
height: 14.w,
),
onTap: () {
setState(() {
imageUrls[index] = "";
});
},
),
)
: Container(),
],
),
onTap: () {
SCPickUtils.pickImage(context, (
bool success,
String url,
) {
if (success) {
setState(() {
imageUrls[index] = url;
});
}
});
},
),
);
}).expand((widget) => [widget, if (_strategy.getAdminEditingMaxImageUploadCount() > 1 && widget != Expanded) SizedBox(width: 5.w)]).toList(),
],
),
SizedBox(height: 15.w),
],
),
),
SizedBox(height: 45.w),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
debouncer.debounce(
duration: Duration(milliseconds: 350),
onDebounce: () {
List<String> uploadedImages = imageUrls.where((url) => url.isNotEmpty).toList();
if (widget.type == "User") {
SCAccountRepository().userViolationHandle(
widget.userProfile?.id ?? "",
violationType,
1,
_descriptionController.text,
imageUrls: imageUrls,
).then((b){
SCTts.show(SCAppLocalizations.of(context)!.operationSuccessful);
SCNavigatorUtils.goBack(context);
}).catchError((e){
});
} else {
SCChatRoomRepository().roomViolationHandle(
widget.roomProfile?.id ?? "",
violationType,
1,
_descriptionController.text,
imageUrls: imageUrls,
).then((b){
SCTts.show(SCAppLocalizations.of(context)!.operationSuccessful);
SCNavigatorUtils.goBack(context);
}).catchError((e){
});
}
},
);
},
child: Container(
height: 40.w,
width: double.infinity,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 45.w),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: AlignmentDirectional.topCenter,
end: AlignmentDirectional.bottomCenter,
colors: _strategy.getAdminEditingButtonGradient('warning'),
),
borderRadius: BorderRadius.circular(25.w),
),
child: Text(
SCAppLocalizations.of(context)!.warning,
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w600,
),
),
),
),
SizedBox(height: 20.w),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
debouncer.debounce(
duration: Duration(milliseconds: 350),
onDebounce: () {
List<String> uploadedImages = imageUrls.where((url) => url.isNotEmpty).toList();
if (widget.type == "User") {
SCAccountRepository().userViolationHandle(
widget.userProfile?.id ?? "",
violationType,
2,
_descriptionController.text,
imageUrls: imageUrls,
).then((b){
SCTts.show(SCAppLocalizations.of(context)!.operationSuccessful);
SCNavigatorUtils.goBack(context);
}).catchError((e){
});
} else {
SCChatRoomRepository().roomViolationHandle(
widget.roomProfile?.id ?? "",
violationType,
2,
_descriptionController.text,
imageUrls: imageUrls,
).then((b){
SCTts.show(SCAppLocalizations.of(context)!.operationSuccessful);
SCNavigatorUtils.goBack(context);
}).catchError((e){
});
}
},
);
},
child: Container(
height: 40.w,
width: double.infinity,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 45.w),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: AlignmentDirectional.topCenter,
end: AlignmentDirectional.bottomCenter,
colors: _strategy.getAdminEditingButtonGradient('adjust'),
),
borderRadius: BorderRadius.circular(25.w),
),
child: Text(
SCAppLocalizations.of(context)!.adjust,
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w600,
),
),
),
),
SizedBox(height: 35.w),
],
),
),
),
),
],
);
}
List<Widget> _buildViolationTypeOptions(BuildContext context) {
final violationTypeMapping = _strategy.getAdminEditingViolationTypeMapping(widget.type);
final List<Widget> options = [];
if (violationTypeMapping.isEmpty) {
// 如果没有映射,返回默认选项
if (widget.type == "User") {
options.add(_item(SCAppLocalizations.of(context)!.userName, 0, 1));
options.add(_item(SCAppLocalizations.of(context)!.userProfilePicture, 1, 2));
} else {
options.add(_item(SCAppLocalizations.of(context)!.roomName, 0, 3));
options.add(_item(SCAppLocalizations.of(context)!.roomProfilePicture, 1, 4));
options.add(_item(SCAppLocalizations.of(context)!.roomNotice, 2, 5));
options.add(_item(SCAppLocalizations.of(context)!.roomTheme, 3, 6));
}
return options;
}
// 根据映射动态生成选项
int index = 0;
violationTypeMapping.forEach((displayName, typeId) {
// 需要将英文显示名称转换为本地化文本
String localizedName;
switch (displayName) {
case 'Pornography':
localizedName = SCAppLocalizations.of(context)!.pornography;
break;
case 'Illegal information':
localizedName = SCAppLocalizations.of(context)!.illegalInformation;
break;
case 'Fraud':
localizedName = SCAppLocalizations.of(context)!.fraud;
break;
case 'Other':
localizedName = SCAppLocalizations.of(context)!.others;
break;
case 'User Name':
localizedName = SCAppLocalizations.of(context)!.userName;
break;
case 'User Profile Picture':
localizedName = SCAppLocalizations.of(context)!.userProfilePicture;
break;
case 'Room Name':
localizedName = SCAppLocalizations.of(context)!.roomName;
break;
case 'Room Profile Picture':
localizedName = SCAppLocalizations.of(context)!.roomProfilePicture;
break;
case 'Room Notice':
localizedName = SCAppLocalizations.of(context)!.roomNotice;
break;
case 'Room Theme':
localizedName = SCAppLocalizations.of(context)!.roomTheme;
break;
default:
localizedName = displayName;
}
options.add(_item(localizedName, index, typeId));
index++;
});
return options;
}
Widget _item(String str, int index, int vtype) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
reportReason = str;
selectedIndex = index;
violationType = vtype;
});
},
child: Container(
width: double.infinity,
height: 35.w,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
text(str, fontSize: 13.sp, textColor: Colors.black,fontWeight: FontWeight.w500),
Spacer(),
selectedIndex == index
? Image.asset(
_strategy.getAdminEditingIcon('checked'),
width: 20.w,
fit: BoxFit.fitWidth,
)
: Container(
width: 20.w,
height: 20.w,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: Colors.grey, width: 2.w),
),
),
],
),
),
);
}
}