From b4a3247886cc699dc6c8c30bdb3971a04a545362 Mon Sep 17 00:00:00 2001 From: jayesh Date: Fri, 26 Jul 2024 14:56:51 +0530 Subject: [PATCH] io api settings api --- .../utils/text_converter/text_converter.dart | 12 ++ .../presentation/pages/invest_layout.dart | 8 +- .../invest_closed_details_section.dart | 2 +- .../widgets/invest_closed_image_carousel.dart | 146 ++++++++++++++++++ .../invest_detail_details_section.dart | 7 +- .../widgets/invest_detail_image_carousel.dart | 6 +- .../widgets/invest_details_section.dart | 109 ++++++------- .../widgets/invest_image_carousel.dart | 120 ++++++++++---- 8 files changed, 318 insertions(+), 92 deletions(-) create mode 100644 lib/core/utils/text_converter/text_converter.dart create mode 100644 lib/features/MainScreens/Invest/presentation/widgets/invest_closed_image_carousel.dart diff --git a/lib/core/utils/text_converter/text_converter.dart b/lib/core/utils/text_converter/text_converter.dart new file mode 100644 index 0000000..4caf174 --- /dev/null +++ b/lib/core/utils/text_converter/text_converter.dart @@ -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); + } +} diff --git a/lib/features/MainScreens/Invest/presentation/pages/invest_layout.dart b/lib/features/MainScreens/Invest/presentation/pages/invest_layout.dart index b1446e6..ed6f48f 100644 --- a/lib/features/MainScreens/Invest/presentation/pages/invest_layout.dart +++ b/lib/features/MainScreens/Invest/presentation/pages/invest_layout.dart @@ -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 { 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 { ), child: Column( children: [ - InvestCarouselView( - imageList: const [], + InvestClosedCarouselView( + rows: closedIOModel.data!.rows![index], ), InvestClosedDetailsSection( closedIoModel: closedIOModel.data!.rows![index], diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart index 92bb0a5..d0069de 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart @@ -146,7 +146,7 @@ class InvestClosedDetailsSection extends StatelessWidget { ), ), TextWidget().text14W700( - closedIoModel.expectedReturn!, + "", clr: AppColor.plainBlack, txtAlign: TextAlign.end, ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_image_carousel.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_image_carousel.dart new file mode 100644 index 0000000..5726444 --- /dev/null +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_image_carousel.dart @@ -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().add(PageChanged(index)); + }), + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 17.0), + child: BlocBuilder( + 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, + ), + ], + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart index 52d7c9c..2534505 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart @@ -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, ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart index 60d0836..3ab9e79 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart @@ -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, ), ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_details_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_details_section.dart index 1f68ea9..48c14f9 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_details_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_details_section.dart @@ -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, ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_image_carousel.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_image_carousel.dart index 07d79a8..adf02d9 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_image_carousel.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_image_carousel.dart @@ -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 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( - 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( + 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, + ), + ], + ), + ), + ) ], ), );