flutter/lib/pages/video/report.dart
2025-08-27 15:11:37 +08:00

249 lines
8.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:loopin/service/http.dart';
import 'package:loopin/api/video_api.dart';
import 'package:flutter/services.dart';
import 'package:loopin/components/my_toast.dart';
import 'package:loopin/utils/getCommonDictionary.dart';
import '../../behavior/custom_scroll_behavior.dart';
class ReportPage extends StatefulWidget {
const ReportPage({super.key});
@override
State<ReportPage> createState() => _ReportPageState();
}
class _ReportPageState extends State<ReportPage> with SingleTickerProviderStateMixin {
int? _selectedIndex;
late dynamic args;
final TextEditingController _reportController = TextEditingController();
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
List<dynamic> reasonTypeData = [];
@override
void initState() {
super.initState();
args = Get.arguments ?? {};
getReportReasons('ums_feedback_reasontype'); // 获取投诉枚举
}
@override
void dispose() {
_reportController.dispose();
super.dispose();
}
// 加载数据的方法
Future<void> getReportReasons(String key) async {
try {
final data = await Commondictionary.getCommonDictionary(key);
setState(() {
reasonTypeData = data;
});
} catch (e) {
print('加载失败: $e');
}
}
// 投诉视频
Future<void> doReportVideo(String dictValue, String reasonText) async {
try {
final res = await Http.post(VideoApi.reportVideoApi, data: {
'type': '1', // 类型 1 举报 2 投诉 3 建议
'content': reasonText,
'aimId': args['id'],
'aimType': '4', // 1 会员 2 群组 3 评论 4 视频 5 聊天
'reasonType':dictValue
});
if (res['code'] == 200) { // 投诉成功,返回视频页面
MyToast().tip(
title: '投诉成功',
position: 'center',
type: 'success',
);
Get.back(result: {'returnTo': '/'});
}else{
MyToast().tip(
title: '投诉失败',
position: 'center',
type: 'error',
);
}
} catch (e) {
print('投诉失败: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey,
backgroundColor: Colors.white,
appBar: AppBar(
centerTitle: true,
backgroundColor: Colors.white,
foregroundColor: Colors.black,
elevation: 0,
title: const Text(
'举报',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
),
body: ScrollConfiguration(
behavior: CustomScrollBehavior().copyWith(scrollbars: false),
child: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'您的举报我们将尽快受理,核实后我们将第一时间告知受理结果,请尽量提交完整的举报描述',
style: TextStyle(fontSize: 13, color: Colors.grey, height: 1.4),
),
const SizedBox(height: 20),
// 两列布局的投诉选项
reasonTypeData.isEmpty
? const Center(child: CircularProgressIndicator())
: GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 8,
mainAxisSpacing: 2,
childAspectRatio: 4,
),
itemCount: reasonTypeData.length,
itemBuilder: (context, index) {
return _buildRadioItem(index);
},
),
const SizedBox(height: 24),
const Text(
'举报描述(选填)',
style: TextStyle(fontSize: 14, color: Colors.black54, fontWeight: FontWeight.w500),
),
const SizedBox(height: 8),
Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey.shade300),
borderRadius: BorderRadius.circular(4),
),
child: TextField(
controller: _reportController,
maxLines: 5,
maxLength: 32,
cursorColor: Colors.black54,
style: const TextStyle(
color: Colors.black54,
fontSize: 14,
),
decoration: const InputDecoration(
contentPadding: EdgeInsets.all(12),
border: InputBorder.none,
hintText: '请输入内容',
hintStyle: TextStyle(color: Colors.grey, fontSize: 13),
),
),
),
Align(
alignment: Alignment.centerRight,
child: Text(
'${_reportController.text.length}/32',
style: const TextStyle(fontSize: 12, color: Colors.grey),
),
),
const SizedBox(height: 30),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: _selectedIndex != null ? _submitReport : null,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
),
child: const Text('提交', style: TextStyle(fontSize: 15)),
),
),
],
),
),
),
);
}
Widget _buildRadioItem(int index) {
final item = reasonTypeData[index];
final isSelected = _selectedIndex == index;
return GestureDetector(
onTap: () {
setState(() {
_selectedIndex = index;
});
},
child: Container(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
children: [
Container(
width: 20,
height: 20,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: isSelected ? Colors.green : Colors.grey,
width: 1.5,
),
),
child: isSelected
? Center(
child: Container(
width: 12,
height: 12,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.green,
),
),
)
: null,
),
const SizedBox(width: 8),
Expanded(
child: Text(
item['dictLabel'] ?? '未知原因',
style: TextStyle(
fontSize: 13,
color: isSelected ? Colors.green : Colors.black54,
),
overflow: TextOverflow.ellipsis,
),
),
],
),
),
);
}
void _submitReport() {
if (_selectedIndex == null) {
MyToast().tip(
title: '请选择举报原因!',
position: 'center',
type: 'error',
);
return;
}
// 获取选中的原因
final selectedReason = reasonTypeData[_selectedIndex!];
final reasonText = _reportController.text;
doReportVideo(selectedReason['dictValue'],reasonText);
}
}