baligh/lib/screens/report_screen.dart
Abdullah Salah e3ea8335d1 First Commit
2024-12-26 09:05:13 +03:00

385 lines
20 KiB
Dart

import 'dart:io';
import 'dart:math';
import 'package:badges/badges.dart' as badges;
import 'package:baligh/screens/success_screen.dart';
import 'package:baligh/widgets/app_toast.dart';
import 'package:baligh/widgets/custom_button.dart';
import 'package:baligh/widgets/custom_text_field.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:file_picker/file_picker.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class ReportScreen extends StatefulWidget {
const ReportScreen({
super.key,
required this.headerText,
});
final String headerText;
@override
State<ReportScreen> createState() => _ReportScreenState();
}
class _ReportScreenState extends State<ReportScreen> {
TextEditingController descriptionController = TextEditingController();
bool isLoading = false;
bool isExpanded = false;
List<File> images = [];
List<File> videos = [];
List<File> audios = [];
String explnationText() {
return widget.headerText == "التحرش"
? """
التحرش هو أي تصرف أو قول غير مرغوب فيه يتعلق بالجنس أو الجنسية، ويهدف إلى إزعاج الشخص الآخر أو تهديده. يمكن أن يحدث التحرش في أماكن العمل، المدارس، الأماكن العامة، أو عبر وسائل التواصل الاجتماعي. يمكن أن يكون التحرش لفظيًا (مثل التعليقات الجنسية)، جسديًا (مثل اللمس غير المناسب)، أو بصريًا (مثل عرض صور غير لائقة).
حقوق المبلغ عن حالة تحرش:
الحماية: على المبلغ أن يشعر بالأمان خلال وبعد تقديم البلاغ. لا يتعرض لأي تهديدات أو انتقادات بسبب تقديمه للبلاغ.
السرية: يتم التعامل مع المعلومات بسرية، إلا إذا كانت هناك حاجة للكشف عنها في إطار التحقيق أو الإجراءات القانونية.
التحقق العادل: يتم التحقيق في البلاغ بموضوعية وبدون تحيز. للشخص المبلغ الحق في معرفة نتائج التحقيق.
عدم الانتقام: الشخص الذي يبلغ عن التحرش محميًا من أي شكل من أشكال الانتقام أو التمييز بسبب البلاغ.
التوجيه والمساعدة: يحق للمبلغ الحصول على استشارات قانونية، نفسية، أو أي نوع من المساعدة يحتاجها خلال هذه العملية.
"""
: widget.headerText == "التعنيف"
? """
التعنيف هو مصطلح يشير إلى استخدام القوة أو العنف ضد شخص آخر بشكل يتسبب له في أذى جسدي أو نفسي أو عاطفي. يمكن أن يحدث التعنيف في عدة سياقات، مثل العلاقات الشخصية، الأسرة، مكان العمل، أو المجتمع بشكل عام يتمتع الشخص المبلغ ضد التعنيف بما يلي 1. الحماية: للشخص المعنف الحق في الحصول على حماية فورية من الجاني، سواء عبر الأوامر القانونية مثل أوامر الحماية، أو من خلال الدعم من الشرطة والجهات المعنية.
2. الأمان: يحق للشخص المعنف العيش في بيئة آمنة خالية من التهديدات والعنف. يمكن أن يتضمن ذلك توفير أماكن إيواء أو دعم لتغيير مكان الإقامة إذا لزم الأمر.
3. الرعاية الصحية: يجب أن يحصل الشخص المعنف على الرعاية الطبية اللازمة لعلاج الإصابات الجسدية والنفسية الناتجة عن العنف.
4. الدعم النفسي: يحق للأشخاص المعنفين الحصول على مشورة ودعم نفسي للتعامل مع الصدمات النفسية والعاطفية التي قد يواجهونها.
5. المشورة القانونية: يجب أن يكون الشخص المعنف قادرًا على الحصول على مشورة قانونية حول حقوقه، الخيارات القانونية المتاحة، وكيفية تقديم الشكاوى.
6. عدم التمييز: لا يتعرض الشخص المعنف للتمييز أو الانتقاص من حقوقه بسبب تعرضه للعنف، ويجب أن يتم التعامل معه بكرامة واحترام.
7.الخصوصية: يجب الحفاظ على سرية المعلومات الشخصية للشخص المعنف، وعدم الكشف عنها دون إذنه.
"""
: widget.headerText == "المخدرات"
? """
المخدرات هي مواد كيميائية تؤثر على الجهاز العصبي المركزي، وقد تؤدي إلى تغييرات في السلوك، المزاج، والإدراك. الكوكايين، الهيروين، والماريجوانا.
الأضرار المحتملة للمخدرات:
1. الصحة الجسدية: يمكن أن تؤدي إلى مشكلات صحية خطيرة مثل أمراض القلب، الكبد، والمشاكل التنفسية.
2. الصحة النفسية: قد تسبب اضطرابات مثل الاكتئاب، القلق، أو الاضطرابات النفسية الأخرى.
3. الاعتبارات الاجتماعية: يمكن أن تؤدي إلى مشكلات في العلاقات الشخصية، العمل، والمجتمع بشكل عام.
حقوق الشخص المبلغ عن المخدرات
إذا كنتَ أو كنتِ تبلغون عن مشكلة تتعلق بالمخدرات، لديكَ حقوق يجب أن تُحترم:
1. الحماية: تكون محميًا من أي شكل من أشكال الانتقام أو الضرر نتيجة تقديم البلاغ.
يمكن أن يشمل ذلك حماية من الجاني أو من أي طرف آخر قد يسعى للإضرار بك.
2. السرية: الحفاظ على سرية هويتك ومعلوماتك الشخصية خلال عملية التحقيق.
لا ينبغي الكشف عن تفاصيل البلاغ دون موافقتك، إلا في حال كانت هناك ضرورة قانونية لذلك.
3. التحقق العادل: يتم التحقيق في البلاغ بموضوعية ونزاهة، مع ضمان أن يتم التعامل مع كل الأطراف بشكل عادل.
4. التوجيه والمساعدة:
الحصول على المشورة القانونية والمساعدة في حال كنت تحتاجين إليها خلال عملية البلاغ.
يمكن أن يتضمن ذلك مشورة حول كيفية حماية نفسك وضمان حقوقك القانونية.
5. عدم التمييز:
لا تتعرض للتمييز أو العقوبات بسبب تقديمك للبلاغ.
يُعامل كل من يقدم البلاغ بكرامة واحترام.
"""
: widget.headerText == "الرشوة"
? """
الرشوة هي جريمة تحدث عندما يقدم شخص ما أو يستلم مكافأة أو مالًا بشكل غير قانوني مقابل تأثيره على سلوك أو قرار معين في إطار عمله أو منصبه. تُعتبر الرشوة جريمة جنائية في معظم القوانين حول العالم.
إذا قام شخص بتقديم بلاغ عن جريمة رشوة، فإن هناك حقوقاً معينة يتمتع بها،
حماية هوية المبلغ: الشخص الذي يقدم البلاغ قد يتمتع بحماية هويته للحفاظ على أمانه وسلامته، خاصة إذا كان هناك خطر من الانتقام.
1. الحماية من الانتقام: توجد قوانين تحمي المبلغين عن الفساد والرشوة من أي انتقام قد يتعرضون له في مكان العمل أو من قبل المتورطين في الرشوة.
2. السرية: البلاغات عن الرشوة يتم التعامل معها بسرية تامة، ولا يتم الكشف عن التفاصيل إلا للجهات المختصة.
3. التعويض: في بعض الحالات، يكون للمبلغ الحق في الحصول على تعويض مالي أو مكافأة إذا ساهم بلاغه في كشف جريمة رشوة أو فساد كبير.
4. الحماية القانونية: إذا تم تقديم البلاغ بحسن نية وثبتت صحة الاتهامات، فإن المبلغ يتمتع بحماية قانونية من الملاحقة القضائية أو الاتهام الزائف.
"""
: widget.headerText == "الابتزاز"
? """
الابتزاز : جريمة تنطوي على تهديد شخص ما بهدف إجباره على تقديم مال أو خدمات أو القيام بشيء ما ضد إرادته. يعتبر الابتزاز من الجرائم الخطيرة التي يعاقب عليها القانون، سواء كان الابتزاز مادياً أو معنوياً.
الشخص الذي يقدم بلاغًا عن حالة ابتزاز يتمتع بحقوق معينة لحمايته وضمان عدم تعرضه للضرر. :
1. حماية الهوية:
يتمتع الشخص المبلغ بحقه في الحفاظ على سرية هويته، خاصة في الحالات التي قد يتعرض فيها للخطر أو الانتقام من الجاني.
2. الحماية من الانتقام:
القوانين تحمي المبلغين عن الابتزاز من أي نوع من الانتقام أو الأذى الذي قد يتعرضون له بسبب تقديمهم للبلاغ. .
3. السرية:
، يتم التعامل مع بلاغات الابتزاز بسرية تامة. السلطات تحافظ على سرية المعلومات لضمان حماية المبلغ وسلامة التحقيق.
4. التعويض:
قد يكون للمبلغ الحق في الحصول على تعويض إذا تسبب الابتزاز في خسائر مادية أو معنوية. كما يمكن أن تفرض المحكمة على الجاني دفع تعويضات للضحايا.
5. الحماية القانونية:
الشخص الذي يبلغ عن الابتزاز يكون محمياً قانونيًا إذا تم البلاغ بحسن نية. لا يمكن ملاحقته قانونياً أو توجيه تهم ضده بسبب تقديم البلاغ.
6. المساعدة النفسية والاجتماعية:
تقدم خدمات دعم نفسي واجتماعي للمبلغين عن الابتزاز، خاصة إذا كانت الجريمة قد تسببت في صدمة نفسية أو توتر عاطفي.
8. الإبلاغ عن الابتزاز الرقمي:
في حالة الابتزاز الإلكتروني (مثل التهديد بنشر صور أو معلومات شخصية)، يتمتع المبلغ بحقوق مماثلة ويجب أن تكون السلطات قادرة على تعقب الجناة واتخاذ الإجراءات القانونية ضدهم.
"""
: "";
}
@override
void dispose() {
descriptionController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.rtl,
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text(
widget.headerText,
style: Theme.of(context).textTheme.headlineLarge,
),
backgroundColor: Colors.transparent,
),
body: SafeArea(
child: ListView(
padding: const EdgeInsets.all(15),
children: [
const SizedBox(
height: 50,
),
ExpansionPanelList(
elevation: 0,
expandedHeaderPadding: EdgeInsets.zero,
expansionCallback: (index, isOpen) {
setState(() {
isExpanded = isOpen;
});
},
children: [
ExpansionPanel(
backgroundColor: Colors.transparent,
isExpanded: isExpanded,
canTapOnHeader: true,
headerBuilder: (context, isOpen) => Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"شرح توضيحي البلاغ",
style: Theme.of(context).textTheme.bodyLarge,
),
],
),
body: Column(
children: [
Text(
explnationText(),
style: Theme.of(context).textTheme.bodyMedium,
),
],
)),
],
),
const SizedBox(
height: 30,
),
CustomTextField(
controller: descriptionController,
labelText: "قم بوصف الحالة",
inputType: TextInputType.text),
const SizedBox(
height: 15,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
onPressed: handleAddImage,
icon: images.isEmpty
? Icon(FontAwesomeIcons.image, color: Colors.blue[800])
: badges.Badge(
badgeContent: Text(
images.length.toString(),
style: Theme.of(context)
.textTheme
.bodySmall
?.copyWith(color: Colors.white),
),
child: Icon(FontAwesomeIcons.image,
color: Colors.blue[800]),
),
),
IconButton(
onPressed: handleAddVideo,
icon: videos.isEmpty
? const Icon(
FontAwesomeIcons.video,
color: Colors.red,
)
: badges.Badge(
badgeContent: Text(
videos.length.toString(),
style: Theme.of(context)
.textTheme
.bodySmall
?.copyWith(color: Colors.white),
),
child: const Icon(
FontAwesomeIcons.video,
color: Colors.red,
),
),
),
IconButton(
onPressed: handleAddAudio,
icon: audios.isEmpty
? Icon(
FontAwesomeIcons.microphone,
color: Colors.purple[300],
)
: badges.Badge(
badgeContent: Text(
audios.length.toString(),
style: Theme.of(context)
.textTheme
.bodySmall
?.copyWith(color: Colors.white),
),
child: Icon(
FontAwesomeIcons.microphone,
color: Colors.purple[300],
),
),
),
],
),
const SizedBox(
height: 15,
),
CustomButton(
label: "ارسال",
isElevated: true,
onPressed: handleSendReport,
isLoading: isLoading,
),
const SizedBox(
height: 20,
),
],
),
),
),
);
}
Future<void> handleAddImage() async {
FilePickerResult? result = await FilePicker.platform.pickFiles(
allowMultiple: true,
type: FileType.image,
);
if (result != null) {
for (var el in result.files) {
setState(() {
images.add(File(el.path ?? ""));
});
}
}
}
Future<void> handleAddVideo() async {
FilePickerResult? result = await FilePicker.platform
.pickFiles(allowMultiple: true, type: FileType.video);
if (result != null) {
for (var el in result.files) {
setState(() {
videos.add(File(el.path ?? ""));
});
}
}
}
Future<void> handleAddAudio() async {
FilePickerResult? result = await FilePicker.platform
.pickFiles(allowMultiple: true, type: FileType.video);
if (result != null) {
for (var el in result.files) {
setState(() {
audios.add(File(el.path ?? ""));
});
}
}
}
Future<void> handleSendReport() async {
setState(() {
isLoading = true;
});
try {
final storageRef = FirebaseStorage.instance.ref();
List<String> attachments = [];
Future<void> uploadImage(List<File> files, String folder) async {
for (var el in files) {
final filePath =
'${el.path.split('.').first}_${Random().nextInt(99999)}.${el.path.split('.').last}';
final ref = storageRef.child("$folder/$filePath");
final uploadTask = ref.putFile(el); // Upload the file
final snapshot = await uploadTask
.whenComplete(() {}); // Wait for upload completion
final downloadUrl =
await snapshot.ref.getDownloadURL(); // Get download URL
attachments.add(downloadUrl);
}
}
await uploadImage(images, "images");
await uploadImage(videos, "videos");
await uploadImage(audios, "audios");
DocumentReference userRef = FirebaseFirestore.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser?.uid);
await FirebaseFirestore.instance.collection('reports').add({
'userRef': userRef,
'userId': FirebaseAuth.instance.currentUser?.uid,
'type': widget.headerText,
'description': descriptionController.text.trim(),
'attachments': attachments,
'status': "قيد الانتظار",
'createdAt': FieldValue.serverTimestamp(),
});
setState(() {
isLoading = false;
});
if (!mounted) return;
Navigator.push(context,
MaterialPageRoute(builder: (context) => const SuccessScreen()));
} catch (e) {
setState(() {
isLoading = false;
});
BotToast.showCustomText(toastBuilder: (_) {
return const AppToast(text: "حدث خطأ ما");
});
}
}
}