io api settings api

This commit is contained in:
jayesh
2024-07-26 14:56:51 +05:30
parent a5e6584b8c
commit b4a3247886
8 changed files with 318 additions and 92 deletions

View 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);
}
}

View File

@@ -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],

View File

@@ -146,7 +146,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
closedIoModel.expectedReturn!,
"",
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),

View File

@@ -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,
),
],
),
),
)
],
),
);
}
}

View File

@@ -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,
),

View File

@@ -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,
),
),

View File

@@ -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,
),

View File

@@ -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,
),
],
),
),
)
],
),
);