io api settings api
This commit is contained in:
12
lib/core/utils/text_converter/text_converter.dart
Normal file
12
lib/core/utils/text_converter/text_converter.dart
Normal file
@@ -0,0 +1,12 @@
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
class TextConverter {
|
||||
String formattedTextToNumber(String numberString) {
|
||||
// Convert the string to a double
|
||||
double number = double.parse(numberString);
|
||||
|
||||
// Format the number with commas
|
||||
final formatter = NumberFormat("#,###", "en_US");
|
||||
return formatter.format(number);
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import '../bloc/tab_bloc.dart';
|
||||
import '../bloc/tab_event.dart';
|
||||
import '../bloc/tab_state.dart';
|
||||
import '../widgets/invest_closed_details_section.dart';
|
||||
import '../widgets/invest_closed_image_carousel.dart';
|
||||
import '../widgets/invest_details_section.dart';
|
||||
import '../widgets/invest_image_carousel.dart';
|
||||
|
||||
@@ -151,8 +152,7 @@ class _AvailableItemsScreenState extends State<AvailableItemsScreen> {
|
||||
child: Column(
|
||||
children: [
|
||||
InvestCarouselView(
|
||||
imageList: availableIOModel
|
||||
.data!.rows![index - 1].artifactsImage!,
|
||||
rows: availableIOModel.data!.rows![index - 1],
|
||||
),
|
||||
InvestDetailsSection(
|
||||
availableIOModel:
|
||||
@@ -244,8 +244,8 @@ class _ClosedItemsScreenState extends State<ClosedItemsScreen> {
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
InvestCarouselView(
|
||||
imageList: const [],
|
||||
InvestClosedCarouselView(
|
||||
rows: closedIOModel.data!.rows![index],
|
||||
),
|
||||
InvestClosedDetailsSection(
|
||||
closedIoModel: closedIOModel.data!.rows![index],
|
||||
|
||||
@@ -146,7 +146,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
TextWidget().text14W700(
|
||||
closedIoModel.expectedReturn!,
|
||||
"",
|
||||
clr: AppColor.plainBlack,
|
||||
txtAlign: TextAlign.end,
|
||||
),
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:tanami_app/core/styles/app_color.dart';
|
||||
import 'package:tanami_app/shared/api/api_endpoints.dart';
|
||||
|
||||
import '../../../../../Globalconst.dart';
|
||||
import '../../../../../core/styles/app_images.dart';
|
||||
import '../../../../../core/styles/app_text.dart';
|
||||
import '../../../../../core/utils/date_time_formatter/date_time_formatter.dart';
|
||||
import '../../../../../core/utils/language/localizations_delegate.dart';
|
||||
import '../../../../../shared/components/text_widget.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_bloc.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_event.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_state.dart';
|
||||
import '../../domain/model/closed_io_model.dart';
|
||||
|
||||
class InvestClosedCarouselView extends StatelessWidget {
|
||||
final CarouselController _controller = CarouselController();
|
||||
final Rows rows;
|
||||
|
||||
InvestClosedCarouselView({super.key, required this.rows});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var localizations = AppLocalizations.of(context);
|
||||
return Container(
|
||||
height: 220.h,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 15,
|
||||
vertical: 15,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.plainWhite, borderRadius: BorderRadius.circular(20)),
|
||||
child: Stack(
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
child: CarouselSlider(
|
||||
items: rows.artifactsImage!
|
||||
.map(
|
||||
(item) => Image.network(
|
||||
"${ApiEndpoints.base}${item.artifactPathName!}",
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
alignment: Alignment.topCenter,
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
carouselController: _controller,
|
||||
options: CarouselOptions(
|
||||
scrollPhysics: const BouncingScrollPhysics(),
|
||||
autoPlay: true,
|
||||
aspectRatio: 2,
|
||||
viewportFraction: 1,
|
||||
onPageChanged: (index, reason) {
|
||||
context.read<CarouselBloc>().add(PageChanged(index));
|
||||
}),
|
||||
),
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 17.0),
|
||||
child: BlocBuilder<CarouselBloc, CarouselState>(
|
||||
builder: (context, state) {
|
||||
int currentIndex = 0;
|
||||
if (state is CarouselPageState) {
|
||||
currentIndex = state.currentIndex;
|
||||
}
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: rows.artifactsImage!.asMap().entries.map((entry) {
|
||||
return GestureDetector(
|
||||
onTap: () => _controller.animateToPage(entry.key),
|
||||
child: Container(
|
||||
width: 20.w,
|
||||
height: 7.h,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
color: (currentIndex == entry.key)
|
||||
? AppColor.plainWhite
|
||||
: AppColor.smokeGrayColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 20,
|
||||
left: 20,
|
||||
child: Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFE4F5E9),
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
),
|
||||
child: TextWidget().text11W700(
|
||||
Globalconst.languageSelected == "ar"
|
||||
? rows.investmentType!.investmentTypeNameArabic!
|
||||
: rows.investmentType!.investmentTypeName!,
|
||||
clr: AppColor.selectedItemColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 20,
|
||||
right: 20,
|
||||
child: Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Image.asset(
|
||||
AppImages.portfolioClock,
|
||||
height: 15.h,
|
||||
),
|
||||
Gap(
|
||||
5.w,
|
||||
),
|
||||
TextWidget().text11W500(
|
||||
'${localizations.translate(AppText.closedDateText)} ${DateTimeFormatter().formatDate(rows.closingDate!)}',
|
||||
clr: AppColor.plainBlack,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import 'package:tanami_app/features/MainScreens/Invest/domain/model/detail_io_mo
|
||||
import '../../../../../Globalconst.dart';
|
||||
import '../../../../../core/styles/app_text.dart';
|
||||
import '../../../../../core/utils/language/localizations_delegate.dart';
|
||||
import '../../../../../core/utils/text_converter/text_converter.dart';
|
||||
import '../../../../../shared/components/text_widget.dart';
|
||||
|
||||
class InvestDetailDetailsSection extends StatelessWidget {
|
||||
@@ -40,7 +41,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
|
||||
type == "closed"
|
||||
? const SizedBox()
|
||||
: TextWidget().text22W900(
|
||||
"USD ${detailIOModel.data!.goalAmount!}",
|
||||
"USD ${TextConverter().formattedTextToNumber(detailIOModel.data!.goalAmount!)}",
|
||||
clr: AppColor.investTextColor),
|
||||
type == "closed" ? const SizedBox() : const Gap(8.0),
|
||||
type == "closed"
|
||||
@@ -154,7 +155,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
TextWidget().text14W700(
|
||||
'22.5%',
|
||||
'',
|
||||
clr: AppColor.plainBlack,
|
||||
txtAlign: TextAlign.end,
|
||||
),
|
||||
@@ -221,7 +222,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
|
||||
txtAlign: TextAlign.start,
|
||||
),
|
||||
TextWidget().text14W700(
|
||||
'BHR ${detailIOModel.data!.minInvestmentAmt![0].minInvestmentAmt}',
|
||||
'BHR ${TextConverter().formattedTextToNumber(detailIOModel.data!.minInvestmentAmt![0].minInvestmentAmt!)}',
|
||||
clr: AppColor.plainBlack,
|
||||
txtAlign: TextAlign.end,
|
||||
),
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:tanami_app/Globalconst.dart';
|
||||
import 'package:tanami_app/core/styles/app_color.dart';
|
||||
import 'package:tanami_app/core/utils/date_time_formatter/date_time_formatter.dart';
|
||||
|
||||
@@ -114,7 +115,10 @@ class InvestDetailCarouselView extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
),
|
||||
child: TextWidget().text11W700(
|
||||
detailIOModel.data!.investmentType!.investmentTypeName!,
|
||||
Globalconst.languageSelected == "ar"
|
||||
? detailIOModel
|
||||
.data!.investmentType!.investmentTypeNameArabic!
|
||||
: detailIOModel.data!.investmentType!.investmentTypeName!,
|
||||
clr: AppColor.selectedItemColor,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -3,12 +3,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:tanami_app/Globalconst.dart';
|
||||
import 'package:tanami_app/core/styles/app_color.dart';
|
||||
import 'package:tanami_app/core/utils/date_time_formatter/date_time_formatter.dart';
|
||||
import 'package:tanami_app/features/MainScreens/Invest/domain/model/available_io_model.dart';
|
||||
|
||||
import '../../../../../core/styles/app_images.dart';
|
||||
import '../../../../../core/styles/app_text.dart';
|
||||
import '../../../../../core/utils/language/localizations_delegate.dart';
|
||||
import '../../../../../core/utils/text_converter/text_converter.dart';
|
||||
import '../../../../../shared/components/text_widget.dart';
|
||||
|
||||
class InvestDetailsSection extends StatelessWidget {
|
||||
@@ -36,7 +35,7 @@ class InvestDetailsSection extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 0.6.sw,
|
||||
width: 0.5.sw,
|
||||
child: TextWidget().text17W700(
|
||||
Globalconst.languageSelected == "ar"
|
||||
? availableIOModel.investmentNameArabic!
|
||||
@@ -44,59 +43,65 @@ class InvestDetailsSection extends StatelessWidget {
|
||||
clr: AppColor.plainBlack,
|
||||
txtAlign: TextAlign.start),
|
||||
),
|
||||
Container(
|
||||
height: 28,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 6),
|
||||
decoration: ShapeDecoration(
|
||||
color: const Color(0xFFE4F5E9),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(4)),
|
||||
),
|
||||
child: Center(
|
||||
child: TextWidget().text11W700(
|
||||
availableIOModel.investmentType!.investmentTypeName!,
|
||||
clr: AppColor.selectedItemColor,
|
||||
)),
|
||||
)
|
||||
// Container(
|
||||
// height: 28,
|
||||
// padding: const EdgeInsets.symmetric(
|
||||
// horizontal: 12, vertical: 6),
|
||||
// decoration: ShapeDecoration(
|
||||
// color: const Color(0xFFE4F5E9),
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(4)),
|
||||
// ),
|
||||
// child: Center(
|
||||
// child: TextWidget().text11W700(
|
||||
// Globalconst.languageSelected == "ar"
|
||||
// ? availableIOModel
|
||||
// .investmentType!.investmentTypeNameArabic!
|
||||
// : availableIOModel
|
||||
// .investmentType!.investmentTypeName!,
|
||||
// clr: AppColor.selectedItemColor,
|
||||
// )),
|
||||
// )
|
||||
],
|
||||
),
|
||||
Gap(10.h),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12.0, vertical: 5.0),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
border: Border.all(color: const Color(0xFFE4F5E9)),
|
||||
borderRadius: BorderRadius.circular(14.0),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Image.asset(
|
||||
AppImages.portfolioClock,
|
||||
height: 20.h,
|
||||
),
|
||||
Gap(
|
||||
5.w,
|
||||
),
|
||||
TextWidget().text12W700(
|
||||
"${localizations.translate(AppText.closingDateText)}: ",
|
||||
clr: AppColor.plainBlack,
|
||||
),
|
||||
TextWidget().text12W500(
|
||||
DateTimeFormatter()
|
||||
.formatDate(availableIOModel.closingDate!),
|
||||
clr: AppColor.plainBlack,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// Gap(10.h),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.symmetric(
|
||||
// horizontal: 12.0, vertical: 5.0),
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.white,
|
||||
// border: Border.all(color: const Color(0xFFE4F5E9)),
|
||||
// borderRadius: BorderRadius.circular(14.0),
|
||||
// ),
|
||||
// child: Row(
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// mainAxisAlignment: MainAxisAlignment.start,
|
||||
// children: [
|
||||
// Image.asset(
|
||||
// AppImages.portfolioClock,
|
||||
// height: 20.h,
|
||||
// ),
|
||||
// Gap(
|
||||
// 5.w,
|
||||
// ),
|
||||
// TextWidget().text12W700(
|
||||
// "${localizations.translate(AppText.closingDateText)}: ",
|
||||
// clr: AppColor.plainBlack,
|
||||
// ),
|
||||
// TextWidget().text12W500(
|
||||
// DateTimeFormatter()
|
||||
// .formatDate(availableIOModel.closingDate!),
|
||||
// clr: AppColor.plainBlack,
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
|
||||
Gap(
|
||||
10.h,
|
||||
),
|
||||
TextWidget().text22W900("USD ${availableIOModel.goalAmount!}",
|
||||
TextWidget().text22W900(
|
||||
"USD ${TextConverter().formattedTextToNumber(availableIOModel.goalAmount!)}",
|
||||
clr: AppColor.investTextColor),
|
||||
const Gap(8.0),
|
||||
LinearProgressIndicator(
|
||||
@@ -214,7 +219,7 @@ class InvestDetailsSection extends StatelessWidget {
|
||||
txtAlign: TextAlign.start,
|
||||
),
|
||||
TextWidget().text14W700(
|
||||
'BHD ${availableIOModel.minInvestmentAmt![0].minInvestmentAmt}',
|
||||
'BHD ${TextConverter().formattedTextToNumber(availableIOModel.minInvestmentAmt![0].minInvestmentAmt!)}',
|
||||
clr: AppColor.plainBlack,
|
||||
txtAlign: TextAlign.end,
|
||||
),
|
||||
|
||||
@@ -6,6 +6,12 @@ import 'package:gap/gap.dart';
|
||||
import 'package:tanami_app/core/styles/app_color.dart';
|
||||
import 'package:tanami_app/shared/api/api_endpoints.dart';
|
||||
|
||||
import '../../../../../Globalconst.dart';
|
||||
import '../../../../../core/styles/app_images.dart';
|
||||
import '../../../../../core/styles/app_text.dart';
|
||||
import '../../../../../core/utils/date_time_formatter/date_time_formatter.dart';
|
||||
import '../../../../../core/utils/language/localizations_delegate.dart';
|
||||
import '../../../../../shared/components/text_widget.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_bloc.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_event.dart';
|
||||
import '../../../Portfolio/presentation/bloc/carousel/carousel_state.dart';
|
||||
@@ -13,26 +19,27 @@ import '../../domain/model/available_io_model.dart';
|
||||
|
||||
class InvestCarouselView extends StatelessWidget {
|
||||
final CarouselController _controller = CarouselController();
|
||||
final List<ArtifactsImage> imageList;
|
||||
final Rows rows;
|
||||
|
||||
InvestCarouselView({super.key, required this.imageList});
|
||||
InvestCarouselView({super.key, required this.rows});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var localizations = AppLocalizations.of(context);
|
||||
return Container(
|
||||
height: 220.h,
|
||||
height: 190.h,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 15,
|
||||
vertical: 15,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.plainWhite, borderRadius: BorderRadius.circular(20)),
|
||||
child: Column(
|
||||
child: Stack(
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
child: CarouselSlider(
|
||||
items: imageList
|
||||
items: rows.artifactsImage!
|
||||
.map(
|
||||
(item) => Image.network(
|
||||
"${ApiEndpoints.base}${item.artifactPathName!}",
|
||||
@@ -53,34 +60,85 @@ class InvestCarouselView extends StatelessWidget {
|
||||
}),
|
||||
),
|
||||
),
|
||||
const Gap(6),
|
||||
BlocBuilder<CarouselBloc, CarouselState>(
|
||||
builder: (context, state) {
|
||||
int currentIndex = 0;
|
||||
if (state is CarouselPageState) {
|
||||
currentIndex = state.currentIndex;
|
||||
}
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: imageList.asMap().entries.map((entry) {
|
||||
return GestureDetector(
|
||||
onTap: () => _controller.animateToPage(entry.key),
|
||||
child: Container(
|
||||
width: 20.w,
|
||||
height: 8.h,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
color: (currentIndex == entry.key)
|
||||
? AppColor.primaryColor
|
||||
: AppColor.pinFillColor,
|
||||
),
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 17.0),
|
||||
child: BlocBuilder<CarouselBloc, CarouselState>(
|
||||
builder: (context, state) {
|
||||
int currentIndex = 0;
|
||||
if (state is CarouselPageState) {
|
||||
currentIndex = state.currentIndex;
|
||||
}
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: rows.artifactsImage!.asMap().entries.map((entry) {
|
||||
return GestureDetector(
|
||||
onTap: () => _controller.animateToPage(entry.key),
|
||||
child: Container(
|
||||
width: 20.w,
|
||||
height: 7.h,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
color: (currentIndex == entry.key)
|
||||
? AppColor.plainWhite
|
||||
: AppColor.smokeGrayColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
},
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 20,
|
||||
left: 5,
|
||||
child: Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFE4F5E9),
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
),
|
||||
child: TextWidget().text11W700(
|
||||
Globalconst.languageSelected == "ar"
|
||||
? rows.investmentType!.investmentTypeNameArabic!
|
||||
: rows.investmentType!.investmentTypeName!,
|
||||
clr: AppColor.selectedItemColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 20,
|
||||
right: 10,
|
||||
child: Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Image.asset(
|
||||
AppImages.portfolioClock,
|
||||
height: 15.h,
|
||||
),
|
||||
Gap(
|
||||
5.w,
|
||||
),
|
||||
TextWidget().text11W500(
|
||||
'${localizations.translate(AppText.closingDateText)} ${DateTimeFormatter().formatDate(rows.closingDate!)}',
|
||||
clr: AppColor.plainBlack,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user