From c17ec1539fa1e8970c8c15b9db5a721201130f5c Mon Sep 17 00:00:00 2001 From: jayesh Date: Fri, 17 May 2024 18:55:00 +0530 Subject: [PATCH 1/2] added stock details screen and api integration --- lib/Utils/text.dart | 4 +- lib/Utils/utils.dart | 17 + .../stock_details_model.dart | 2 +- .../stockDetails/stock_details_screen.dart | 705 +++++++++++------- pubspec.lock | 8 + pubspec.yaml | 1 + 6 files changed, 460 insertions(+), 277 deletions(-) diff --git a/lib/Utils/text.dart b/lib/Utils/text.dart index 8eea1fc..028121d 100644 --- a/lib/Utils/text.dart +++ b/lib/Utils/text.dart @@ -186,12 +186,12 @@ Widget text15W600_00FF19(String text) { ); } -Widget text12W400(String text) { +Widget text12W400(String text, {Color? clr}) { return Text( text, style: TextStyle( fontSize: 12.sp, - color: Colors.white, + color: clr ?? Colors.white, fontWeight: FontWeight.w400, fontFamily: 'hiragino'), ); diff --git a/lib/Utils/utils.dart b/lib/Utils/utils.dart index 8e4fbdd..d157bd8 100644 --- a/lib/Utils/utils.dart +++ b/lib/Utils/utils.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; import 'package:flutter/services.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart' as getx; @@ -53,9 +54,25 @@ class Utils { for (final element in data) { priceData.add(element.close!); } + return priceData; } + static List extractTimeFromGraph(List data) { + final List time = []; + for (final element in data) { + DateTime dateTime = DateTime.parse(element.timestamp!); + String formattedDate = DateFormat('MMM d yyyy').format(dateTime); + time.add(formattedDate); + } + return time; + } + + static String dateFormatterForGraph(String dateV) { + DateTime dateTime = DateTime.parse(dateV); + return DateFormat('MMM d yyyy').format(dateTime); + } + static showToast(String? msg) { if (msg != null && msg != "null" && msg.isNotEmpty) { Fluttertoast.showToast( diff --git a/lib/model/StockDetailsModel/stock_details_model.dart b/lib/model/StockDetailsModel/stock_details_model.dart index b5d2368..300fee9 100644 --- a/lib/model/StockDetailsModel/stock_details_model.dart +++ b/lib/model/StockDetailsModel/stock_details_model.dart @@ -149,7 +149,7 @@ class Ohlc { Ohlc.fromJson(Map json) { open = json['open'].toDouble(); high = json['high'].toDouble(); - low = json['low']; + low = json['low'].toDouble(); close = json['close'].toDouble(); } diff --git a/lib/view/MainScreen/stockDetails/stock_details_screen.dart b/lib/view/MainScreen/stockDetails/stock_details_screen.dart index 4ac4bba..90254bc 100644 --- a/lib/view/MainScreen/stockDetails/stock_details_screen.dart +++ b/lib/view/MainScreen/stockDetails/stock_details_screen.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:gap/gap.dart'; import 'package:get/get.dart' hide FormData; +import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/Utils/utils.dart'; import 'package:traderscircuit/model/StockDetailsModel/stock_details_model.dart'; @@ -25,9 +26,12 @@ class StockDetailsScreen extends StatefulWidget { class _StockDetailsScreenState extends State { RxBool isLoading = true.obs; StockDetailsModel? stockDetailsModel; + String instrumentName = Get.arguments["instrument_name"]; + String percentageDifference = ""; + String netChange = ""; + @override void initState() { - String instrumentName = Get.arguments["instrument_name"]; dv.log(instrumentName); StockDetailsApi() .getStockDetails( @@ -53,7 +57,7 @@ class _StockDetailsScreenState extends State { openInterest: a[6], )); } - + candles = candles.reversed.toList(); stockDetailsModel = StockDetailsModel( status: data["status"], message: data["message"], @@ -61,12 +65,13 @@ class _StockDetailsScreenState extends State { data: Data( stockData: StockInfo( ohlc: Ohlc.fromJson(dynamicData['ohlc']), - averagePrice: dynamicData['average_price'], + averagePrice: dynamicData['average_price'].toDouble(), instrumentToken: dynamicData['instrument_token'], lastPrice: dynamicData['last_price'].toDouble(), lastTradeTime: dynamicData['last_trade_time'], - lowerCircuitLimit: dynamicData['lower_circuit_limit'], - netChange: dynamicData['net_change'], + lowerCircuitLimit: + dynamicData['lower_circuit_limit'].toDouble(), + netChange: dynamicData['net_change'].toDouble(), oi: dynamicData['oi'], oiDayHigh: dynamicData['oi_day_high'], oiDayLow: dynamicData['oi_day_low'], @@ -80,11 +85,22 @@ class _StockDetailsScreenState extends State { candleStick: CandleStick(candles: candles), optionChain: OptionChain.fromJson(data["data"]['option_chain']))); + netChange = dynamicData['net_change'].toString(); + _calculatePercentageChange( + stockDetailsModel!.data!.stockData!.ohlc!.open!, + stockDetailsModel!.data!.stockData!.lastPrice!); + isLoading.value = false; }); super.initState(); } + void _calculatePercentageChange(double openPrice, double currentPrice) { + final percentageChange = ((currentPrice - openPrice) / openPrice) * 100; + + percentageDifference = percentageChange.toStringAsFixed(2); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -94,290 +110,431 @@ class _StockDetailsScreenState extends State { appBar: const CommonAppbar( titleTxt: "", ), - body: Obx(() => Stack(children: [ - const CommonBlurLeft(), - const CommonBlurRight(), - isLoading.value - ? const Center( - child: CircularProgressIndicator( - color: Color(0xFF0093FF), - ), - ) - : Padding( - padding: const EdgeInsets.all(15.0), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W700( - stockDetailsModel!.data!.stockData!.symbol!), - const Gap(14), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - text25W600( - "₹${stockDetailsModel!.data!.stockData!.averagePrice!.toString()}"), - Container( - width: 145, - height: 40, - decoration: ShapeDecoration( - color: const Color(0xFF0093FF), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5)), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - SvgPicture.asset( - "assets/images/svg/option_chain_icon.svg"), - const Gap(5), - text12W600("Option Chain"), - ], - )), - ], + body: Obx(() => RefreshIndicator( + color: const Color(0xFF0093FF), + onRefresh: () async { + Future.delayed(const Duration(seconds: 1), () { + isLoading.value = true; + StockDetailsApi() + .getStockDetails(FormData.fromMap( + {"upstox_instrument_key": instrumentName})) + .then((value) { + final Map data = value.data; + + Map data1 = + data["data"]['stock_data']['data']; + String dynamicKey = data1.keys.first; + // Access nested data using dynamic key + Map dynamicData = data1[dynamicKey]; + + List? candles = []; + + for (var a in data["data"]['candle_stick']["data"] + ["candles"]) { + candles.add(Candles( + timestamp: a[0], + open: a[1].toDouble(), + high: a[2].toDouble(), + low: a[3].toDouble(), + close: a[4].toDouble(), + volume: a[5].toInt(), + openInterest: a[6], + )); + } + + candles = candles.reversed.toList(); + stockDetailsModel = StockDetailsModel( + status: data["status"], + message: data["message"], + statusCode: data["status_code"], + data: Data( + stockData: StockInfo( + ohlc: Ohlc.fromJson(dynamicData['ohlc']), + averagePrice: + dynamicData['average_price'].toDouble(), + instrumentToken: dynamicData['instrument_token'], + lastPrice: dynamicData['last_price'].toDouble(), + lastTradeTime: dynamicData['last_trade_time'], + lowerCircuitLimit: + dynamicData['lower_circuit_limit'].toDouble(), + netChange: dynamicData['net_change'].toDouble(), + oi: dynamicData['oi'], + oiDayHigh: dynamicData['oi_day_high'], + oiDayLow: dynamicData['oi_day_low'], + symbol: dynamicData['symbol'], + timestamp: dynamicData['timestamp'], + totalBuyQuantity: dynamicData['total_buy_quantity'], + totalSellQuantity: + dynamicData['total_sell_quantity'], + upperCircuitLimit: + dynamicData['upper_circuit_limit'], + volume: dynamicData['volume'], ), - const Gap(8), - text12W400( - "${stockDetailsModel!.data!.stockData!.netChange} 1D"), - const Gap(55), - Container( - margin: const EdgeInsets.symmetric(horizontal: 15), - width: Get.width, - height: 220, - color: Colors.transparent, - child: LineChart( - LineChartData( - lineTouchData: LineTouchData( - touchTooltipData: LineTouchTooltipData( - fitInsideHorizontally: true, - fitInsideVertically: true, - tooltipRoundedRadius: 24, - getTooltipItems: ( - List touchedBarSpots, - ) { - return touchedBarSpots.map((barSpot) { - return LineTooltipItem( - "₹ ${Utils.removeDecimal( - Utils.extractPriceFromGraph( - stockDetailsModel! - .data! - .candleStick! - .candles!)[ - barSpot.x.toInt()] - .toStringAsFixed(2), - ).replaceAllMapped( - RegExp( - r'(\d{1,3})(?=(\d{3})+(?!\d))', + candleStick: CandleStick(candles: candles), + optionChain: OptionChain.fromJson( + data["data"]['option_chain']))); + + netChange = dynamicData['net_change'].toString(); + _calculatePercentageChange( + stockDetailsModel!.data!.stockData!.ohlc!.open!, + stockDetailsModel!.data!.stockData!.lastPrice!); + isLoading.value = false; + }); + }); + }, + child: Stack(children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + isLoading.value + ? const Center( + child: CircularProgressIndicator( + color: Color(0xFF0093FF), + ), + ) + : Padding( + padding: const EdgeInsets.all(15.0), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W700( + stockDetailsModel!.data!.stockData!.symbol!), + const Gap(14), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + text25W600( + "₹${stockDetailsModel!.data!.stockData!.lastPrice!.toString()}"), + Container( + width: 145, + height: 40, + decoration: ShapeDecoration( + color: const Color(0xFF0093FF), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(5)), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + "assets/images/svg/option_chain_icon.svg"), + const Gap(5), + text12W600("Option Chain"), + ], + )), + ], + ), + const Gap(8), + Row( + children: [ + text12W400( + netChange.contains("-") + ? "${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)" + : "+${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)", + clr: netChange.contains("-") + ? Colors.redAccent + : netChange == "0.0" + ? Colors.grey + : Colors.greenAccent), + text12W400(" Today"), + ], + ), + const Gap(55), + // Container( + // // margin: const EdgeInsets.symmetric(horizontal: 8), + // width: Get.width, + // height: 220, + // color: Colors.transparent, + // child: SfCartesianChart( + // // palette: [ + // // const Color( + // // 0xFF0093FF, + // // ).withOpacity(.01), + // // const Color( + // // 0xFF0093FF, + // // ).withOpacity(.3), + // // ], + + // tooltipBehavior: _tooltipBehavior, + // plotAreaBorderWidth: 0, + // primaryYAxis: NumericAxis(isVisible: false), + // // Initialize category axis + // primaryXAxis: CategoryAxis(isVisible: false), + // series: >[ + // LineSeries( + // // Bind data source + // dataSource: salesDataV, + // color: Color(0xFF0093FF), + // enableTooltip: true, + // xValueMapper: (SalesData sales, _) => + // sales.year, + // yValueMapper: (SalesData sales, _) => + // sales.sales) + // ]), + // ), + + Container( + margin: + const EdgeInsets.symmetric(horizontal: 15), + width: Get.width, + height: 220, + color: Colors.transparent, + child: LineChart( + LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + fitInsideHorizontally: true, + fitInsideVertically: true, + + tooltipRoundedRadius: + 9, // maxContentWidth: 150, + getTooltipItems: ( + List touchedBarSpots, + ) { + return touchedBarSpots.map((barSpot) { + return LineTooltipItem( + "₹ ${Utils.removeDecimal( + Utils.extractPriceFromGraph( + stockDetailsModel! + .data! + .candleStick! + .candles!)[ + barSpot.x.toInt()] + .toStringAsFixed(2), + )}", + const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, ), - (Match m) => '${m[1]},', - )}", - const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w700, - ), - ); - }).toList(); + // children: [ + // const TextSpan(text: "\n"), + // TextSpan( + // text: Utils + // .extractTimeFromGraph( + // stockDetailsModel! + // .data! + // .candleStick! + // .candles!)[barSpot + // .x + // .toInt()]) + // ] + ); + }).toList(); + }, + ), + ), + gridData: FlGridData( + show: true, + drawVerticalLine: false, + drawHorizontalLine: false, + horizontalInterval: 4, + getDrawingHorizontalLine: (value) { + return const FlLine( + color: Color( + 0xff37434d, + ), + strokeWidth: 1, + ); + }, + getDrawingVerticalLine: (value) { + return const FlLine( + color: Color( + 0xff0093FF, + ), + strokeWidth: 1, + ); }, ), - ), - gridData: FlGridData( - show: true, - drawVerticalLine: false, - drawHorizontalLine: false, - horizontalInterval: 4, - getDrawingHorizontalLine: (value) { - return const FlLine( - color: Color( - 0xff37434d, - ), - strokeWidth: 1, - ); - }, - getDrawingVerticalLine: (value) { - return const FlLine( - color: Color( - 0xff0093FF, - ), - strokeWidth: 1, - ); - }, - ), - titlesData: const FlTitlesData( - show: false, - ), - borderData: FlBorderData( - show: false, - ), - minX: 0, - maxX: (stockDetailsModel! - .data!.candleStick!.candles!.length - .toDouble()) - - 1, - minY: Utils.extractPriceFromGraph( - stockDetailsModel! - .data!.candleStick!.candles!) - .reduce(min) - .toDouble(), - maxY: Utils.extractPriceFromGraph( - stockDetailsModel! - .data!.candleStick!.candles!) - .reduce(max) - .toDouble(), - lineBarsData: [ - LineChartBarData( - color: const Color(0xFF0093FF), - spots: listData( - Utils.extractPriceFromGraph( - stockDetailsModel! - .data!.candleStick!.candles!), - ), - barWidth: 3, - isStrokeCapRound: true, - dotData: const FlDotData( - show: false, - ), - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient( - colors: [ - const Color( - 0xFF0093FF, - ).withOpacity(.01), - const Color( - 0xFF0093FF, - ).withOpacity(.3), - ], - )), + titlesData: const FlTitlesData( + show: false, ), - ], + borderData: FlBorderData( + show: false, + ), + // minX: 0, + // maxX: (stockDetailsModel! + // .data!.candleStick!.candles!.length + // .toDouble()) - + // 1, + // minY: Utils.extractPriceFromGraph( + // stockDetailsModel! + // .data!.candleStick!.candles!) + // .reduce(min) + // .toDouble(), + // maxY: Utils.extractPriceFromGraph( + // stockDetailsModel! + // .data!.candleStick!.candles!) + // .reduce(max) + // .toDouble(), + lineBarsData: [ + LineChartBarData( + color: const Color(0xFF0093FF), + spots: listData( + Utils.extractPriceFromGraph( + stockDetailsModel! + .data!.candleStick!.candles!), + ), + barWidth: 1.3, + isStrokeCapRound: true, + dotData: const FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + const Color( + 0xFF0093FF, + ).withOpacity(.01), + const Color( + 0xFF0093FF, + ).withOpacity(.3), + ], + )), + ), + ], + ), + curve: Curves.linear, + duration: const Duration(milliseconds: 150), ), ), - ), - const Gap(20), - text18W400("Overview"), - const Gap(15), - text20W400("Performance"), - const Gap(22), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Today’s Low', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.low! - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - text16W400('Today’s High', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.high! - .toString(), - ) - ], - ) - ], - ), - Gap(40), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Open price', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.open - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Prev. Close', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.candleStick!.candles![0].close - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Volume', clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel!.data!.stockData!.volume - .toString(), - ) - ], - ) - ], - ), - Gap(25), - Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Lower Circuit', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.lowerCircuitLimit - .toString(), - ) - ], - ), - Gap(25), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Upper Circuit', - clr: Color(0xFFF979797)), - Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.upperCircuitLimit - .toString(), - ) - ], - ) - ], - ), - Gap(25), - ], + + const Gap(20), + text18W400("Overview"), + const Gap(15), + text20W400("Performance"), + const Gap(22), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Today’s Low', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.low! + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + text16W400('Today’s High', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.high! + .toString(), + ) + ], + ) + ], + ), + const Gap(40), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Open price', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.open + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Prev. Close', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel!.data!.candleStick! + .candles!.last.close + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Volume', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel!.data!.stockData!.volume + .toString(), + ) + ], + ) + ], + ), + const Gap(25), + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Lower Circuit', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.lowerCircuitLimit + .toString(), + ) + ], + ), + const Gap(25), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W400('Upper Circuit', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.upperCircuitLimit + .toString(), + ) + ], + ) + ], + ), + const Gap(25), + ], + ), ), ), - ), - ])), + ]), + )), ); } } List listData(List data) { return data.asMap().entries.map((e) { + dv.log("Key ${e.key.toString()} Value ${e.value.toString()}"); return FlSpot(e.key.toDouble(), e.value.toDouble()); }).toList(); } + +class SalesData { + SalesData(this.year, this.sales); + final String year; + final double sales; +} diff --git a/pubspec.lock b/pubspec.lock index c4dd6d0..3ff554c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1085,6 +1085,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + syncfusion_flutter_charts: + dependency: "direct main" + description: + name: syncfusion_flutter_charts + sha256: "5f868f5a82380ef1b3de416b7812e1ac7acce6a629f9281618adee81d90716cc" + url: "https://pub.dev" + source: hosted + version: "21.2.10" syncfusion_flutter_core: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index da0d611..4cf34ae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,7 @@ dependencies: device_info_plus: ^8.2.2 permission_handler: ^11.3.1 fl_chart: ^0.68.0 + syncfusion_flutter_charts: ^21.2.4 dev_dependencies: flutter_test: From 1e2e1ddeceb1cca716677d9668a0f357d2baa978 Mon Sep 17 00:00:00 2001 From: jayesh Date: Fri, 24 May 2024 18:48:09 +0530 Subject: [PATCH 2/2] home screen stocks api, subscription --- assets/images/png/under_maintenance.png | Bin 0 -> 109390 bytes assets/images/svg/up_arrow.svg | 3 + lib/Utils/api_urls.dart | 5 +- lib/Utils/text.dart | 4 +- lib/controller/products_controller.dart | 1 + lib/model/HomeModel/home_model.dart | 348 +++++-- lib/view/MainScreen/HomeScreen.dart | 160 ++- .../stockDetails/stock_details_screen.dart | 952 +++++++++--------- lib/view/Sidemenu/Sidemenu.dart | 12 +- lib/view/Sidemenu/webview_subscription.dart | 115 +++ pubspec.lock | 56 ++ pubspec.yaml | 1 + 12 files changed, 1049 insertions(+), 608 deletions(-) create mode 100644 assets/images/png/under_maintenance.png create mode 100644 assets/images/svg/up_arrow.svg create mode 100644 lib/view/Sidemenu/webview_subscription.dart diff --git a/assets/images/png/under_maintenance.png b/assets/images/png/under_maintenance.png new file mode 100644 index 0000000000000000000000000000000000000000..17fbc913f5b4900919c710d15481645fd3cbf854 GIT binary patch literal 109390 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%0A?feK3#EO{ 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

`mPf~Jp zh>!yX9;klw@|3snuQ%SrDPu3g!u4xqgsxk05Tgz~2yguJdhFdRfY$mI2)L@-O3I6T zepuirXNIasS^%Beb;IL-dk5!V@|MiEZ<(HdYn1E}y0=t0B0%!J@qhmU@^J%XI`WNBw*hh8#8+eM7y`y1Esi3_Hj!tf(c?GU-1A&152rScn=0i?E?) zDqM3R5=JeWj3BC912qOC%otiiVWbTUu0}~WUBon~^u&=&El1$=X2}CVxz+*0QME%h zZaC}C4V#(>d>-q?y2^McNX&X@Hk(2y!i|B}B?MMeB1K;hGaNC{(zp??zVaN>i8>4& zIsnHV^-C1SBdA`t3Qnp;94y@&Aq%jAQ5mfypHtNC;h?282_qOp5t}|m<(N5p9wt8c zh^Q9z8-5y295zxkTvx8HRP|PN`aL;7){N?!w)}v#eWSg^WOL;;M`ioDPxvi z=R`^^^nq3a2pVV9Ihd?z`1pfqm^kr%gdzpFV%$~ez02;%rft0R%4;AoyK*h%zEnel zRuB&7q&@pvHj$Wt4;pkV?w@!MDmr%r(n+aH$?Q9AZb?#R9ny;oWu=LI`qo&G-@eS+ z%-$$+%lDGBF(+e#0-UBMHCr)o(=F80HsPGH<8beGhdxP98= z<|_xFYWYl9Mp)=OtlNr%W`L7OIoKWnDIN)9eN7O1A9N>V>d`y=$sa#5%x~)Cch~uF ze~gd-n*VQY{6$X}z)$(}4c0`NCug7#acTMt+2drKIp_=&*@bXx9Yk|cBK)qH@}!Fi}OH=x#vpdn|$HHzTsD*YBJTOcI0M~&&Z<|3fE zqFc%+m$WZVXi?#upsIk9*P7V|)upIpq)J7+{NgKwkWh+fvCAxl=U5`dP)PJJd0mo; zCcOXNo2aQ-gHgi=iY6v&&W#Q0kxn%$U2whamvjQHB0CkP-kLsGJp&#`;jZ~-{&lO)nJ=fQiB+O74 zjj5oC2%?DNlzj$a769j%5tGON~fxYK&ID0(=BPeh+@efPgnQ71yvN!X$9= z3RAOF&7X7ZHK%AttT_rFlW3=-RO0(ulyDJ>~N(4@G6`i~fejBcU2zE&(fXwS>dh2TxCRHoTfgl|_~j))n?^!MJwo0DHg?=IbOEqRz- zdP&)V*OB)Lecst1 zOgA=*zX=zqALZmnJ<<@8j<=^KlT)duSyYJmpM8#FPdE{yFTNC~jvR%KUAuYLQ^T~W zQ}NJ)56hw?@36;Cy+!5vop;{Bg%@6krOQ^zVwy=hMs71PjMS4CmnIQAy?qSj%BbeRf*+|OR%7JK9Z3XY|6<6b8z$^ z0y0K-N{SLn7(vVQQvm4RE99nxdMK*pe{9 zwZdp>PDuT-xV*EZ4oAp+}N3xhXOh}mR2B_w(-TM zpX1dRUPh0O9r61su0r>AU4%l#Ss#L?_^X>LCFggYIB}u~xbVm~!($YkNwIFuXkAD9 zjvZFqdh4zIPd)Y2FaKKr`r`!7JUY_WfKwtG7N|WvPLY)34jC`NCo?|ATklT8vB#Z& zF=NJ_Eiu;s03ZNKL_t*G$fJIRv17(5El#ON<}mZakMPJNj|e4+Q!YLF_7xy{>-8zP z__9l}XxVa^e%O?fY6w|Dq%&z)@}4eEIR02nx_=@nI<*%k#7s*gGO1PpT2l*p!o36> z)l?As3N}%~VIY3-vra15C#Xr|x_23B7uvaQAMZzSPXFiCeEd z2hUAvg^T`_k6>|7KpPpmORLDtX>&7XxaQ3aN+^pa~Tr}BDDi%YW_ZA{3$>Sm5&cC)o@5}n4 zKsyPc9Z@mZ<$fku$*YU(l;ywicdLd#DvX3Pg=AU^yOO)Gvgik_FJ6z`C`KaNf~X#= zQtpTboYQdLpvc2yd&LCFDnCr6^kG>{BVkd_5HKwOTNnflPM%#}4+3=2cR1m2dF19A z4Y4xR;nZDn<4enSqiEMwS(3-XWw@<^v`Q zYB*(2C4`50q<)x8*rXq3hR+Yb(=AK#Z|Ba(+>hsoKjzpGqa?z@MZW^dLyeY`S)6b` zFiv^Upg~pppMN1(n(@Wvaj71T$9?Aa``14CC+Dzw`^AAZqh%DWDXOd;Wn0I4wC2_4aJ3~Zut zSeA;#k&$r%R7oarU`haqO80$aR#T7Bt^jEM`CHt0@xU+DH~xzvT{e4A%smS zpop~AxE(e(9T$ zhi|@v2DR&AeD0QNu$ze5MBIL$j_b*`LHUVL7W zT)y|==NL2LUOfHy6S%EYx2kF5CFDKMOFt z|MolR)29#Ct=}XXVxi|G7~QL=I+3WUg#=o)x&af%Pe7d$>H*ORf)%B(>xNBOEDYV_ zMXa(?aX~31G?(hq^Ak%CHJQ~?GEJ2evl?*nzs#W%7xhx=(2Ro1F}D+%%ZD2}cSO_H zEn&~kMK8A0Zy*D6DodOjDHL!0K>lQ)LJuM*A67uvg5{Go&e78 zoQ=ym{T<YAHCQxnK2q@jI(NDeO)tL?es3DKZQdfEL#S7g zpeWJkSVZ?Jhl_rg71EBN%TOc~5~bvQ8&A$ z5Z5Ui=8cXVQn!;So9f2#&_fTQPrtqf<;bo~b97yn?%Yg3+@EH~=ki$XAHHW^bPXCb zST$PLtxN+#wqnq4ih0+v>V8Ma~cy!imi9_WwztPF33YYWK_ut2zy?bNLj~n22 z>8K1D6(?J))f{iwM8EllYcX@iG-Ty4Cozu7@)9)>O);a|VGNuMkgU>XDuWSo$*XMC z)Y4cDlGG_d(+_SM@BW;=#-&>)rXSAqOiY?J13#9Q;PMV_u&Ja(Dv7jsDTXw=2H(9u z6;4YrQpw#2qXL?pLoElAkr?!Z6%H=K6BblBY9L(i?`YPd7gm0}PRxyo(=rs|+p~g{ z&&T)Yr(xeSF2HGcE{Qmj4oeYB7_|OGno2`EsWs60_DhiTL=bXSU}O0@G~WF;T=Gsw z)cyXiNVjD{OWKr~u){9;@=!DYi_e01MjUHnKjQn{%duqpGDKWS$@@uINcU0P$)uge z*6a})HgBvj1vvKtquCd)ZXRq_rshw6E1mjugGxm90=+0>$rRikkHoOJJvy?|JlI;e z2J^mnU*wQXjBIhkRj|aPDB8AF0Eytl6%B6!Oezht$|E4f<6tPCjXLwnAab&5z@L?k zAHH9Ou@64_oBS|8fBk*b&CbKf;loicpFB)51vFuV*vZeWHjsQ^$`te)&|iUMEUJ36 zL6tkdKV!lKz5}I&R!;+9^;(_t%jJB2e*V%KGiF?H-F4ToPxN2ej!EFG?v8Y@inB@| zZuG#+<+{z|mZkdJZ-0u3_dkGVpLzq ztX7ssNi6(oE~ZYMDoTn0g9hS+MvX*{`To1_p+}D%*t&fO3)L#?HFalJ6Co$_#-kCm zYu< znmMHTv3S)g47_I|dQF~)9|||a?R27XK^9t`_h-x=e+RDn#|bFexdOU}_Hr>X+>NJf zu-JTv+k7ZVIcVwhE=D4^48^g{2*oN<87YI^Z^g-b&ck2dYK{gg|Bkd^77(;RbJ-Az zb24m$mZ4#5WHaV(nUC-GEJLwY3@RQ8ns%!jx|I|lLPHWsy9(`NGze$hW<^O3W)&z_ zHx{n)z*I~6s>h_1kuZDUVfHm$9ypwC^({4vWcBPS+KPE!ehdvkbiJ(wZn)+WSQ6zZ z*|k%6s7?YeqjpnCIk(6J5WXqd5Gf56!3eD4hgpEM^elYy?Q%RkYZm4%UWO~$&=0fK z5&L0|={p<^3hK)3jYc?bhZB)t2u`kcc;W+?Hf4&et|+FEJ`tzna$=@LaxAHqhGUgk zRdU~&6{z_;{^ajjp_(hfD&GO41z=Lqc-_{iQ)l_~>C?~qZvf~q37pmaI1dJ#1WHlB zFz?w|DoAvO&x?g$FT|&x&cl#VV`Ykd(Z!d`)y%mJv5IUN6FhllapvIAHB6r|4Q<=B z7pHjP_*gZ3Gj}c?m^M|&$ODHAMkDq>H4Ptr_yKx!zXMygZk3?}U2X^@>Haj7m6u7U z&xl3BHO(%?zy38FnK{{9A0b#?A-Z7d;FbQJZ>5~xO%)R>&I19bS#i=6junJ*{2-52 zgXVN1h$L?6+8M0}_C_UXQmF(Q6l7u2$iAqd72}CX-LPxpB3Nz8eoRk#5OQW>voi;) zv~(>fa~ zTmONCCyCN{DFUfViNo+%l8D60p}FIzwdc=hJhwG+zB?89<+*UjeMr&3#c#pJ*m}(0 z{58HU`VQsRGT1#%X@5|2E)G@%MC!$@w5Cv&d0g5%gi}eLlF2Jo%Td$X%{0HRnygoa zrzt;7#^mY_{+$GNH6-LxG#-mcj?>(EbKrJpXy4`rv}=7MEXe?hc5D(q%w#kMThb;| z|F|WAcrq$_cFBB_sdWsgxD7Q5>L@?VrK=1-%r%A|W@|*9HWckCIbuIds=}0(Jphl} zqfUH7s4-*eRGE@J?=5CH%okNAoqR`xI!Jmg?QR z_bpSVOnK^H&p({s9|z7upd$%i&{!t(PDbE#WTfM}h2LWQ_(^#2<=16N#5?Ga!Gkb$ z>U60RO(L%ZpUE9n+MKenVLyG^RCMjyMK$y|X|`CfXyHOUFm3+MB_ zcRxU%K7H}yj~mtN^894B3#YMk-Hs(7ETjZ*^G#P_+O!9dTTl~-M5QW~OmPd9CrS@3 z;K@HpN-XzQoZ`B~p^-9E5Cu~#7>2_}gyIq`fdpwgJ|Auy&>!_Lxd11eb}CADY(uTw zEPVIP7kG5iaIE?C0hH}rjv#@?m4P5Kuqp1rf{+!<;!bRK=VH6f4di5^{+AJA8 z6y3byyxe#ga&+s_wvtgO9)X*kckn ztLLg8tm2fDf&C}DlC(*DftcVXgeLOZt8e4!XP!lqCQZ?)QzzJ*PMLg;9z7ZpCr*|f zFBgc7ON^9q0*{csqHfMV-l%j;6%_#~JnrbM}zVZ5IcyQ`e)Tmh?h|Q?hNT>pC4=*?>px7T$gns&E zst;=@h^%T!S_PbTm+&h|@)wP?$Bjo{c^U7lUX5FO_D0d#jj$%8$j6jPxV^z$BT@D{Y0>VIoxirZX&a`J>!L{9iMN5HXB`9061XHpcw+R*8 z&cq$0oKaO_dVtez1+KgGTsR6W*j>I2(O@|=XA*H|RMbffiL=9rRKyB<$^x4u4A-t) zoKkcnGPX8Gc#Q+=ek{b7YrjC$85d&4zzHa8{doKdY_=ePm$K!!<=eOb03|=!cmDUv7RiKg^YeALdQa96l5=mpo)< z1gTu|Fe}vk{4iH8S|Wa!4f1PY^q|40S3vU(5$8&qDHe@F(;Zbj%oz_V9wzVWyrG*C zW77ywmgfi3U>pR>%w_rhMlf^d~vE&a;bGiTzhx8BAjmtBfJ{S=9p$7&; zQ>`k{8?U_@4?R3x^+2gYiUtvlGT&NPc}QX>r*t|3oH86rsy-)qcZ^uzm|B{jh7>6+ z4NKSlh;H{zLeJqNUszsTNeRjWQP}e}#O+DA zpj_8&tiGufvnJIr$gVW^1SZM)Az8}GftvzL+Rvq>DX+_DJSMFcnQBL)Vt;2w_DTYP zroknitL&txm4e&nKyh&qmMvKb-5N*dTR8M-DnP$`+h(NVp?&-?Ido(X6ukMcb!1J6 zT+!q7L9;rLQ&8LR!<>X~*RC`CFk3@U&%(ydTh)+`-64JtwvMdYulix$J>)Lb%*v7q zmMVi}%D5{V{c;)`PoA=uhspDWo5{oEa%mq?@KFHH{eiT4HEOzEsa2ht*lU^=PpW45 zQQMA5;2bot&!W~Xt~-k+9|x;AtCT}VKD9Y45*kS?F2)xU9b_n8o_gX5Jonu5xbUJ& z#N>lEU+m@FHDVOTPq;^ z;7`>8HhQr9?M>MHbtU4v9mw+K!|8A%o(L-~Id2TCqy>zWYmv~5j0_)}RIO^3FMkXI zJ6kRUOoAjYUl@Ls z^|i3sqS(G=9a6~{bVjYDto!(3@;xYXrS3fm@-S1#$*%=e%O#(?^m{aG-5yPEY7U#% zr~EJjK^Z`?|3~nyC}S=;{V>C*m6HR%?%Kx>bL605sGFCMR5T%=$(4ox7LB-*F`?K! z^yp0V>2bS+&P9SjSt-$3OLXprG*(R*e+91&(`vyS{#4B#sxp*RKD=8o3!Zx7 z-+24&w{hl~XJhcN5vuh238F@g9F2*0PlC(oK!7qb3ms{cdy?T;2Zxh->!jj=cIzTx zShB^VShnOlOuqj<#RDBY3@4uUSE&-;dHYSp16{XCE(o4ryok;93C~?BQ&=!w)9hlr z^ys|#gTD|A+9wiv?ppvr8Dk??ItFdjz(y90ICZ^r94 zv;+b%QMJhaa>j8^=X5k{{}*Wa2^7b-BVwsU!V*Oy5`}JeA`y*4ce-UV8%svubXj1J z+u;iP;J4L6Wx0+8AFjr#k9Q!s&57Ec25@q%FI8Vc_><-^hxt7+@g-VPhARa)DNtOp zla{Yihon!*k(o#*sU)KxsCvy%C?Zv-$L&KPSRqS$_7E$|%8-%fL0)bSR<2kk+2ncI znYg1%d;IhKbKuSJVcYf%V(e>oT9M*Xmj}XNj*;8Rn2>IuD zt$6;q=kVkcPf4upfFVN!nBw6u#*ZJ5@e?NraEgfqu~_HSeBY|k=W$}(xUsmSM-LfL z$WSB_#{Bv7#Z1I%cc9;ZfoR;gvAoDf@4t^;J$qv{d7y4ubdiK?xa@F(X*7E_Zd{K1 z{2YWM0nrav0Vk*D;{ML1y6SVvNn&In38CINN=`Z%n|Vh_@&e{yDJ+skPlAbsThc)UDgIo3`3HC0V8@ZNxh<}%cm7ng! z+>e$+i>1M*=fG|8!cR}kP#jhVJvDW4YnO_X6{h%LDlI>k?TXB9Rn?Q2a~LFca~LE( znn}qw=kk}EgS!1hN<1 z4xPHd`RCKo@b<1)O&h%gUF~Ut7LneXJINHt1j-WucoIpRPuY$bzWZPuetfqK$wC)u zr*Wv}fJJvph3K_k2YpgWg5|GE9FKI~vpfmwt z)P~CWNyJIH;c;>)Apvv6bsN&?O0;<$eps;tx!FE+x~(m)Yt}>zd$$*E0KW-ekD$qb zH_BHNDaG?-@0xF084MXb%shBA=!dxsGiE-Hxr>*IThVo`S_=`T1+!KWBGYAinf_+wmqZF8y42zK@1wll@7d#&L=3u;QWV529_` zws5#eq9=M-v0&~zA=0}&J`5gA9_Xo}3IF8dPbH6h{rbH$Ci3Ffty_*-b!sA5RxH4& zbA~M+(F9KVNTvihrDr7Gpmfp^9+b+?(rnOOX=vW16VC4329_FG(4r|cD5#Cs{_{MZ z`rut$@btr27LN#@(C%^|lnR0kU5AB^I#$>neyMnqf!(N??H6?sE2N^5ax}`?ipJVA zu#|iPr(X@SQj{)PY)G)$)a>xu97s z<2h=(c_WKPEfRoc^XFi}(jRd5Lyt;@$vmIyTDC^Yu6USH#*@$>gnpQmk&0DZQodGR zRwf)NO>)WKd-+u(mwd3~k|$%-vRfqY0bO?LQFWu`sizSYh6K@4e^Wdh4yqa_s+LJGO!IjMEV*FN1D0 zm=93yYrl(7fk_ecJMe+30PvgT6Kg5}5oQ1wah9Vh>L$m7`J#sY0-+ixPIVZqAlDd3F9b(NiD3nGD#s^(xtG-5?V z=LY;W@o!|MzCjQH0Rbm;#L6tlN;?6zga@JBK`eM{1(v=VLSiS7=RXNPSEdY(U38I7 z001BWNkl=o^ZeNYwYz}?0vJR@@bJ`em}57w>z0b4e2Kvt#~eR_7sg%_Lye})I!Hm?ysOqYwF zfqHii13lvH%4ACh`z0AM!Rp-RfK7KHtwwEpvuq_M&-@qWf4>S>wrYoKTD3*gMnB9F zgu_ADoersZNs&{NWVI}>k(~ptow?+n;e$8d#7VX4RP)1BDR~Sbjwez-^TX^bJxtYq zAV_e~C|(8PNlU({YT@vh=*)?y&7p8pEg}<@iqHVlU&FCO1x^{pRZBTFhH-_nXV1Q{ zZQHi%{|~TopSL(BfpgHHUJF_`zww;EobhKwOZPw**NA<01(!OqOgF%a)f+R1VjM!y zv>-bh3qGHVH{O096Yrmj7oL3%?b>yO%f+P&L&NqZyx)0y7fhHi4nDshY|bmbX9UkY z^)%l5@I9P<`d>trrY=T1Mhzd1@pn(ITDsc|9;jZ$1678;X zYSr+?7oQ6cl-xd6pp8#EU0!R>2k)VE>z4TJ^Eo*A)Kd_tQ2KUp^Qj7gQx-}o#(bFc z&T41449O(=ScC4(z=sRI#>5w&#O=cdVaJXlSi``dYoCM*ZfJ&D_Y8pJoYPTK5tgMW zC-Rhnl9S55V9Ksbt_+PRsO$`f_rOZop5{V!d^!GUdlmlh*9aga-#5>mfqYj(6fM`V z@ZGie@{P^#B&_ft11_Y)t})r19;5^|E~ga`lm93dZ>)!8>8*(Cqmz&1xr`p{^^g1A7-qznt+WB+5$-8KO~b$ys91 za*Y0oNgt}-PoZ+=%TGSXXJ3AeA;U)Dl~-OtyAHQiIiLyAJxUIlGDzktvho=;ptmgH zIsFsaBd6L{3!ZrL2{Ac7`|PvPwQE;6T#Q<<2@iDi*hwn)+aS&J#AFYOMhWKB+?VFT zs8J))w_mSnJWw6qEL?y|_udchPd0NyhYm%flTX6q56{G(PCpH2|KmKw%8HFh+`avx z1D)vAPaJbU5N9=~7rWwNH0yQ?hTJm&MSDttm<1>1HNvf9M_@~XES!F4Cv4hN0?p-y zo+KaACd)})46I?yUYvxLA&RIag@9&9P3tr0=v-U!y_Akz{obUrm~#7TDlKOM;u!U*JITWOHsd0E_&a78?L+RVrYpFD)#I^I8-5y^d7$- zk!T!&pt@)u3fvXIg-zDG@o-! z0_Whtz2>*N`R2dv1Dw)uVcoO$;;POSqs3eGJD|$Nt`4=P} zqol0DWFHyNQOkFoiG)lh1DEifaR21{;BwlP9ED5rXcYhc&(rwmqmOXL8D~gV5#4fF zf!;N8B*u@wPxU&9@gi|o4&q|2oQjDvJagGcj~3}O*-Hgn-b+D(n94FOkgr`6G2+zIp z6#n`2qgW9rN7SLiP9CymK}8}8yTc~Fn~^{ze7Z+saD(9l5>`9n9vi%6i*aN6_ox%t zjL=5ltJfCes~12My}=b?fFgpUb5>D=xdy=&uf(3P%mY2176-{7o*; zf<>&g`U$;Y1%YSPYKbVoNNmzsuXGzlk-A~-FV3I^!i zs|$t?8H~)lJk`UAMdjpq@x>SM#v5-44|LG5VFnLW!|0KtFyZdWa64@X(%l^z9Cn9< zb5Z8T&FNIGG~|KyxbsfMsUs^Kz}z_>Va7w#F=5}~j1T!Bi z9wk06CjaYSSXa6SP1?4?rlOt5OV7o&$^Zs*z6F>3=P_)~OGjZm3Z1}d)euGm7IMxL zamfMF5*lIwz^`YBs>bO^-~@XSPTKkzzJK8v%zJq~Py`hC8o&WJVzF`=lnFW808F)5 zP~a$&YNIc!%A%4vHXuZxc51i4` z-2xodsSW1A75b5xDk*tj3XsB~5S$*5F-6ev#V2#{_`jZj+v~x|k)x4cx4t~?@yGs! z;lqbx*RE3Nc1?oa%#D>MBUsI`VwW!M#NgQFqd%G=yOWdl>Ps)<$tRx_9%#Rz!{qU# z(@Y#U5#uJ_Z%i=Rqa^v)Ce~yEz(%8qT<$4TCgYCYbfo8$gq4uI0m5Y^uu|n>H1!Xp z1^zYQR1Wef=pG-IEL)8+4?c+7#tg@n@)E?OG1RJE4>#Y`8h^f}9h}XZU}>OCqCS}M z1daLXQOOueCYZ6~1cV#V^+ z7&m?P@7fRZXaUVHy^a~zOu($h!`yz~efM3|v17;o?@RJu`rOATaQ2+nx_R@zn-!;7 zaaHXkV^E}0`1Z!onx?7dazji%80qTq0nsSF`f46#&3ptNpI;{0b;+p&@cgsSp=ZyY zC@-s&3RE)895#d_r244drQn?fxT8mB3>`LDi1adrCwC~7!n4(QpnZe~%Kx`u{Fu8j zX56@{k8V;xblonMt;j-|g!YpQ_}%x6$L&43!0xgmP_hRew^PXY%B_5FSe^M|)hq4; zpFl~G8#*#F5v@$2S%(hja_<=Ihz1b~1!*}PuKjG6o8S9oyx4AjUkkV$#%dJRPDO9FiV0Rypp$1eFa5*0y@ zOBwb6EI>KzAs%$>*a4F!-2)$AQ}Tor#pL;COdjZ2iU(>{W)Bl5jK?_gK$QcYN`0)x zspH@2(?ATp`|feLv(KG~2Fjtu6Gsf3qAQAqpgG)tCkLJS^hKj9E=0zObx|IwKz?ok zmVUhq_fMaJv!8tgYqgXNhhp&n;7P!mh$AE6KtopsQX95l-qSCj{MlE5KoHKfG`OM( zc&uKbLQ$@%yBKS0mAH>&N-0L@bWa|rY1hVx-Kyb`>6pJywMj5FDpdYVq(r+-76lEW zNjdZQyy6UByr&3-Th^iR$qjIO_YS!Ex~51(%TTm+0~5!gYgRZcbZ-ZOu@EfQ6dYcf zcq9$=n1*m5f!vyPVe@5S5p&6BK8A%Wl^m3X68_5i&KScR3$oWehNE%F4$96BtrpYIDs6i2HVzheEQV0NWSzE5N6-gjf|uXmQWNfyBlGeTsRy^ zS%OF{Cvq)K&@`z>bnfA{x5v3(?hmD=sO+* zv=|K=)f)6oqErct(;!jEaRRzS@h~%M)W)}l zALhJe5Yet%2?XaD|pe%-Nc z>vR9~mp>s~#{Q!f8Y5G=Tn&YkbzIVLgE5YnVfO#C<7Y}T#o{YTjWXTAHI*05iMVFN z7jr%nUAfck6^(jcK`kNDzwqKqxT8-ml$2Je1V>6A?etsZ65fJDjDW6|@OSp;BvMZH z-FVU3StSubpMDA-eDEGl`}64-G;oNhg%l5Tr1*gnJmsdKB<6-!BCu)m_b8}c3$c=t zBN`5=9g&2^o| zga!T$Tkyr~C$Z<1_f^@gvn`Q=J*B~svcVBo&g#jZSOOgWkgB9WQrWwivPWjsu&+xH zBLhLm?vhik{4h-!p!f@rjwC9Wr1W*IHui@3_!u&LJ{0ZPjMb~x;jFXjU|_#HaM{J@ ziqkryD7a{!r{dt%VKm71Tf20a?{|o<^ z1kQ2ehJSt8MHilX?mx~&sI&wwuNwpU^pOBHPP6lC*G9CWTvam0Ko7%TW_ddOluq9Cu3Zq{A6VZRhbSx{`g`4iX z2U}MBh=tF*2)y_zP#J+1)!-tq+oKXBBp_+AK~GSrL*P{M6!FSrg=Zv6vhtHbj7GC% z?h6%nY`3}Orp0hFx0zC{!83$vFJJbWzUG50e0G(HvreVzF7ovhBDZrV152kRN6>9_E%QQ>I+@ zd*EUI)(ZBR1kT>QyU%TP^Nr`7d;Z^%2ykGNf|o>U8{qe8B1$EKY- zk&#{l8+H_9_`nfpcdScWmE+9fdn^ z?zyL+$L*ca?COh=jFrnEi1jMvnRJ7q*dS0Dg46ARrrS}$b4G5c8e-vN+Yj>)d6tU0%!mJcg(r1L;H(P`O~RF0H@ZsZb1Qd7KMbVGh}dgjGiz7 z6~)EyI2qmW%fKnAk=2JvMqiB+d2^^lN)z?NbQKB(BcgNXMK^cOXLxAVBk*|r7%^f5 z>ejC>OZI1;dkzBz48YEvdsI-Mu{0%!5JFkX(&V=wlffrwV z32(gq7S1^1EDRYwT(RbVGDaRhZVbkZnS_n&zeCOXb$|0xov&%}c(A)N3{QF{-hKaL zy!64_=rE)=R&OhW%jQBsW^G(|;nl#_V!-Z(#>sPvh8QYylirqgI0P_l7V5T@F$aM& zVNHoIC<*M8FKV`k_+wIJsmzDtLZoNKDP|}(9d5T*QH>%L03_h`xDco;MVilxtV}pTz&%Cwwj8X?MV zy=lnGs*NSfkNaVofVLkGbIU^yJ#<;CR;_-ww4x&g;$spx2My}|Zu1+iYkJn-&PLhp zT}aEx!Qy#yao#_!gv$wZ?%WagJun$jE@Mrtwo!3%l3ab`gxB0;m}E99&Hp5iFQ|q~ z>_74X4@SbWymZnz$*SS=Pv+o>fBzdEj~By+jX=%1b)`am?wM!NuWx_s++9*teVT9Q za@i3H#RNRL2@iD2eQ>j?WmTDoOSSvL^Dp7qXP?DYS6+?oJ-P}J{)yR-;G{+kaoz?0 zIAQ{P)t4r4I$UCX=FQB(_T9VCzF$w=Hemz`D@x&rYB({k0j7_+5AQwsEO|OWGz91> zU`&PhSYS`tWKbi%=EAY0uA6|V3^=Mn&gf)B`J{zWy_yjZ!rUCYVmQz@)Mk^MZt{u} z@hIqN>U3DKt#AXjZwuhO^Xj8d&pXldihm*zE=I7j1d&)0943)BVM;e?#Nn{hh$OCT z<7^r#LJ_2A=O801AK$K6g}bNC!Z*jTALcLcFzJVR$?utmd8B|@b*=x_7x*JSf6$;_ zFLb`8V~a+O8lbYgOum9QBOUWU{~T|<^%mN-Ylp@spD2+PIypntD$f0ZQ{r{2Q7tS+ zvY$$5(-5kxgexr#iAc;a3`xjOQ6NRaax`j82P3a$zJMn~z39yS?Zph_n#LaR#y5m0{p?W>QyI?GGUY(3`y|OR0_J=gQmB%!R5WXz@C+k zRA~gYyfyIcr*ko}&p?iyrL7>omoBUPm0v)o)4aG5sr{C;C?8Cnxj*dAl5bf}Z!Sx7 z0aWFa%1VdesT_T1&cgK06w=e2Soh;-Mf_+T;>R(Jb1&S+ae&e7D+k z;at+5jUcI}_e$eXUKxbV;etOq7v8KISg>R%rq6l;bC)c|)h&;0Kg|7jn1wTD%xKcC zUArIth`4Y#pZS=qIQ#VJdhZ2)KX1^D&2N&6I2t5jJA|~%Ohtm^772+$=um)@OKBOs zh?xh+y5jPxUdQc1qM|}BOs=~lp$Hsa4}ujHBI}DpLUPel%Wn6l%d&j#$8#`q)@=CF z(lKJhDAcUqKw=7Bc?uJ;ZUKf&9EmDsao zCvtsR(84jaIQIe|VSzQ468R#N7Hy1mV8v>>!q#3iZXw_;oyRj9nZPgkvt0wkt z$GRWp|9XYFKd2s)z$r`HTiZD<|R(y5IF>?(@)AQq2;;bxq~Dx+4GL}cnI zApCj7sbrXHBXDx*X@I9py*UrE3H?ZZviC{QbGi`^aiY!sTwIpsk`eTiBa)R$B+Z7e zKAnSEGiSr=_hG`_F!;JrDY;{MlOK(A3FuyO4Mr28|F;q#+Q zt2WrZbQNsTB$zU+^3IGDN#>PH?~=f&K{5%gNjM}_lL2a+Vlyk9&Y>wdEHN1tB~w-* zty8N{z@)$Cy7lXXJ#h9Jbue^De_V3m-{Ev<*tl*LgGCwbAroq+8%Lg zuhc&rcBLURuMWOh`~xOG{FwM*Ue%&4u5H;CajT9UWu=l!ek}W8&YCsria&zV=WwdY zLwW2m3!L0JOP9{CHEYJBPv{OiDH1s4v{ME2N_Q4XDq$oXg2Qf+s*pBsF;*x}U3zD! zDD%&Gb*m-aUg)e=ZK_aUkhUXn3dY`MHV*%vEk1fXD)SI!uq(-YDP?6w(_mP1eEHcN zJo?CNxIAv*fz~J}5HsNyUw9dP`t(OhX}Qp#>@)|qFdm2&KYM9ReA`Z)I%4AZG04fw z1`<&OE6U)|6&qf>I1N)1Q)YP}3Fgo4y7E=|>M11b7SMuCOKJ#dR$SfnHuM}h9OdB{ zDnnt(g@1U`6udKarbO`4ZHlX5uB>ei4u>>o$%ODErBz^1eYj+%^_%W=Area=&Fw=p z91}BWnrQ^15jZ_$EksbXvk;8Ex#0Y|=y}I&xc2JHfLIW_i?$;i48iC22*oKHH%vZK z388y2iaE(Pf#HXlmXn8!8UQP(biV9&=0sr@6zHE?7{1#v>0u?elv7(XDG2oOohG z>A?j{OJv$A+7MD@nA{x=tCU8Xaj=|JhD24%bApHIiA(@6-P=_pn~|_<0IKAfONGim z$~d{IXGG&<@sG5scn!Obxu22;Iu*5Q)xwZrLy=pnjsW)y&pamym%EG0j9@JzzJSi| zx~k|R;hVpiY69eAtZ)851ZE8#pQK=91Y)$9PJg0E^R&R=s=T!t1U< zdYw8bi-eJ$nT^%oEXMebJ%A9y?2J~YVb?|kwQE+mj96XnE34gxa6DF(ZBBYoMOh_u ziygT+HL$z52p*pkC8b3uuZZBBGwWg4us*o@$_o(t9h(d?S55iZ+<9ox6TNmUS&FOvy4bPa((1w1Y;T9&H{X6dJ2U;_Zr!>-7cOTK zB}Kbn*R67*vx&y+6_x*>`k(t&2c|ds-ZvmNnoD+*Mx>s{Nw8s{EC9rpRl_Fb8)*@m z4HYrM1I@`0Ae}d74j!BRgtQUJ`)tto6e($6d+l}f?$rl{+l%1P9f)u_%cxr6HLB0E zbNfnU5;#Ml18UU|WvQ-i5K80E-Yfqkq6s*%axiD%d_3^vljt^TIMx(y5#VfCP!o6D z)EXPV{SLMy1qN(%s?oJ2LFy45k6f^7Hbntq@7AWlVq=;j<&jAwV_}2>aj9(2KD!Ra zjvI)-oq0N3x(kJyHcQx>$HmYwc3o3Quz!q{eE(ob-6T9NuQI$?001BWNkl$nd1f$^sZSW;puw>jSIPC4-f+ z;$pa5RIV_ZfsT&VxSe!*s0N~3YO77{>V1LJ2u3p=L4Z_Xq<#v}TJ4BPdLk7c7|0s0dPYT@}AkKpM^ zlYyu)LsO1-vVSO-v=KC8Dr<(?@Ng^ukC&iVg38J$95&!@XVt=hzIUSOm6sqIEJxX% zT}VciTM@qtpUcm~5H!2XE#YBwu;P@QNtD@{IY`gU!m<^sF=5(lELgb;*S2mcQ}Xgy z9OdCCB2i{^v%>VsO^bssB|M0re!V(~hQj!6{vv$-`ui%EeE4wG%dacv0{gXOL2$?@ z!$M55x!x#c)u{=xw{4x9(r zF_&C?{wtq-_SFq+Yf{%ONv)JE4)2G%#*US7a6BADBvdKx@vMZZSCHz_dzb7AFb}k= zP4743cU4P%)5S+aWn}=~v^3@7Zc~+*W>?Eu@=PV7m+b5 z3vKV{fm51XggSpd9lMH(Q8T*+iq@<{uj`u&a0;D>tOMODI&?1c#plSdhGQ2)(~^kA zgEA#Q^URtUJ+eP8zUc3;BqP|pV=Js8HH|^HS>e>_RuxkNHaP?qFl?=?G7Qa09%eq$ zGP5y%@%MPx@WZ5A(KW4GNiO;N!a_!w3SZQc(i9=yFs>lOf|Y8PHw}xvo`<(zdle@X z)W(>;!_lCit{m-1Bn&r$=7J&R6>9h#Oq()AdYDWGRs3Fqqmfc_P7^SHmP;O0`tPH) z9fBWb;k0SfuI|{eN`=mzy99XNpu{ljLpU5JZkL?D~>ydJD?wrr@_~TECifGWlVW?fFo?Ni+y!8fp^}Z9EH}AsMEh|tX zuLh#!W1CKoO6h7Oy1}(aF#@h88;CK0u=kejD z%dbLma}jhZeQ3l%`jHVu%dj+;ZWme@t5@Dy&N`zWMvfeSCYN1+NVp7Tdv+oktbp4^ zhbUF8F&8M7j7Tq+!#wKY8Cx5wjH5hJ8Z}Rj2S&brnaP_ zkV_~wbB0GGl`RTPm9Bj6R$aEaUoX^LrdRU_H7iZYRX0pWtR!uR)H2V!&`eKIR~m`* zIu?927mxqz-?H2vK6EH*H>@wC?5?+VMDN}`aq8)(AzD^e<&I>2zWpcczjSg5a2kG= z1Rg2R6XcSnVDqG5`T8Hx?cT8%GHC)f7H*gAebrZ+U(hbrLh<6R!M(Us+}(uiH;sg)w5Zv7%n zW6?%MQ(FDcnjYG}3c+r5zt*%gOVV|&58+R=g~6xa;{9(Voh9vR>-&q(p&4B`U|6RBjxJBxA z!CE8bju$U%f@b<(z@jZs^5%ktw&lB%%*)aXe=uKklLL0Zy`OHvKnhJ#H!Avj#zB4> zCEE|*^xx|jI~Xcd&rxrOr*od@qj|TTgV*&5uWD*dW{2U7=-2bjA9oC>F~2s@3yV<`F?sj1TXD%yRVTAmYeIs9kTLc~ zX_|vaQ9?I<6C{rR<`vW{fXOWml{I}{^chkh6vgl!+4hCjJgLFc3pz3~_*}8RRTyjc zDSSJ@n-mPh?Zpn5@L?jb5WQ`N(Gz zGD!#CL*f|$&dhH?25s9E56y~ecS-0~YSG{_6?znM!Vb0^CGAttlcfi`(CX6OSK8`5 zm$jAAJE5>Vx&VCX(a)(8mqWyZ$XDmcjWw+zmsKwwMFIW9MiRFNRYhwQse{pq0mk`l zKeE{cm=Hy-XfhF}dv|P_clddcQO9V*e#G%nsenMcs_6<4uGEaqvg1HE4N3GK+W6s@ zHXz1u+j(861mb4W-N0?XW;WDkBq`of8NL=JVsmkSpa5TjpX@ekFE>+2xLx#!L_NncFIC!vd7dT8ksS0Idv!K#Qp6!wsW9(HE~U zx>~6>(uf{2C@P+WyAP1t{6CZ*mBJq)@koV2x0Ye>kVizd?lAEAxWv2?K8rpP+S{6`p_rSYv-ptkrE(Qn1p@M&1L$Gqbb&w_C@UT{^)&t z?<$^MYR0rRM4O$|4j^J1OKcMOx-j&~r{ftsxG&^@By_SwzjV2jE9kD4;j9g|GT@Ex zf<^x>ecO7Ueua;nUFyF_V$Av0zd!({{Km0B&!tWnCq9$7Tbt-lZ=|vadzPJMC^7*q zOLpz@7nM}0gb83ssJxBxx(eSL6UM!xlA0Q%CH(gv z)<+-jw^GGfGE_Lu#v2L*BhIXMho0T<=(Ijs5%SG-V^V4eB{^7}>gO@s9Zh3xozd8v ziKw6r-ws_HS>J%~SUTBcTZ&OHWbjTm z3Rd!zuk5TKejL1^hp6|yCnjdIKe_T&R!~S%X-yOF=i;Uwt?rXXRRplm{eW z$8?MO_?v5v!Y{FcuMbT{zWGWf9ZD13T($x1z2o!78{zxg_37e-yj#%R{nfe_?Gyn; z?_bg?ogI9y>`AhI(e2Am#BbJpRzfP+9ievc`4z_ffXIIGnw{rQpL!*K4${Jpf;Pe^ zL@a|Z`txc{Th?-v0WNl^g>+Wj_PF*R9!J_C<<#-r1=qii^LpN93=4#gYG0qNlM1C` z#mi{xa{?e($_wC|r-xa+RjPpXyS2NoxxFlHl}rP2$R&sQHTNkFyeO*&`gzCxD7ZzG z-3{-+;Z+Yq-KXV?xUhSyqBx^Q+5uyKnvV=&fA-b2r2(& z=7;;xF);zRWn|&suJOYTL_zFw7)<)hJzJL?C!y*FJLTN7-;K1Y&D2Oa|LwVTAQUsb zF=ZASm%Lj&y?~8+KMqm-2G)7rop3g?nJ#H>@!q9UcTw}H7N(qZ0umUa^k;>#U4k;t zvy-ls`z{*6St4I)`)ylEog!k{*w7#Z%+8(@3NJ}mw?76Ds^fVTom{y)0pE~x(6#B5 z^e_R09i!hGV!S5#c)k%zCLWsfE+9!sVc4<7J??y@Xk)MV_6q&%Bp_|6$4QGTtIbTk z&yhj)Qljebn-97sY_{I*X$kU~#1>6|xun4*!`#GrUto(-*iObL2~tG_qX7J57O2)l z|5p#|w3@8sX>JL;{vG6PTRZEK%US>6DG^S8m`@o6wH+I%x?hm7@!>VSCKz_4J_^qBcNPqoTLRXciJG%ED z>NYdwyDF>h`KycFqq?oAh&-}&dsd3s8ZK0-si=afz&99OQ=|EL|4&n*5K6WbTA6ij z*X! z;Y~Fim?9Z(0P#ftjPsy4t;z=QRlvK8?!6+bNAbGS<+%68Edd5P-%9~bi>BAY&5o(grY-M#j!*QNdVs}mZ*DOPamKv+8 zfw&G>NW(t|c4w!`mo)v2adeG6T-ODC$B?mx%_~B)313MT-Px_io@U9HmuAjEX+Ici< zR%NL69#;4Fz!SaJy~!hw9~$jS>aKZ{L;A9!Rx9s8Kk64JG+CdBnu(Qvr!s$&wVjQF?4jywMK70(ye&$MR->BighFJ4_)Els>r-5F(}s$UYVY-X6C_8B~28#F;0* zssj61%YjglER>lSpB*^2@VxOelMAfI!B*p1pTT@(u?c{Q(f=vOFup8Pw4EZc9KPZjjVUrlF4pDa>>#uU^QOCB<4a-ImzHEj1^Fm*Eib##Z(haz=I=?R88G({SC4o4Doa9g?rMZ56Z6PC9%m(l8-DaMebNUo_ zNUD0%`NSc+RMQJz->@1l5WTvzrZ3%uH~BG7>KFu2z~}$k;F;pf_34lReI>jKyaue* z#9QxJn|-HI29RO^sA*BZqU3v~&`hwS0AG;%YTKIxZ-+334-Rz5>FKJymz%dB&E{Y9 zjnlJ#H1Y7mpAMr{->Y}(8|bS16&u{5U(xTpYj2S{ZNCfa;?bu+I`fq?5h33VM@3IU zXsO}Wrl!k8qU#?lw1E@!Bm6%$7PHdH9jmGRAbAzW)`0qwJ{2HG0x%;R>mY>2Nz%^{ z!0q{wY{Djh6bO@fcoaNFA8v1jK8DAz6>!rk-PWjB^QzAG?x0!lv@Pr#eP_fw6RBc` zEPbB!PU#TH`n;Pru9wah?ZVPkYMI4V8X06!!Cy6@^GIxzu4P?bMhnlKGn$*UXVHX! z@FbP-q|(_AExIH;WP@=BliV%icU~u_E}1UJB-8F9g#2e?V`Kf5TGf`VtWA`cJ#1df zjrLlXJ<(XH0zyKX&?0an_6PNyMHYB&S7vxAh2w4bCYXt@LyBeMsZ~x@Eqn6t-A~k6 z^qKI-q0w(SuEK59zK(%9NR zukYi@K>c`4Xwun~fGM0g9bah&^oRYviorH;o)IA373iY{b(-#{IH_<4| zzV*P$YzdIiRC(p(I!Ndbyk6IxJJ?_ z63y7u)jb%g`^y}=st|t>zwHyi#z+7DKF#y5sOfmJvT7xuDLjSdM-?pS4kDe@6`=|w z)f*V{DBrrVO5xsZG9Q-_z7(t0fB!4w$(Nnebw`v8i(JkBJunTPaK;0(0M(j#+FFJB{sFRB$hkhxIIN!7|_70;585cZqkB- zRn}%_JtW&=-<3_-um|{ zIk!%YgR+=H+TBWx{L`LFt*BY<2sdGuXg$08-F&yo?d|Pz#%G&CoS~yU3Cg&EB*xY= z<6jEY)$ph{^WmOtSX~R@D$4n0=zmJThSs}+ym{A70M1Grj-q}NX3~>i5_OpiHq}|u zYBQAWiE`y=l4E}0vg8UXdYXK;5$caexxM$Wc08&psw%S#c`uzWovK;r%$#bdVA7c| zP?^l^SCwIs2iIh;^R7u4DVLxi_W46qE=-PiFhf%fSd~(`g?{9C#!&~!d}9P5j2?;2 zq-8$jWvq793I1-yQ}Awi-ZCr%Z9;~Uf`WNC^%$~1g?Xy>(D(?TR8&udhI@6Orz1qK-0rxoZ#>=6(IE=FRQguN3q(IwcndR~c(}xGsTZ4}4 z99?A`(*uw{#1#VcT;`eB9$?7FyIy%}J0b&aOg9`TcEoVL^3~pi^vcRgu!fsYQrcmv zOgQe(`6Do1CheY@5oej;_rm>l+Uj$PP7zABnJ0oC@F01B;y&Zy2HDO%puyxs!2Y&O zfZYe}B=Ay*oTjnxH0OqYn9D-;bAjb)9plbBz)ud1xI`A`AoK$Pv8ihP&4~*| z#t`kWsL(Dy9`lfZ*I6W-CGkM}ui4UHS93b16xZl(dR-QpoaZ}5D98`v5<$NB<1~*E z!fBURSE+)+!dmI`l5K3#CRcVST{c!Y-*E+IXyPhq9lrQmY)_RNX7sv}R(UR*#GZlX zDWm^gMX+G8R7nz~jU6$1d9uR}wo(s@+zM0+#Nb=)l~c}coeH2m(;*2@z)mJ-#cwtv zi1f=*?e$46zYT#BrH}alhfB^oW*>o~`SOXBF!io57)~DDGq0LMkFB*rcbf?HgpwG@ zSEu)l^ytFdOsFSQN$BTTtklF)FZc^A{yz?9-Ci_t} zh%P;}n49HcVJ}(j1U02-SiEbK2wR-pgR_2~L-ggm^XTS<06!4A@U01}E5tos)iSEGovg9tV6|S^=_!}1+fv2><7MEeuDIek`cTxY)@P7#jxt7y z-okhha&ABIL*A$J{zQo7!N|OjqFY56cj7B=Xis!(eqJ8)$gQ{4Z1`;xI>Qe7;r5Rk ztkB}_9YwPmraIb&r|5acfZT?8z}{{gieGJv3pdbRPPl=zVnofPEY0_1e1) zPgum8KCueIwVI+2)?Ca~s3SeG?#Cl++qMcVc@3_U6JeauF;kx4pNxr#QGryWo?l>~-sa|&!XRA`brPyLtiT>jW2 znJW1PTmh%hV&~`3;sUHQk9b0{oqQfhbWejJ^T z1C$KH@d^eL_ItIy2R0e!`+&o15tWMBw8a8tu4IkO{ET(O`ijT3i;SPJ;{KgK%;5s5 z-#h;X8HkM;pJLMPrJt>+Bm#-z1=Vlqthn}=UR6n>Dp%-bOb`=>=4AhOsYh~I+S?Zb zoQRf4cg1fR{)BAO(s1ROBN<`~c*V2K{13L0%^fur`|S)VO(!>TEyd39GtM(Yya9>t z-eM~@n$#*E@FvQQEQ2yc`uM}TB}}?5R6Li(t`<>?f37~hEOOnYN`nL#?#wRI^0zV@)cf7E-v0`)H3LO!UR3;5{-d`;Ug`0 zR68H;72aPE6B9G__xE>gY&|q|78R(`#LIMkWQ1-=a||)H=o=WUf1)c)x#tF$C5E1S#2v@AadxNNJLcsU2wR;1RUdsx~|O zO-}XVTzD8MLfq`eGCNwX_|DnmDYzFZoGv}p3pNZR@r2%s`w$lm9{G${8COC6s4Dg; zWr&%t1-pCO1%a@(Kh8=Tg)7{ahjX>2v>favCP$ua-eMr{C_zOSFIQ7jlizp_-&Uj4 zr-3>g9fV8BhYLW<&;T1(*Hf$fF(HqQLmAlOQ7Ktm@1h7+d7K^C)hNQ51ME_AYyRA!+Og;__DC!K%bcGf> zO;!7((^gv|i2}wCeqpkg`kE);k&3l6xUkh)m@_YSih^t!{SqSl3b{OA@CHrE#xAab zUBRmP?CjDHvu^OM*P%rk`JrvCzioE(G=WMZpC8^D_n$#;(o;ZZ)VLP`q&w;8{>bvB z`4Qi#B7msr85vxHf`SW7sc6UaFEse$WCtHZqj=ca#a1RK-F*ZOWrF@_q@eFodqu9% z(ac7Fd~Ep<@cNLE=fK;^Q@pcOAa1YPc`i#^<>K8pyXhnP*fGV=pQ!~78$7PZfa|)p z22Eb3C$4gdw}n#JLvmL!LnoX z{DIf|1Id)an)%{>+;hCv+fVpMKxAlAJ3Qu}wThL8J})Auf4n5^)M zJL3m&b3nnN{07zXSR2Y{dZ&ENhVj^%IGukptM@WIHQ~6Q4K8i$zEhNlVI9_{Z)QeC z`g2_<==PW=2=4tGDLnCwjEHrx{yBw%p`l@jn%W3}?=CT$)}dvzxv*c4fUnM5K+gvn z$E*~1E}v$bHYU14Q@2p-*I1!5&+)E@T#jKNp-DG1mzG6c zxYzFbFc}#4)g~j%F?XuQ?hd#RLdrv;v_>_RKDK)rn7QYpmaKW^Hw+A0m!3ZEP2xYF z?)T7!yXd7n?JU~x_~cX#kBo%nfIuOizIqFD^AG&zY)51S&x9p@3a#0nB9n1j>PXg?;?qQ0x-it9(QjN{dh>gObM9dJJ%g5dff{%6KvJ zzeP3BMrSugK_92tX&R#WhxUeL5bNq2EjRrq$c%#ss>Mr~u;^`<)y4o}n4v?@q8j2w zAl3@Y74@>)!avYlQA{HI;y&Py&ekbW7|w0{>kCXq4v|lA7fg*dl0q{JC)zdDJ;(7U zcz2R1nlrbQd{UKa`mr%4un9CD#$^e|X%2a{W)P=U0(s?>PQ)#g;EQ{V8n0p){9&(1 zi<_HUY6Ad#QU?jUt3<8*8p^|9!?R zE-nr}GLlL~iK&k?e_lS7$1rj0jOn6vK)jRi({Qqf;4toI2qG_whn%CHRN!8DD=54o z{b?OT&bWmPynvz66_C-dV%#6eDE#mMz+{4|dw(CVw0W7>+3k|S>x3tN9*p0MLM6|@B2p5Lx zsnXB-LW^^Ab7Pm6m-`tdNC(mL{Lv;(T!K=2KpEH4rX;|o$0p*6w|35^H=J9e~~U4$JS610yDVTXhqjR+)W rc!?;&?!P5p|L>Cj8_WOiAi9@!X7i#xW?Pj+Li|(|H06KFevJ4Zsfwhd literal 0 HcmV?d00001 diff --git a/assets/images/svg/up_arrow.svg b/assets/images/svg/up_arrow.svg new file mode 100644 index 0000000..1b5a009 --- /dev/null +++ b/assets/images/svg/up_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/Utils/api_urls.dart b/lib/Utils/api_urls.dart index dcb3b5f..fed98d2 100644 --- a/lib/Utils/api_urls.dart +++ b/lib/Utils/api_urls.dart @@ -9,7 +9,7 @@ class ApiUrls { //send otp static String sendOtp = "${base}sendOTP"; - //verify otp + //verify otp ///9867890261 static String OTPVerify = "${base}OTPVerify"; //secure access @@ -85,4 +85,7 @@ class ApiUrls { //Stock Details static String stockDetailsApi = "${base}get-details-of-stock"; + +//Stock Details + static String subscriptionApi = "${base}my-subscription-page"; } diff --git a/lib/Utils/text.dart b/lib/Utils/text.dart index 028121d..78d672b 100644 --- a/lib/Utils/text.dart +++ b/lib/Utils/text.dart @@ -318,12 +318,12 @@ Widget text14W300(String text) { ); } -Widget text14W400(String text) { +Widget text14W400(String text, {Color? clr}) { return Text( text, style: TextStyle( fontSize: 14.sp, - color: Colors.white, + color: clr ?? Colors.white, fontWeight: FontWeight.w400, fontFamily: 'hiragino'), ); diff --git a/lib/controller/products_controller.dart b/lib/controller/products_controller.dart index c2bd581..848fabf 100644 --- a/lib/controller/products_controller.dart +++ b/lib/controller/products_controller.dart @@ -6,6 +6,7 @@ import 'package:intl/intl.dart'; class ProductsController extends GetxController { RxBool isLoaded = true.obs; + RxBool isUpstoxTokenNotExpired = true.obs; CallRecommendationsModel swingTradeModel = CallRecommendationsModel(); CallRecommendationsModel multibaggerModel = CallRecommendationsModel(); CallRecommendationsModel optionModel = CallRecommendationsModel(); diff --git a/lib/model/HomeModel/home_model.dart b/lib/model/HomeModel/home_model.dart index edb6696..b0ebf7c 100644 --- a/lib/model/HomeModel/home_model.dart +++ b/lib/model/HomeModel/home_model.dart @@ -10,14 +10,14 @@ class HomeModel { status = json['status']; statusCode = json['status_code']; message = json['message']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; + data = json['data'] != null ? Data.fromJson(json['data']) : null; } Map toJson() { - final Map data = new Map(); - data['status'] = this.status; - data['status_code'] = this.statusCode; - data['message'] = this.message; + final Map data = {}; + data['status'] = status; + data['status_code'] = statusCode; + data['message'] = message; if (this.data != null) { data['data'] = this.data!.toJson(); } @@ -28,65 +28,203 @@ class HomeModel { class Data { List? exploreTheUnseenActiveCalls; List? exploreTheUnseenExitedCalls; + IndexLiveData? indexLiveData; UserData? userData; List? products; ContentByteVideo? contentByteVideo; + bool? isUpstoxTokenRefreshed; Data( {this.exploreTheUnseenActiveCalls, this.exploreTheUnseenExitedCalls, this.userData, this.products, - this.contentByteVideo}); + this.contentByteVideo, + this.isUpstoxTokenRefreshed, + this.indexLiveData}); Data.fromJson(Map json) { if (json['explore_the_unseen_active_calls'] != null) { exploreTheUnseenActiveCalls = []; json['explore_the_unseen_active_calls'].forEach((v) { exploreTheUnseenActiveCalls! - .add(new ExploreTheUnseenActiveCalls.fromJson(v)); + .add(ExploreTheUnseenActiveCalls.fromJson(v)); }); } if (json['explore_the_unseen_exited_calls'] != null) { exploreTheUnseenExitedCalls = []; json['explore_the_unseen_exited_calls'].forEach((v) { exploreTheUnseenExitedCalls! - .add(new ExploreTheUnseenExitedCalls.fromJson(v)); + .add(ExploreTheUnseenExitedCalls.fromJson(v)); }); } - userData = json['user_data'] != null - ? new UserData.fromJson(json['user_data']) + indexLiveData = json['index_live_data'] != null + ? IndexLiveData.fromJson(json['index_live_data']) : null; + userData = + json['user_data'] != null ? UserData.fromJson(json['user_data']) : null; if (json['products'] != null) { products = []; json['products'].forEach((v) { - products!.add(new Products.fromJson(v)); + products!.add(Products.fromJson(v)); }); } contentByteVideo = json['content_byte_video'] != null - ? new ContentByteVideo.fromJson(json['content_byte_video']) + ? ContentByteVideo.fromJson(json['content_byte_video']) + : null; + isUpstoxTokenRefreshed = json['isUpstoxTokenRefreshed']; + } + + Map toJson() { + final Map data = {}; + if (exploreTheUnseenActiveCalls != null) { + data['explore_the_unseen_active_calls'] = + exploreTheUnseenActiveCalls!.map((v) => v.toJson()).toList(); + } + if (exploreTheUnseenExitedCalls != null) { + data['explore_the_unseen_exited_calls'] = + exploreTheUnseenExitedCalls!.map((v) => v.toJson()).toList(); + } + if (indexLiveData != null) { + data['index_live_data'] = indexLiveData!.toJson(); + } + if (userData != null) { + data['user_data'] = userData!.toJson(); + } + if (products != null) { + data['products'] = products!.map((v) => v.toJson()).toList(); + } + if (contentByteVideo != null) { + data['content_byte_video'] = contentByteVideo!.toJson(); + } + data['isUpstoxTokenRefreshed'] = isUpstoxTokenRefreshed; + return data; + } +} + +class IndexLiveData { + String? status; + Data1? data; + + IndexLiveData({this.status, this.data}); + + IndexLiveData.fromJson(Map json) { + status = json['status']; + data = json['data'] != null ? Data1.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['status'] = status; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data1 { + NSEINDEXNiftyBank? nSEINDEXNiftyBank; + NSEINDEXNiftyBank? nSEINDEXNifty50; + + Data1({this.nSEINDEXNiftyBank, this.nSEINDEXNifty50}); + + Data1.fromJson(Map json) { + nSEINDEXNiftyBank = json['NSE_INDEX:Nifty Bank'] != null + ? NSEINDEXNiftyBank.fromJson(json['NSE_INDEX:Nifty Bank']) + : null; + nSEINDEXNifty50 = json['NSE_INDEX:Nifty 50'] != null + ? NSEINDEXNiftyBank.fromJson(json['NSE_INDEX:Nifty 50']) : null; } Map toJson() { - final Map data = new Map(); - if (this.exploreTheUnseenActiveCalls != null) { - data['explore_the_unseen_active_calls'] = - this.exploreTheUnseenActiveCalls!.map((v) => v.toJson()).toList(); + final Map data = {}; + if (nSEINDEXNiftyBank != null) { + data['NSE_INDEX:Nifty Bank'] = nSEINDEXNiftyBank!.toJson(); } - if (this.exploreTheUnseenExitedCalls != null) { - data['explore_the_unseen_exited_calls'] = - this.exploreTheUnseenExitedCalls!.map((v) => v.toJson()).toList(); + if (nSEINDEXNifty50 != null) { + data['NSE_INDEX:Nifty 50'] = nSEINDEXNifty50!.toJson(); } - if (this.userData != null) { - data['user_data'] = this.userData!.toJson(); - } - if (this.products != null) { - data['products'] = this.products!.map((v) => v.toJson()).toList(); - } - if (this.contentByteVideo != null) { - data['content_byte_video'] = this.contentByteVideo!.toJson(); + return data; + } +} + +class NSEINDEXNiftyBank { + Ohlc? ohlc; + + String? timestamp; + String? instrumentToken; + String? symbol; + double? lastPrice; + + double? netChange; + + String? lastTradeTime; + + NSEINDEXNiftyBank({ + this.ohlc, + this.timestamp, + this.instrumentToken, + this.symbol, + this.lastPrice, + this.netChange, + this.lastTradeTime, + }); + + NSEINDEXNiftyBank.fromJson(Map json) { + ohlc = json['ohlc'] != null ? Ohlc.fromJson(json['ohlc']) : null; + + timestamp = json['timestamp']; + instrumentToken = json['instrument_token']; + symbol = json['symbol']; + lastPrice = json['last_price']; + + netChange = json['net_change']; + + lastTradeTime = json['last_trade_time']; + } + + Map toJson() { + final Map data = {}; + if (ohlc != null) { + data['ohlc'] = ohlc!.toJson(); } + + data['timestamp'] = timestamp; + data['instrument_token'] = instrumentToken; + data['symbol'] = symbol; + data['last_price'] = lastPrice; + + data['net_change'] = netChange; + + data['last_trade_time'] = lastTradeTime; + + return data; + } +} + +class Ohlc { + double? open; + double? high; + double? low; + double? close; + + Ohlc({this.open, this.high, this.low, this.close}); + + Ohlc.fromJson(Map json) { + open = json['open'].toDouble(); + high = json['high'].toDouble(); + low = json['low'].toDouble(); + close = json['close'].toDouble(); + } + + Map toJson() { + final Map data = {}; + data['open'] = open; + data['high'] = high; + data['low'] = low; + data['close'] = close; return data; } } @@ -146,35 +284,35 @@ class ExploreTheUnseenActiveCalls { scheduleDateTime = json['schedule_date_time']; createdAt = json['created_at']; productData = json['product_data'] != null - ? new ProductData.fromJson(json['product_data']) + ? ProductData.fromJson(json['product_data']) : null; actionData = json['action_data'] != null - ? new ActionData.fromJson(json['action_data']) + ? ActionData.fromJson(json['action_data']) : null; } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['manage_product_xid'] = this.manageProductXid; - data['recommendation_actions_xid'] = this.recommendationActionsXid; - data['stock_name'] = this.stockName; - data['instrument_key'] = this.instrumentKey; - data['stock_image'] = this.stockImage; - data['qty'] = this.qty; - data['duration'] = this.duration; - data['current_price'] = this.currentPrice; - data['buy_price'] = this.buyPrice; - data['target_price'] = this.targetPrice; - data['stop_loss'] = this.stopLoss; - data['is_send_recommendation_now'] = this.isSendRecommendationNow; - data['schedule_date_time'] = this.scheduleDateTime; - data['created_at'] = this.createdAt; - if (this.productData != null) { - data['product_data'] = this.productData!.toJson(); + final Map data = {}; + data['id'] = id; + data['manage_product_xid'] = manageProductXid; + data['recommendation_actions_xid'] = recommendationActionsXid; + data['stock_name'] = stockName; + data['instrument_key'] = instrumentKey; + data['stock_image'] = stockImage; + data['qty'] = qty; + data['duration'] = duration; + data['current_price'] = currentPrice; + data['buy_price'] = buyPrice; + data['target_price'] = targetPrice; + data['stop_loss'] = stopLoss; + data['is_send_recommendation_now'] = isSendRecommendationNow; + data['schedule_date_time'] = scheduleDateTime; + data['created_at'] = createdAt; + if (productData != null) { + data['product_data'] = productData!.toJson(); } - if (this.actionData != null) { - data['action_data'] = this.actionData!.toJson(); + if (actionData != null) { + data['action_data'] = actionData!.toJson(); } return data; } @@ -235,35 +373,35 @@ class ExploreTheUnseenExitedCalls { scheduleDateTime = json['schedule_date_time']; createdAt = json['created_at']; productData = json['product_data'] != null - ? new ProductData.fromJson(json['product_data']) + ? ProductData.fromJson(json['product_data']) : null; actionData = json['action_data'] != null - ? new ActionData.fromJson(json['action_data']) + ? ActionData.fromJson(json['action_data']) : null; } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['manage_product_xid'] = this.manageProductXid; - data['recommendation_actions_xid'] = this.recommendationActionsXid; - data['stock_name'] = this.stockName; - data['instrument_key'] = this.instrumentKey; - data['stock_image'] = this.stockImage; - data['qty'] = this.qty; - data['duration'] = this.duration; - data['current_price'] = this.currentPrice; - data['buy_price'] = this.buyPrice; - data['target_price'] = this.targetPrice; - data['stop_loss'] = this.stopLoss; - data['is_send_recommendation_now'] = this.isSendRecommendationNow; - data['schedule_date_time'] = this.scheduleDateTime; - data['created_at'] = this.createdAt; - if (this.productData != null) { - data['product_data'] = this.productData!.toJson(); + final Map data = {}; + data['id'] = id; + data['manage_product_xid'] = manageProductXid; + data['recommendation_actions_xid'] = recommendationActionsXid; + data['stock_name'] = stockName; + data['instrument_key'] = instrumentKey; + data['stock_image'] = stockImage; + data['qty'] = qty; + data['duration'] = duration; + data['current_price'] = currentPrice; + data['buy_price'] = buyPrice; + data['target_price'] = targetPrice; + data['stop_loss'] = stopLoss; + data['is_send_recommendation_now'] = isSendRecommendationNow; + data['schedule_date_time'] = scheduleDateTime; + data['created_at'] = createdAt; + if (productData != null) { + data['product_data'] = productData!.toJson(); } - if (this.actionData != null) { - data['action_data'] = this.actionData!.toJson(); + if (actionData != null) { + data['action_data'] = actionData!.toJson(); } return data; } @@ -285,11 +423,11 @@ class ProductData { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['product_name'] = this.productName; - data['is_active'] = this.isActive; - data['created_at'] = this.createdAt; + final Map data = {}; + data['id'] = id; + data['product_name'] = productName; + data['is_active'] = isActive; + data['created_at'] = createdAt; return data; } } @@ -310,11 +448,11 @@ class ActionData { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['is_active'] = this.isActive; - data['created_at'] = this.createdAt; + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['is_active'] = isActive; + data['created_at'] = createdAt; return data; } } @@ -348,14 +486,14 @@ class UserData { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['first_name'] = this.firstName; - data['last_name'] = this.lastName; - data['user_name'] = this.userName; - data['profile_photo'] = this.profilePhoto; - data['is_active'] = this.isActive; - data['created_at'] = this.createdAt; + final Map data = {}; + data['id'] = id; + data['first_name'] = firstName; + data['last_name'] = lastName; + data['user_name'] = userName; + data['profile_photo'] = profilePhoto; + data['is_active'] = isActive; + data['created_at'] = createdAt; return data; } } @@ -374,10 +512,10 @@ class Products { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['title'] = this.title; - data['created_at'] = this.createdAt; + final Map data = {}; + data['id'] = id; + data['title'] = title; + data['created_at'] = createdAt; return data; } } @@ -423,18 +561,18 @@ class ContentByteVideo { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['content_type'] = this.contentType; - data['title'] = this.title; - data['description'] = this.description; - data['tags'] = this.tags; - data['file'] = this.file; - data['category_id'] = this.categoryId; - data['image'] = this.image; - data['is_active'] = this.isActive; - data['created_at'] = this.createdAt; - data['link'] = this.link; + final Map data = {}; + data['id'] = id; + data['content_type'] = contentType; + data['title'] = title; + data['description'] = description; + data['tags'] = tags; + data['file'] = file; + data['category_id'] = categoryId; + data['image'] = image; + data['is_active'] = isActive; + data['created_at'] = createdAt; + data['link'] = link; return data; } } diff --git a/lib/view/MainScreen/HomeScreen.dart b/lib/view/MainScreen/HomeScreen.dart index 2e1bed0..47cf7db 100644 --- a/lib/view/MainScreen/HomeScreen.dart +++ b/lib/view/MainScreen/HomeScreen.dart @@ -4,14 +4,11 @@ import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:gap/gap.dart'; import 'package:get/get.dart'; -import 'package:glassmorphism/glassmorphism.dart'; import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart'; -import 'package:traderscircuit/Utils/Common/CommonTabBar.dart'; import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart'; import 'package:traderscircuit/Utils/Common/sized_box.dart'; import 'package:traderscircuit/Utils/text.dart'; @@ -58,11 +55,21 @@ class _HomeScreenState extends State { }); HomeApi().getHomeData().then((value) { homeModel = HomeModel.fromJson(value.data); + productsController.isUpstoxTokenNotExpired.value = + homeModel.data!.isUpstoxTokenRefreshed!; isApiCalling.value = false; }); super.initState(); } + String calculatePercentageChange(double openPrice, double currentPrice) { + final percentageChange = ((currentPrice - openPrice) / openPrice) * 100; + + log(percentageChange.toStringAsFixed(2)); + + return percentageChange.toStringAsFixed(2); + } + @override Widget build(BuildContext context) { return WillPopScope( @@ -145,31 +152,83 @@ class _HomeScreenState extends State { fontFamily: 'hiragino', fontWeight: FontWeight.w500), ), - sizedBoxHeight(25.h), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - commoncontainer( - width: 195.w, - text: 'NIFTY', - amount: '22,286.95', - rate: '+304.15 (+1.38%)'), - sizedBoxWidth(10.w), - commoncontainer( - width: 240.w, - text: 'BANKNIFTY', - amount: '22,286.95', - rate: '+896.10 (+1.94%)'), - ], - ), - ), - sizedBoxHeight(30.h), - Container( - width: double.infinity, - height: 1.h, - color: const Color(0xFF3A3A3A), - ), + !homeModel.data!.isUpstoxTokenRefreshed! + ? const SizedBox() + : sizedBoxHeight(25.h), + !homeModel.data!.isUpstoxTokenRefreshed! + ? const SizedBox() + : SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + commoncontainer( + width: 250.w, + text: homeModel + .data! + .indexLiveData! + .data! + .nSEINDEXNifty50! + .instrumentToken! + .split("NSE_INDEX|")[1], + amount: homeModel.data!.indexLiveData! + .data!.nSEINDEXNifty50!.lastPrice! + .toString(), + rate: homeModel.data!.indexLiveData! + .data!.nSEINDEXNifty50!.netChange + .toString(), + percentageChange: + calculatePercentageChange( + homeModel.data!.indexLiveData!.data! + .nSEINDEXNifty50!.ohlc!.open!, + homeModel.data!.indexLiveData!.data! + .nSEINDEXNifty50!.lastPrice!, + ), + ), + sizedBoxWidth(10.w), + commoncontainer( + width: 250.w, + text: homeModel + .data! + .indexLiveData! + .data! + .nSEINDEXNiftyBank! + .instrumentToken! + .split("NSE_INDEX|")[1], + amount: homeModel + .data! + .indexLiveData! + .data! + .nSEINDEXNiftyBank! + .lastPrice! + .toString(), + rate: homeModel + .data! + .indexLiveData! + .data! + .nSEINDEXNiftyBank! + .netChange + .toString(), + percentageChange: + calculatePercentageChange( + homeModel.data!.indexLiveData!.data! + .nSEINDEXNiftyBank!.ohlc!.open!, + homeModel.data!.indexLiveData!.data! + .nSEINDEXNiftyBank!.lastPrice!, + ), + ), + ], + ), + ), + !homeModel.data!.isUpstoxTokenRefreshed! + ? const SizedBox() + : sizedBoxHeight(30.h), + !homeModel.data!.isUpstoxTokenRefreshed! + ? const SizedBox() + : Container( + width: double.infinity, + height: 1.h, + color: const Color(0xFF3A3A3A), + ), sizedBoxHeight(30.h), text22W500('View our products'), sizedBoxHeight(30.h), @@ -327,7 +386,7 @@ class _HomeScreenState extends State { width: 105, height: 35, decoration: ShapeDecoration( - color: Color(0xFF0093FF), + color: const Color(0xFF0093FF), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5)), @@ -620,7 +679,7 @@ Widget cardcallWidget( GestureDetector( onTap: () { log("RUNNING"); - Get.to(ExploreUnseen()); + Get.to(const ExploreUnseen()); }, child: Container( height: 52, @@ -691,11 +750,13 @@ Widget ProductWidget({ ); } -Widget commoncontainer( - {required String text, - required String amount, - required String rate, - required double width}) { +Widget commoncontainer({ + required String text, + required String amount, + required String rate, + required double width, + required String percentageChange, +}) { return Container( height: 83, decoration: ShapeDecoration( @@ -716,15 +777,32 @@ Widget commoncontainer( sizedBoxWidth(8.w), text16W600(amount), sizedBoxWidth(8.w), - SvgPicture.asset( - 'assets/images/svg/Line 587.svg', - height: 15.h, - width: 15.w, - ), + rate.contains("-") + ? SvgPicture.asset( + 'assets/images/svg/Line 587.svg', + height: 15.h, + width: 15.w, + ) + : rate == "0.0" + ? const SizedBox() + : SvgPicture.asset( + 'assets/images/svg/up_arrow.svg', + height: 15.h, + width: 15.w, + ), ], ), sizedBoxHeight(8.w), - text14W400_00FF19(rate) + text14W400( + rate.contains("-") + ? "$rate ($percentageChange%)" + : "+$rate ($percentageChange%)", + clr: rate.contains("-") + ? const Color(0xFFFF0000) + : rate == "0.0" + ? Colors.grey + : const Color(0xFF00FF19), + ), ], ), ), diff --git a/lib/view/MainScreen/stockDetails/stock_details_screen.dart b/lib/view/MainScreen/stockDetails/stock_details_screen.dart index 90254bc..f3c1bb7 100644 --- a/lib/view/MainScreen/stockDetails/stock_details_screen.dart +++ b/lib/view/MainScreen/stockDetails/stock_details_screen.dart @@ -6,13 +6,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:gap/gap.dart'; import 'package:get/get.dart' hide FormData; -import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/Utils/utils.dart'; +import 'package:traderscircuit/controller/products_controller.dart'; import 'package:traderscircuit/model/StockDetailsModel/stock_details_model.dart'; import 'package:traderscircuit/view_model/StockDetailsApi/stock_details_api.dart'; -import 'dart:math'; import '../../../Utils/Common/CommonAppBar.dart'; import '../../onBoarding/splashScreen1.dart'; @@ -30,68 +29,76 @@ class _StockDetailsScreenState extends State { String percentageDifference = ""; String netChange = ""; + ProductsController productsController = Get.put(ProductsController()); + @override void initState() { dv.log(instrumentName); - StockDetailsApi() - .getStockDetails( - FormData.fromMap({"upstox_instrument_key": instrumentName})) - .then((value) { - final Map data = value.data; + if (productsController.isUpstoxTokenNotExpired.value) { + StockDetailsApi() + .getStockDetails( + FormData.fromMap({"upstox_instrument_key": instrumentName})) + .then((value) { + final Map data = value.data; - Map data1 = data["data"]['stock_data']['data']; - String dynamicKey = data1.keys.first; - // Access nested data using dynamic key - Map dynamicData = data1[dynamicKey]; + Map data1 = data["data"]['stock_data']['data']; + String dynamicKey = data1.keys.first; + // Access nested data using dynamic key + Map dynamicData = data1[dynamicKey]; - List? candles = []; + List? candles = []; - for (var a in data["data"]['candle_stick']["data"]["candles"]) { - candles.add(Candles( - timestamp: a[0], - open: a[1].toDouble(), - high: a[2].toDouble(), - low: a[3].toDouble(), - close: a[4].toDouble(), - volume: a[5].toInt(), - openInterest: a[6], - )); - } - candles = candles.reversed.toList(); - stockDetailsModel = StockDetailsModel( - status: data["status"], - message: data["message"], - statusCode: data["status_code"], - data: Data( - stockData: StockInfo( - ohlc: Ohlc.fromJson(dynamicData['ohlc']), - averagePrice: dynamicData['average_price'].toDouble(), - instrumentToken: dynamicData['instrument_token'], - lastPrice: dynamicData['last_price'].toDouble(), - lastTradeTime: dynamicData['last_trade_time'], - lowerCircuitLimit: - dynamicData['lower_circuit_limit'].toDouble(), - netChange: dynamicData['net_change'].toDouble(), - oi: dynamicData['oi'], - oiDayHigh: dynamicData['oi_day_high'], - oiDayLow: dynamicData['oi_day_low'], - symbol: dynamicData['symbol'], - timestamp: dynamicData['timestamp'], - totalBuyQuantity: dynamicData['total_buy_quantity'], - totalSellQuantity: dynamicData['total_sell_quantity'], - upperCircuitLimit: dynamicData['upper_circuit_limit'], - volume: dynamicData['volume'], - ), - candleStick: CandleStick(candles: candles), - optionChain: OptionChain.fromJson(data["data"]['option_chain']))); + for (var a in data["data"]['candle_stick']["data"]["candles"]) { + candles.add(Candles( + timestamp: a[0], + open: a[1].toDouble(), + high: a[2].toDouble(), + low: a[3].toDouble(), + close: a[4].toDouble(), + volume: a[5].toInt(), + openInterest: a[6], + )); + } + candles = candles.reversed.toList(); + stockDetailsModel = StockDetailsModel( + status: data["status"], + message: data["message"], + statusCode: data["status_code"], + data: Data( + stockData: StockInfo( + ohlc: Ohlc.fromJson(dynamicData['ohlc']), + averagePrice: dynamicData['average_price'].toDouble(), + instrumentToken: dynamicData['instrument_token'], + lastPrice: dynamicData['last_price'].toDouble(), + lastTradeTime: dynamicData['last_trade_time'], + lowerCircuitLimit: + dynamicData['lower_circuit_limit'].toDouble(), + netChange: dynamicData['net_change'].toDouble(), + oi: dynamicData['oi'], + oiDayHigh: dynamicData['oi_day_high'], + oiDayLow: dynamicData['oi_day_low'], + symbol: dynamicData['symbol'], + timestamp: dynamicData['timestamp'], + totalBuyQuantity: dynamicData['total_buy_quantity'], + totalSellQuantity: dynamicData['total_sell_quantity'], + upperCircuitLimit: dynamicData['upper_circuit_limit'], + volume: dynamicData['volume'], + ), + candleStick: CandleStick(candles: candles), + optionChain: + OptionChain.fromJson(data["data"]['option_chain']))); - netChange = dynamicData['net_change'].toString(); - _calculatePercentageChange( - stockDetailsModel!.data!.stockData!.ohlc!.open!, - stockDetailsModel!.data!.stockData!.lastPrice!); + netChange = dynamicData['net_change'].toString(); + _calculatePercentageChange( + stockDetailsModel!.data!.stockData!.ohlc!.open!, + stockDetailsModel!.data!.stockData!.lastPrice!); + isLoading.value = false; + }); + } else { isLoading.value = false; - }); + } + super.initState(); } @@ -110,418 +117,453 @@ class _StockDetailsScreenState extends State { appBar: const CommonAppbar( titleTxt: "", ), - body: Obx(() => RefreshIndicator( - color: const Color(0xFF0093FF), - onRefresh: () async { - Future.delayed(const Duration(seconds: 1), () { - isLoading.value = true; - StockDetailsApi() - .getStockDetails(FormData.fromMap( - {"upstox_instrument_key": instrumentName})) - .then((value) { - final Map data = value.data; - - Map data1 = - data["data"]['stock_data']['data']; - String dynamicKey = data1.keys.first; - // Access nested data using dynamic key - Map dynamicData = data1[dynamicKey]; - - List? candles = []; - - for (var a in data["data"]['candle_stick']["data"] - ["candles"]) { - candles.add(Candles( - timestamp: a[0], - open: a[1].toDouble(), - high: a[2].toDouble(), - low: a[3].toDouble(), - close: a[4].toDouble(), - volume: a[5].toInt(), - openInterest: a[6], - )); - } - - candles = candles.reversed.toList(); - stockDetailsModel = StockDetailsModel( - status: data["status"], - message: data["message"], - statusCode: data["status_code"], - data: Data( - stockData: StockInfo( - ohlc: Ohlc.fromJson(dynamicData['ohlc']), - averagePrice: - dynamicData['average_price'].toDouble(), - instrumentToken: dynamicData['instrument_token'], - lastPrice: dynamicData['last_price'].toDouble(), - lastTradeTime: dynamicData['last_trade_time'], - lowerCircuitLimit: - dynamicData['lower_circuit_limit'].toDouble(), - netChange: dynamicData['net_change'].toDouble(), - oi: dynamicData['oi'], - oiDayHigh: dynamicData['oi_day_high'], - oiDayLow: dynamicData['oi_day_low'], - symbol: dynamicData['symbol'], - timestamp: dynamicData['timestamp'], - totalBuyQuantity: dynamicData['total_buy_quantity'], - totalSellQuantity: - dynamicData['total_sell_quantity'], - upperCircuitLimit: - dynamicData['upper_circuit_limit'], - volume: dynamicData['volume'], - ), - candleStick: CandleStick(candles: candles), - optionChain: OptionChain.fromJson( - data["data"]['option_chain']))); - - netChange = dynamicData['net_change'].toString(); - _calculatePercentageChange( - stockDetailsModel!.data!.stockData!.ohlc!.open!, - stockDetailsModel!.data!.stockData!.lastPrice!); - isLoading.value = false; - }); - }); - }, - child: Stack(children: [ + body: Obx(() => !productsController.isUpstoxTokenNotExpired.value + ? Stack(children: [ const CommonBlurLeft(), const CommonBlurRight(), - isLoading.value - ? const Center( - child: CircularProgressIndicator( - color: Color(0xFF0093FF), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Image.asset( + "assets/images/png/under_maintenance.png", + width: 200, + height: 220, ), - ) - : Padding( - padding: const EdgeInsets.all(15.0), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W700( - stockDetailsModel!.data!.stockData!.symbol!), - const Gap(14), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - text25W600( - "₹${stockDetailsModel!.data!.stockData!.lastPrice!.toString()}"), - Container( - width: 145, - height: 40, - decoration: ShapeDecoration( - color: const Color(0xFF0093FF), - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(5)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text22W600("Oops!"), + const Gap(5), + text16W400("Under Maintenance", clr: Colors.grey) + ], + ) + ], + ), + const Gap(150), + ], + ) + ]) + : RefreshIndicator( + color: const Color(0xFF0093FF), + onRefresh: () async { + Future.delayed(const Duration(seconds: 1), () { + isLoading.value = true; + StockDetailsApi() + .getStockDetails(FormData.fromMap( + {"upstox_instrument_key": instrumentName})) + .then((value) { + final Map data = value.data; + + Map data1 = + data["data"]['stock_data']['data']; + String dynamicKey = data1.keys.first; + // Access nested data using dynamic key + Map dynamicData = data1[dynamicKey]; + + List? candles = []; + + for (var a in data["data"]['candle_stick']["data"] + ["candles"]) { + candles.add(Candles( + timestamp: a[0], + open: a[1].toDouble(), + high: a[2].toDouble(), + low: a[3].toDouble(), + close: a[4].toDouble(), + volume: a[5].toInt(), + openInterest: a[6], + )); + } + + candles = candles.reversed.toList(); + stockDetailsModel = StockDetailsModel( + status: data["status"], + message: data["message"], + statusCode: data["status_code"], + data: Data( + stockData: StockInfo( + ohlc: Ohlc.fromJson(dynamicData['ohlc']), + averagePrice: + dynamicData['average_price'].toDouble(), + instrumentToken: dynamicData['instrument_token'], + lastPrice: dynamicData['last_price'].toDouble(), + lastTradeTime: dynamicData['last_trade_time'], + lowerCircuitLimit: + dynamicData['lower_circuit_limit'].toDouble(), + netChange: dynamicData['net_change'].toDouble(), + oi: dynamicData['oi'], + oiDayHigh: dynamicData['oi_day_high'], + oiDayLow: dynamicData['oi_day_low'], + symbol: dynamicData['symbol'], + timestamp: dynamicData['timestamp'], + totalBuyQuantity: + dynamicData['total_buy_quantity'], + totalSellQuantity: + dynamicData['total_sell_quantity'], + upperCircuitLimit: + dynamicData['upper_circuit_limit'], + volume: dynamicData['volume'], + ), + candleStick: CandleStick(candles: candles), + optionChain: OptionChain.fromJson( + data["data"]['option_chain']))); + + netChange = dynamicData['net_change'].toString(); + _calculatePercentageChange( + stockDetailsModel!.data!.stockData!.ohlc!.open!, + stockDetailsModel!.data!.stockData!.lastPrice!); + isLoading.value = false; + }); + }); + }, + child: Stack(children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + isLoading.value + ? const Center( + child: CircularProgressIndicator( + color: Color(0xFF0093FF), + ), + ) + : Padding( + padding: const EdgeInsets.all(15.0), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16W700( + stockDetailsModel!.data!.stockData!.symbol!), + const Gap(14), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + text25W600( + "₹${stockDetailsModel!.data!.stockData!.lastPrice!.toString()}"), + Container( + width: 145, + height: 40, + decoration: ShapeDecoration( + color: const Color(0xFF0093FF), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(5)), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + "assets/images/svg/option_chain_icon.svg"), + const Gap(5), + text12W600("Option Chain"), + ], + )), + ], + ), + const Gap(8), + Row( + children: [ + text12W400( + netChange.contains("-") + ? "${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)" + : "+${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)", + clr: netChange.contains("-") + ? Colors.redAccent + : netChange == "0.0" + ? Colors.grey + : Colors.greenAccent), + text12W400(" Today"), + ], + ), + const Gap(55), + // Container( + // // margin: const EdgeInsets.symmetric(horizontal: 8), + // width: Get.width, + // height: 220, + // color: Colors.transparent, + // child: SfCartesianChart( + // // palette: [ + // // const Color( + // // 0xFF0093FF, + // // ).withOpacity(.01), + // // const Color( + // // 0xFF0093FF, + // // ).withOpacity(.3), + // // ], + + // tooltipBehavior: _tooltipBehavior, + // plotAreaBorderWidth: 0, + // primaryYAxis: NumericAxis(isVisible: false), + // // Initialize category axis + // primaryXAxis: CategoryAxis(isVisible: false), + // series: >[ + // LineSeries( + // // Bind data source + // dataSource: salesDataV, + // color: Color(0xFF0093FF), + // enableTooltip: true, + // xValueMapper: (SalesData sales, _) => + // sales.year, + // yValueMapper: (SalesData sales, _) => + // sales.sales) + // ]), + // ), + + Container( + margin: + const EdgeInsets.symmetric(horizontal: 15), + width: Get.width, + height: 220, + color: Colors.transparent, + child: LineChart( + LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + fitInsideHorizontally: true, + fitInsideVertically: true, + + tooltipRoundedRadius: + 9, // maxContentWidth: 150, + getTooltipItems: ( + List touchedBarSpots, + ) { + return touchedBarSpots.map((barSpot) { + return LineTooltipItem( + "₹ ${Utils.removeDecimal( + Utils.extractPriceFromGraph( + stockDetailsModel! + .data! + .candleStick! + .candles!)[ + barSpot.x.toInt()] + .toStringAsFixed(2), + )}", + const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + // children: [ + // const TextSpan(text: "\n"), + // TextSpan( + // text: Utils + // .extractTimeFromGraph( + // stockDetailsModel! + // .data! + // .candleStick! + ); + }).toList(); + }, + ), ), - child: Row( - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - SvgPicture.asset( - "assets/images/svg/option_chain_icon.svg"), - const Gap(5), - text12W600("Option Chain"), - ], - )), - ], - ), - const Gap(8), - Row( - children: [ - text12W400( - netChange.contains("-") - ? "${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)" - : "+${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)", - clr: netChange.contains("-") - ? Colors.redAccent - : netChange == "0.0" - ? Colors.grey - : Colors.greenAccent), - text12W400(" Today"), - ], - ), - const Gap(55), - // Container( - // // margin: const EdgeInsets.symmetric(horizontal: 8), - // width: Get.width, - // height: 220, - // color: Colors.transparent, - // child: SfCartesianChart( - // // palette: [ - // // const Color( - // // 0xFF0093FF, - // // ).withOpacity(.01), - // // const Color( - // // 0xFF0093FF, - // // ).withOpacity(.3), - // // ], - - // tooltipBehavior: _tooltipBehavior, - // plotAreaBorderWidth: 0, - // primaryYAxis: NumericAxis(isVisible: false), - // // Initialize category axis - // primaryXAxis: CategoryAxis(isVisible: false), - // series: >[ - // LineSeries( - // // Bind data source - // dataSource: salesDataV, - // color: Color(0xFF0093FF), - // enableTooltip: true, - // xValueMapper: (SalesData sales, _) => - // sales.year, - // yValueMapper: (SalesData sales, _) => - // sales.sales) - // ]), - // ), - - Container( - margin: - const EdgeInsets.symmetric(horizontal: 15), - width: Get.width, - height: 220, - color: Colors.transparent, - child: LineChart( - LineChartData( - lineTouchData: LineTouchData( - touchTooltipData: LineTouchTooltipData( - fitInsideHorizontally: true, - fitInsideVertically: true, - - tooltipRoundedRadius: - 9, // maxContentWidth: 150, - getTooltipItems: ( - List touchedBarSpots, - ) { - return touchedBarSpots.map((barSpot) { - return LineTooltipItem( - "₹ ${Utils.removeDecimal( - Utils.extractPriceFromGraph( - stockDetailsModel! - .data! - .candleStick! - .candles!)[ - barSpot.x.toInt()] - .toStringAsFixed(2), - )}", - const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w700, - ), - // children: [ - // const TextSpan(text: "\n"), - // TextSpan( - // text: Utils - // .extractTimeFromGraph( - // stockDetailsModel! - // .data! - // .candleStick! - // .candles!)[barSpot - // .x - // .toInt()]) - // ] - ); - }).toList(); + gridData: FlGridData( + show: true, + drawVerticalLine: false, + drawHorizontalLine: false, + horizontalInterval: 4, + getDrawingHorizontalLine: (value) { + return const FlLine( + color: Color( + 0xff37434d, + ), + strokeWidth: 1, + ); + }, + getDrawingVerticalLine: (value) { + return const FlLine( + color: Color( + 0xff0093FF, + ), + strokeWidth: 1, + ); }, ), - ), - gridData: FlGridData( - show: true, - drawVerticalLine: false, - drawHorizontalLine: false, - horizontalInterval: 4, - getDrawingHorizontalLine: (value) { - return const FlLine( - color: Color( - 0xff37434d, - ), - strokeWidth: 1, - ); - }, - getDrawingVerticalLine: (value) { - return const FlLine( - color: Color( - 0xff0093FF, - ), - strokeWidth: 1, - ); - }, - ), - titlesData: const FlTitlesData( - show: false, - ), - borderData: FlBorderData( - show: false, - ), - // minX: 0, - // maxX: (stockDetailsModel! - // .data!.candleStick!.candles!.length - // .toDouble()) - - // 1, - // minY: Utils.extractPriceFromGraph( - // stockDetailsModel! - // .data!.candleStick!.candles!) - // .reduce(min) - // .toDouble(), - // maxY: Utils.extractPriceFromGraph( - // stockDetailsModel! - // .data!.candleStick!.candles!) - // .reduce(max) - // .toDouble(), - lineBarsData: [ - LineChartBarData( - color: const Color(0xFF0093FF), - spots: listData( - Utils.extractPriceFromGraph( - stockDetailsModel! - .data!.candleStick!.candles!), - ), - barWidth: 1.3, - isStrokeCapRound: true, - dotData: const FlDotData( - show: false, - ), - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient( - colors: [ - const Color( - 0xFF0093FF, - ).withOpacity(.01), - const Color( - 0xFF0093FF, - ).withOpacity(.3), - ], - )), + titlesData: const FlTitlesData( + show: false, ), - ], + borderData: FlBorderData( + show: false, + ), + // minX: 0, + // maxX: (stockDetailsModel! + // .data!.candleStick!.candles!.length + // .toDouble()) - + // 1, + // minY: Utils.extractPriceFromGraph( + // stockDetailsModel! + // .data!.candleStick!.candles!) + // .reduce(min) + // .toDouble(), + // maxY: Utils.extractPriceFromGraph( + // stockDetailsModel! + // .data!.candleStick!.candles!) + // .reduce(max) + // .toDouble(), + lineBarsData: [ + LineChartBarData( + color: const Color(0xFF0093FF), + spots: listData( + Utils.extractPriceFromGraph( + stockDetailsModel! + .data!.candleStick!.candles!), + ), + barWidth: 1.3, + isStrokeCapRound: true, + dotData: const FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + const Color( + 0xFF0093FF, + ).withOpacity(.01), + const Color( + 0xFF0093FF, + ).withOpacity(.3), + ], + )), + ), + ], + ), + curve: Curves.linear, + duration: const Duration(milliseconds: 150), ), - curve: Curves.linear, - duration: const Duration(milliseconds: 150), ), - ), - const Gap(20), - text18W400("Overview"), - const Gap(15), - text20W400("Performance"), - const Gap(22), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Today’s Low', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.low! - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - text16W400('Today’s High', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.high! - .toString(), - ) - ], - ) - ], - ), - const Gap(40), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Open price', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.ohlc!.open - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Prev. Close', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel!.data!.candleStick! - .candles!.last.close - .toString(), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Volume', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel!.data!.stockData!.volume - .toString(), - ) - ], - ) - ], - ), - const Gap(25), - Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Lower Circuit', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.lowerCircuitLimit - .toString(), - ) - ], - ), - const Gap(25), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16W400('Upper Circuit', - clr: const Color(0xFF979797)), - const Gap(5), - text16W500( - stockDetailsModel! - .data!.stockData!.upperCircuitLimit - .toString(), - ) - ], - ) - ], - ), - const Gap(25), - ], + const Gap(20), + text18W400("Overview"), + const Gap(15), + text20W400("Performance"), + const Gap(22), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Today’s Low', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.low! + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + text16W400('Today’s High', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.high! + .toString(), + ) + ], + ) + ], + ), + const Gap(40), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Open price', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.ohlc!.open + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Prev. Close', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel!.data!.candleStick! + .candles!.last.close + .toString(), + ) + ], + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Volume', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.volume + .toString(), + ) + ], + ) + ], + ), + const Gap(25), + Row( + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Lower Circuit', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.lowerCircuitLimit + .toString(), + ) + ], + ), + const Gap(25), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16W400('Upper Circuit', + clr: const Color(0xFF979797)), + const Gap(5), + text16W500( + stockDetailsModel! + .data!.stockData!.upperCircuitLimit + .toString(), + ) + ], + ) + ], + ), + const Gap(25), + ], + ), ), ), - ), - ]), - )), + ]), + )), ); } } diff --git a/lib/view/Sidemenu/Sidemenu.dart b/lib/view/Sidemenu/Sidemenu.dart index aa7181a..0613d6e 100644 --- a/lib/view/Sidemenu/Sidemenu.dart +++ b/lib/view/Sidemenu/Sidemenu.dart @@ -10,6 +10,8 @@ import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view_model/ProfileAPI/GetProfileApi.dart'; +import 'webview_subscription.dart'; + class SideMenu extends StatefulWidget { const SideMenu({super.key}); @@ -167,10 +169,12 @@ class _SideMenuState extends State { child: Center(child: text14W500_black('Upgrade')), ), selected: true, - onTap: () { - setState(() { - // Get.toNamed(RouteName.privacypolicy); - }); + onTap: () async { + SharedPreferences prefs = + await SharedPreferences.getInstance(); + + Get.to(WebViewSubscription( + token: prefs.getString('accessToken').toString())); }, ), Container( diff --git a/lib/view/Sidemenu/webview_subscription.dart b/lib/view/Sidemenu/webview_subscription.dart new file mode 100644 index 0000000..9e5b850 --- /dev/null +++ b/lib/view/Sidemenu/webview_subscription.dart @@ -0,0 +1,115 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/api_urls.dart'; + +class WebViewSubscription extends StatefulWidget { + WebViewSubscription({ + super.key, + required this.token, + }); + String token; + + @override + State createState() => _WebViewSubscriptionState(); +} + +class _WebViewSubscriptionState extends State { + final GlobalKey webViewKey = GlobalKey(); + + @override + void initState() { + //getData(); + super.initState(); + } + + InAppWebViewController? webViewController; + InAppWebViewController? webViewPopupController; + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + final controller = webViewController; + if (controller != null) { + if (await controller.canGoBack()) { + Get.back(result: true); + + return false; + } + } + Get.back(result: true); + return false; + }, + child: Scaffold( + body: InAppWebView( + key: webViewKey, + initialSettings: InAppWebViewSettings( + allowsBackForwardNavigationGestures: true, + supportMultipleWindows: true, + javaScriptCanOpenWindowsAutomatically: true, + javaScriptEnabled: true, + // useOnDownloadStart: true, + // useOnLoadResource: true, + // preferredContentMode: UserPreferredContentMode.MOBILE, + // useShouldOverrideUrlLoading: true, + // mediaPlaybackRequiresUserGesture: true, + // allowFileAccessFromFileURLs: true, + // allowUniversalAccessFromFileURLs: true + ), + onLoadStart: (controller, Uri? uri) { + print("Load Started: $uri"); + }, + onCreateWindow: (controller, createWindowRequest) async { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: SizedBox( + width: MediaQuery.of(context).size.width, + height: 400, + child: InAppWebView( + windowId: createWindowRequest.windowId, + initialSettings: InAppWebViewSettings( + allowsBackForwardNavigationGestures: true, + supportMultipleWindows: true, + javaScriptCanOpenWindowsAutomatically: true, + javaScriptEnabled: true, + useOnDownloadStart: true, + useOnLoadResource: true, + preferredContentMode: UserPreferredContentMode.MOBILE, + // useShouldOverrideUrlLoading: true, + mediaPlaybackRequiresUserGesture: true, + allowFileAccessFromFileURLs: true, + allowUniversalAccessFromFileURLs: true), + onWebViewCreated: (InAppWebViewController controller) { + webViewPopupController = controller; + }, + onLoadStart: + (InAppWebViewController controller, Uri? url) { + print("onLoadStart popup $url"); + }, + onLoadStop: + (InAppWebViewController controller, Uri? url) { + print("onLoadStop popup $url"); + }, + ), + ), + ); + }, + ); + + return true; + }, + initialUrlRequest: URLRequest( + url: WebUri( + "https://tradercircuit.betadelivery.com/my-subscription-page"), + headers: { + "access-token": widget.token, + }), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 3ff554c..cdbb904 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -374,6 +374,62 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0-beta.2" + flutter_inappwebview: + dependency: "direct main" + description: + name: flutter_inappwebview + sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: d247f6ed417f1f8c364612fa05a2ecba7f775c8d0c044c1d3b9ee33a6515c421 + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07 + url: "https://pub.dev" + source: hosted + version: "1.0.8" flutter_isolate: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4cf34ae..1e1c805 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: permission_handler: ^11.3.1 fl_chart: ^0.68.0 syncfusion_flutter_charts: ^21.2.4 + flutter_inappwebview: ^6.0.0 dev_dependencies: flutter_test: