9/8/1
This commit is contained in:
@@ -5,6 +5,7 @@ import 'package:SEFER/main.dart';
|
||||
import 'package:SEFER/views/home/profile/passenger_profile_page.dart';
|
||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
||||
import 'package:SEFER/views/widgets/my_dialog.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
@@ -45,29 +46,47 @@ List<CarType> carTypes = [
|
||||
image: 'assets/images/lady.png',
|
||||
),
|
||||
CarType(
|
||||
carType: 'Delivery',
|
||||
carDetail: 'Delivery service'.tr,
|
||||
carType: 'Scooter',
|
||||
carDetail: 'Scooter service'.tr,
|
||||
image: 'assets/images/moto.png',
|
||||
),
|
||||
CarType(
|
||||
carType: 'Mashwari',
|
||||
carDetail: 'Mashwari without end point'.tr,
|
||||
carType: 'Mishwar Vip',
|
||||
carDetail: 'Mishwar Vip without end point'.tr,
|
||||
image: 'assets/images/freeRide.png',
|
||||
),
|
||||
CarType(
|
||||
carType: 'Rayeh Gai',
|
||||
carDetail: "Best choice for cities".tr,
|
||||
image: 'assets/images/roundtrip.png',
|
||||
),
|
||||
];
|
||||
|
||||
class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
CarDetailsTypeToChoose({super.key});
|
||||
final textToSpeechController = Get.put(TextToSpeechController());
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetBuilder<MapPassengerController>(
|
||||
builder: (mapPassengerController) {
|
||||
// Add a new CarType if the distance condition is met and the list has fewer than 6 items
|
||||
if (mapPassengerController.distance > 40) {
|
||||
carTypes.add(
|
||||
CarType(
|
||||
carType: 'Rayeh Gai',
|
||||
carDetail: "Best choice for cities".tr,
|
||||
image: 'assets/images/roundtrip.png',
|
||||
),
|
||||
);
|
||||
if (carTypes.length > 7) {
|
||||
carTypes.removeRange(7, carTypes.length);
|
||||
}
|
||||
} // Create a Set to remove duplicates based on the `carType` field
|
||||
else if (carTypes.length > 6) {
|
||||
carTypes.removeRange(6, carTypes.length);
|
||||
}
|
||||
Set<CarType> uniqueCarTypes = {};
|
||||
uniqueCarTypes.addAll(carTypes);
|
||||
|
||||
// Convert the Set back to a List
|
||||
carTypes = uniqueCarTypes.toList();
|
||||
|
||||
return mapPassengerController.data.isNotEmpty &&
|
||||
mapPassengerController.isBottomSheetShown &&
|
||||
mapPassengerController.rideConfirm == false
|
||||
@@ -142,9 +161,9 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
? mapPassengerController
|
||||
.totalPassengerBalash
|
||||
.toStringAsFixed(2)
|
||||
: carType.carType == 'Delivery'
|
||||
: carType.carType == 'Scooter'
|
||||
? mapPassengerController
|
||||
.totalPassengerMotoDelivery
|
||||
.totalPassengerScooter
|
||||
.toStringAsFixed(2)
|
||||
: carType.carType == 'Lady'
|
||||
? mapPassengerController
|
||||
@@ -153,7 +172,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
: carType.carType ==
|
||||
'Rayeh Gai'
|
||||
? mapPassengerController
|
||||
.totalPassengerRayehGai
|
||||
.totalPassengerRayehGaiBalash
|
||||
.toStringAsFixed(
|
||||
2)
|
||||
: '50',
|
||||
@@ -231,7 +250,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
: carType.carType == 'Balash' &&
|
||||
(mapPassengerController
|
||||
.totalPassengerBalash >
|
||||
15)
|
||||
20)
|
||||
? Row(
|
||||
children: [
|
||||
Container(
|
||||
@@ -400,19 +419,19 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
} else if (mapPassengerController
|
||||
.selectedIndex ==
|
||||
4) {
|
||||
box.write(BoxName.carType, 'Delivery');
|
||||
box.write(BoxName.carType, 'Scooter');
|
||||
mapPassengerController.totalPassenger =
|
||||
mapPassengerController
|
||||
.totalPassengerMotoDelivery;
|
||||
.totalPassengerScooter;
|
||||
Get.defaultDialog(
|
||||
title: 'Delivery'.tr,
|
||||
title: 'Scooter'.tr,
|
||||
titleStyle: AppStyle.title,
|
||||
content: CarDialogue(
|
||||
textToSpeechController:
|
||||
textToSpeechController,
|
||||
image: 'assets/images/moto.png',
|
||||
text:
|
||||
'This is for delivery or a motorcycle.'
|
||||
'This is for Scooter or a motorcycle.'
|
||||
.tr),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
@@ -434,17 +453,17 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
} else if (mapPassengerController
|
||||
.selectedIndex ==
|
||||
5) {
|
||||
box.write(BoxName.carType, 'Mashwari');
|
||||
box.write(BoxName.carType, 'Mishwar Vip');
|
||||
mapPassengerController.totalPassenger = 50;
|
||||
Get.defaultDialog(
|
||||
title: 'Mashwari'.tr,
|
||||
title: 'Mishwar Vip'.tr,
|
||||
titleStyle: AppStyle.title,
|
||||
content: CarDialogue(
|
||||
textToSpeechController:
|
||||
textToSpeechController,
|
||||
image: 'assets/images/freeRide.png',
|
||||
text:
|
||||
'Perfect for adventure seekers who want to experience something new and exciting'
|
||||
'A trip with a prior reservation, allowing you to choose the best captains and cars.'
|
||||
.tr),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
@@ -541,29 +560,175 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
.selectedIndex ==
|
||||
6) {
|
||||
box.write(BoxName.carType, 'Rayeh Gai');
|
||||
mapPassengerController.totalPassenger =
|
||||
mapPassengerController.totalPassengerLady;
|
||||
// mapPassengerController.totalPassenger =
|
||||
// mapPassengerController.totalPassengerRayehGai;
|
||||
Get.defaultDialog(
|
||||
title: 'Rayeh Gai'.tr,
|
||||
titleStyle: AppStyle.title,
|
||||
content: CarDialogue(
|
||||
textToSpeechController:
|
||||
textToSpeechController,
|
||||
image: 'assets/images/roundtrip.png',
|
||||
text:
|
||||
"Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable."
|
||||
.tr),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
title: 'Next'.tr,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
mapPassengerController
|
||||
.isBottomSheetShown = false;
|
||||
mapPassengerController.update();
|
||||
mapPassengerController
|
||||
.changeCashConfirmPageShown();
|
||||
}),
|
||||
content: Column(
|
||||
children: [
|
||||
CarDialogue(
|
||||
textToSpeechController:
|
||||
textToSpeechController,
|
||||
image:
|
||||
'assets/images/roundtrip.png',
|
||||
text:
|
||||
"Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable."
|
||||
.tr),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
Container(
|
||||
decoration: AppStyle.boxDecoration,
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'Choose between those Type Cars'
|
||||
.tr),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Container(
|
||||
decoration:
|
||||
AppStyle.boxDecoration,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
box.write(BoxName.carType,
|
||||
'RayehGaiComfort');
|
||||
mapPassengerController
|
||||
.totalPassenger =
|
||||
mapPassengerController
|
||||
.totalPassengerRayehGaiComfort;
|
||||
Get.back();
|
||||
mapPassengerController
|
||||
.isBottomSheetShown =
|
||||
false;
|
||||
mapPassengerController
|
||||
.update();
|
||||
mapPassengerController
|
||||
.changeCashConfirmPageShown();
|
||||
},
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.all(
|
||||
8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Text('Comfort'.tr),
|
||||
Text(mapPassengerController
|
||||
.totalPassengerRayehGaiComfort
|
||||
.toString() +
|
||||
r'$'),
|
||||
],
|
||||
),
|
||||
),
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Container(
|
||||
decoration:
|
||||
AppStyle.boxDecoration,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
box.write(BoxName.carType,
|
||||
'Speed');
|
||||
mapPassengerController
|
||||
.totalPassenger =
|
||||
mapPassengerController
|
||||
.totalPassengerRayehGai;
|
||||
Get.back();
|
||||
mapPassengerController
|
||||
.isBottomSheetShown =
|
||||
false;
|
||||
mapPassengerController
|
||||
.update();
|
||||
mapPassengerController
|
||||
.changeCashConfirmPageShown();
|
||||
},
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.all(
|
||||
8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Text('Speed'.tr),
|
||||
Text(mapPassengerController
|
||||
.totalPassengerRayehGai
|
||||
.toString() +
|
||||
r'$'),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Container(
|
||||
decoration:
|
||||
AppStyle.boxDecoration,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
box.write(BoxName.carType,
|
||||
'Balash');
|
||||
mapPassengerController
|
||||
.totalPassenger =
|
||||
mapPassengerController
|
||||
.totalPassengerRayehGaiBalash;
|
||||
Get.back();
|
||||
mapPassengerController
|
||||
.isBottomSheetShown =
|
||||
false;
|
||||
mapPassengerController
|
||||
.update();
|
||||
mapPassengerController
|
||||
.changeCashConfirmPageShown();
|
||||
},
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.all(
|
||||
8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Text('Balash'.tr),
|
||||
Text(mapPassengerController
|
||||
.totalPassengerRayehGaiBalash
|
||||
.toString() +
|
||||
r'$'),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
],
|
||||
),
|
||||
// confirm: MyElevatedButton(
|
||||
// kolor: AppColor.greenColor,
|
||||
// title: 'Next'.tr,
|
||||
// onPressed: () {
|
||||
// Get.back();
|
||||
// mapPassengerController
|
||||
// .isBottomSheetShown = false;
|
||||
// mapPassengerController.update();
|
||||
// mapPassengerController
|
||||
// .changeCashConfirmPageShown();
|
||||
// }),
|
||||
cancel: MyElevatedButton(
|
||||
title: 'Cancel'.tr,
|
||||
kolor: AppColor.redColor,
|
||||
@@ -588,6 +753,111 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
// ;
|
||||
});
|
||||
}
|
||||
|
||||
Future<dynamic> comfortDialougRayehgai(
|
||||
MapPassengerController mapPassengerController) {
|
||||
return Get.defaultDialog(
|
||||
title: 'Comfort'.tr,
|
||||
content: GetBuilder<MapPassengerController>(
|
||||
builder: (mapPassengerController) {
|
||||
return Column(
|
||||
children: [
|
||||
SizedBox(height: 60, child: HourPickerExample()),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
SizedBox(
|
||||
height: 30,
|
||||
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
|
||||
'1${'hour'.tr}'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
title: 'Next'.tr,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
mapPassengerController.isBottomSheetShown = false;
|
||||
mapPassengerController.update();
|
||||
mapPassengerController.changeCashConfirmPageShown();
|
||||
}),
|
||||
cancel: MyElevatedButton(
|
||||
title: 'Cancel'.tr,
|
||||
kolor: AppColor.redColor,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
}));
|
||||
}
|
||||
|
||||
Future<dynamic> speedDialougRayehGai(
|
||||
MapPassengerController mapPassengerController) {
|
||||
return Get.defaultDialog(
|
||||
title: 'Speed'.tr,
|
||||
content: Column(
|
||||
children: [
|
||||
SizedBox(height: 60, child: HourPickerExample()),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
SizedBox(
|
||||
height: 30,
|
||||
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
|
||||
'1${'hour'.tr}'),
|
||||
),
|
||||
],
|
||||
),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
title: 'Next'.tr,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
mapPassengerController.isBottomSheetShown = false;
|
||||
mapPassengerController.update();
|
||||
mapPassengerController.changeCashConfirmPageShown();
|
||||
}),
|
||||
cancel: MyElevatedButton(
|
||||
title: 'Cancel'.tr,
|
||||
kolor: AppColor.redColor,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
}));
|
||||
}
|
||||
|
||||
Future<dynamic> balashDialougRayehGai(
|
||||
MapPassengerController mapPassengerController) {
|
||||
return Get.defaultDialog(
|
||||
title: 'Balash'.tr,
|
||||
content: Column(
|
||||
children: [
|
||||
SizedBox(height: 60, child: HourPickerExample()),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
SizedBox(
|
||||
height: 30,
|
||||
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
|
||||
'1${'hour'.tr}'),
|
||||
),
|
||||
],
|
||||
),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
title: 'Next'.tr,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
mapPassengerController.isBottomSheetShown = false;
|
||||
mapPassengerController.update();
|
||||
mapPassengerController.changeCashConfirmPageShown();
|
||||
}),
|
||||
cancel: MyElevatedButton(
|
||||
title: 'Cancel'.tr,
|
||||
kolor: AppColor.redColor,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
class BurcMoney extends StatelessWidget {
|
||||
@@ -805,3 +1075,72 @@ class CarDialogue extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HourPickerExample extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () async {
|
||||
int? selectedHour = await showCupertinoModalPopup<int>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Container(
|
||||
height: 200,
|
||||
color: Colors.white,
|
||||
child: Column(
|
||||
children: [
|
||||
CupertinoButton(
|
||||
child: Text('Done'.tr),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
SizedBox(
|
||||
height: 140,
|
||||
child: CupertinoPicker(
|
||||
itemExtent: 32.0,
|
||||
onSelectedItemChanged: (int index) {
|
||||
// Handle the selection
|
||||
box.write(BoxName.hourWait, index);
|
||||
// Navigator.pop(context, index + 1);
|
||||
},
|
||||
children: List<Widget>.generate(5, (int index) {
|
||||
return Center(
|
||||
child: Text('${index + 1} ${'hour'.tr}'),
|
||||
);
|
||||
}),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
if (selectedHour != null) {
|
||||
// Do something with the selected hour
|
||||
print('Selected hour: $selectedHour');
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
// height: 70,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: AppColor.blueColor,
|
||||
width: 3,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(12)),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'How many hours would you like to wait?'.tr,
|
||||
style: TextStyle(fontSize: 18),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,7 +338,7 @@ class MainBottomMenuMap extends StatelessWidget {
|
||||
title: 'Yes'.tr,
|
||||
onPressed: () async {
|
||||
Get.back();
|
||||
await controller.getLocation();
|
||||
controller.getLocation();
|
||||
await controller.getMap(
|
||||
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
|
||||
'${controller.recentPlaces[index]['latitude']},${controller.recentPlaces[index]['longitude']}',
|
||||
@@ -606,7 +606,7 @@ class FaviouratePlacesDialog extends StatelessWidget {
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
Get.back();
|
||||
await controller.getLocation();
|
||||
controller.getLocation();
|
||||
await controller.getMap(
|
||||
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
|
||||
'${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}',
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
import 'package:SEFER/constant/colors.dart';
|
||||
import 'package:SEFER/constant/style.dart';
|
||||
import 'package:SEFER/controller/home/map_passenger_controller.dart';
|
||||
import 'package:SEFER/env/env.dart';
|
||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../constant/api_key.dart';
|
||||
import '../../../print.dart';
|
||||
|
||||
class CupertinoDriverListWidget extends StatelessWidget {
|
||||
MapPassengerController mapPassengerController =
|
||||
@@ -30,7 +32,7 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
leading: CircleAvatar(
|
||||
radius: 25,
|
||||
backgroundImage: NetworkImage(
|
||||
'${AK.serverPHP}/portrate_captain_image/${driver['id']}.jpg',
|
||||
'${Env.seferCairoServer}/portrate_captain_image/${driver['id']}.jpg',
|
||||
),
|
||||
backgroundColor: CupertinoColors.systemGrey5,
|
||||
),
|
||||
@@ -138,6 +140,7 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
showDateTimePickerDialog(driver);
|
||||
Log.print('driver: ${driver}');
|
||||
}));
|
||||
print('${'Selected driver'.tr}: ${driver['NAME']}');
|
||||
// Get.back(); // Close the dialog
|
||||
@@ -150,9 +153,18 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
}
|
||||
|
||||
Color hexToColor(String hexColor) {
|
||||
if (hexColor == null || hexColor.isEmpty || hexColor == 'null') {
|
||||
// Return a default color if the hex color is invalid
|
||||
return Colors.grey;
|
||||
}
|
||||
hexColor = hexColor.replaceAll("#", "");
|
||||
String colorString = "ff$hexColor";
|
||||
return Color(int.parse(colorString, radix: 16));
|
||||
if (hexColor.length == 6) {
|
||||
hexColor = "ff$hexColor";
|
||||
} else if (hexColor.length != 8) {
|
||||
// Return a default color if the hex color is not in the valid format
|
||||
return Colors.grey;
|
||||
}
|
||||
return Color(int.parse(hexColor, radix: 16));
|
||||
}
|
||||
|
||||
void showDriverSelectionDialog(Map<String, dynamic> driver) {
|
||||
@@ -192,7 +204,23 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> confirmTripData(
|
||||
Map<String, dynamic> driver, DateTime selectedDateTime) async {
|
||||
try {
|
||||
// Save trip data and set up notifications
|
||||
// Log.print('selectedDateTime: $selectedDateTime');
|
||||
// Log.print('driver: $driver');
|
||||
await mapPassengerController.saveTripData(driver, selectedDateTime);
|
||||
Get.back(); // Close the dialog
|
||||
} catch (e) {
|
||||
// Handle any errors that occur during the save process
|
||||
Log.print('Error saving trip data: $e');
|
||||
Get.snackbar('Error', 'Failed to save trip data');
|
||||
}
|
||||
}
|
||||
|
||||
void showDateTimePickerDialog(Map<String, dynamic> driver) {
|
||||
Log.print('driver: ${driver}');
|
||||
DateTime selectedDateTime = DateTime.now();
|
||||
|
||||
Get.defaultDialog(
|
||||
@@ -209,12 +237,10 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
),
|
||||
confirm: MyElevatedButton(
|
||||
title: 'Confirm Trip'.tr,
|
||||
onPressed: () async {
|
||||
onPressed: () {
|
||||
DateTime selectedDateTime =
|
||||
mapPassengerController.selectedDateTime.value;
|
||||
// Save trip data and set up notifications
|
||||
Get.back();
|
||||
await mapPassengerController.saveTripData(driver, selectedDateTime);
|
||||
confirmTripData(driver, selectedDateTime);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user