From d737d74d78905c240eef66bb1f5b0e8387a08413 Mon Sep 17 00:00:00 2001 From: jayesh Date: Tue, 18 Jun 2024 10:36:24 +0530 Subject: [PATCH] small case integration --- android/app/src/main/AndroidManifest.xml | 4 +- lib/Utils/api_urls.dart | 2 - lib/main.dart | 8 +- lib/model/HomeModel/home_model.dart | 38 +- .../SmallCaseModel/broker_account_model.dart | 90 +- lib/resources/routes/routes.dart | 18 +- lib/view/MainScreen/Portfolio/Holdings.dart | 711 ---------- .../MainScreen/Portfolio/PortfolioEmpty.dart | 1212 ++++++++++++----- .../SmallCaseApi/smallcase_api_methods.dart | 144 +- pubspec.lock | 304 ++--- 10 files changed, 1248 insertions(+), 1283 deletions(-) delete mode 100644 lib/view/MainScreen/Portfolio/Holdings.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 045a898..429bd5e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -48,7 +48,7 @@ @@ -61,7 +61,7 @@ diff --git a/lib/Utils/api_urls.dart b/lib/Utils/api_urls.dart index 7e0f3dc..5a94d29 100644 --- a/lib/Utils/api_urls.dart +++ b/lib/Utils/api_urls.dart @@ -1,8 +1,6 @@ class ApiUrls { // PIE BASE URL FOR SMALL CASE --> NEED TO BE UPDATED - static const String pieBase = "https://app.piadvisors.in/"; - //Base URL static const base = "https://tradercircuit.betadelivery.com/api/"; diff --git a/lib/main.dart b/lib/main.dart index e59c512..c91f1f5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'dart:ui'; import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -10,14 +11,13 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_branch_sdk/flutter_branch_sdk.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:onesignal_flutter/onesignal_flutter.dart'; +import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:traderscircuit/Utils/utils.dart'; import 'package:traderscircuit/firebase_options.dart'; -import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; -import 'package:firebase_core/firebase_core.dart'; import 'package:traderscircuit/resources/routes/routes.dart'; -import 'package:onesignal_flutter/onesignal_flutter.dart'; import 'view_model/LoginPage/Loginbloc.dart'; import 'view_model/SendOtp/sendOtpbloc.dart'; @@ -53,7 +53,7 @@ Future main() async { //smallcase ScgatewayFlutterPlugin.setConfigEnvironment( GatewayEnvironment.PRODUCTION, - 'pi-advisors', + 'traderscircuit', false, [], ); diff --git a/lib/model/HomeModel/home_model.dart b/lib/model/HomeModel/home_model.dart index bccb503..d508d84 100644 --- a/lib/model/HomeModel/home_model.dart +++ b/lib/model/HomeModel/home_model.dart @@ -399,8 +399,8 @@ class NSEINDEXNiftyBank { double? lastPrice; String? volume; String? averagePrice; - Null? oi; - dynamic? netChange; + void oi; + dynamic netChange; String? totalBuyQuantity; String? totalSellQuantity; String? lowerCircuitLimit; @@ -433,7 +433,7 @@ class NSEINDEXNiftyBank { timestamp = json['timestamp']; instrumentToken = json['instrument_token']; symbol = json['symbol']; - lastPrice = json['last_price']; + lastPrice = _parseJsonToDouble(json['last_price']); volume = json['volume']; averagePrice = json['average_price']; oi = json['oi']; @@ -459,7 +459,6 @@ class NSEINDEXNiftyBank { data['last_price'] = lastPrice; data['volume'] = volume; data['average_price'] = averagePrice; - data['oi'] = oi; data['net_change'] = netChange; data['total_buy_quantity'] = totalBuyQuantity; data['total_sell_quantity'] = totalSellQuantity; @@ -495,16 +494,6 @@ class Ohlc { data['close'] = close; return data; } - - double? _parseJsonToDouble(dynamic value) { - if (value is int) { - return value.toDouble(); - } else if (value is double) { - return value; - } else { - return null; // Or handle it in another appropriate way - } - } } class NSEINDEXNifty50 { @@ -514,9 +503,8 @@ class NSEINDEXNifty50 { String? instrumentToken; String? symbol; double? lastPrice; - Null? volume; - Null? averagePrice; - Null? oi; + double? volume; + double? averagePrice; double? netChange; String? totalBuyQuantity; String? totalSellQuantity; @@ -534,7 +522,6 @@ class NSEINDEXNifty50 { this.lastPrice, this.volume, this.averagePrice, - this.oi, this.netChange, this.totalBuyQuantity, this.totalSellQuantity, @@ -550,10 +537,9 @@ class NSEINDEXNifty50 { timestamp = json['timestamp']; instrumentToken = json['instrument_token']; symbol = json['symbol']; - lastPrice = json['last_price']; + lastPrice = json['last_price'].toDouble(); volume = json['volume']; averagePrice = json['average_price']; - oi = json['oi']; netChange = json['net_change']; totalBuyQuantity = json['total_buy_quantity']; totalSellQuantity = json['total_sell_quantity']; @@ -576,7 +562,7 @@ class NSEINDEXNifty50 { data['last_price'] = lastPrice; data['volume'] = volume; data['average_price'] = averagePrice; - data['oi'] = oi; + data['net_change'] = netChange; data['total_buy_quantity'] = totalBuyQuantity; data['total_sell_quantity'] = totalSellQuantity; @@ -708,3 +694,13 @@ class ContentByteVideo { return data; } } + +double? _parseJsonToDouble(dynamic value) { + if (value is int) { + return value.toDouble(); + } else if (value is double) { + return value; + } else { + return null; // Or handle it in another appropriate way + } +} diff --git a/lib/model/SmallCaseModel/broker_account_model.dart b/lib/model/SmallCaseModel/broker_account_model.dart index 16b1a4e..7f2810f 100644 --- a/lib/model/SmallCaseModel/broker_account_model.dart +++ b/lib/model/SmallCaseModel/broker_account_model.dart @@ -1,34 +1,76 @@ class BrokerAccountModel { - final String? id; - final String? userId; - final String? brokerName; - final String? authToken; - final String? txnId; + String? status; + int? statusCode; + String? message; + List? data; - const BrokerAccountModel({ - required this.id, - required this.userId, - required this.brokerName, - required this.authToken, - required this.txnId, - }); + BrokerAccountModel({this.status, this.statusCode, this.message, this.data}); - factory BrokerAccountModel.fromJson(Map json) { - return BrokerAccountModel( - id: json['id'].toString(), - userId: json['user_id'].toString(), - brokerName: json['broker_name'] as String?, - authToken: json['auth_token'] as String?, - txnId: json['transaction_id'] as String?, - ); + BrokerAccountModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(Data.fromJson(v)); + }); + } } Map toJson() { final Map data = {}; - data['user_id'] = userId; - data['broker_name'] = brokerName; - data['auth_token'] = authToken; - data['transaction_id'] = txnId; + data['status'] = status; + data['status_code'] = statusCode; + data['message'] = message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + int? iamPrincipalXid; + String? brokerName; + String? authToken; + String? transactionId; + int? isActive; + String? createdAt; + String? updatedAt; + + Data( + {this.id, + this.iamPrincipalXid, + this.brokerName, + this.authToken, + this.transactionId, + this.isActive, + this.createdAt, + this.updatedAt}); + + Data.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + brokerName = json['broker_name']; + authToken = json['auth_token']; + transactionId = json['transaction_id']; + isActive = json['is_active']; + createdAt = json['created_at']; + updatedAt = json['updated_at']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['iam_principal_xid'] = iamPrincipalXid; + data['broker_name'] = brokerName; + data['auth_token'] = authToken; + data['transaction_id'] = transactionId; + data['is_active'] = isActive; + data['created_at'] = createdAt; + data['updated_at'] = updatedAt; return data; } } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 7fc6ce7..3af7fc1 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -1,32 +1,28 @@ import 'package:get/get.dart'; import 'package:traderscircuit/Utils/Common/noInternet.dart'; -import 'package:traderscircuit/model/StockDetailsModel/stock_details_model.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/MainScreen/ExploreUnseen.dart'; +import 'package:traderscircuit/view/MainScreen/HomeScreen.dart'; +import 'package:traderscircuit/view/MainScreen/MainScreen.dart'; +import 'package:traderscircuit/view/MainScreen/Notification.dart'; +import 'package:traderscircuit/view/MainScreen/ShortTrade.dart'; import 'package:traderscircuit/view/MainScreen/stockDetails/Search.dart'; import 'package:traderscircuit/view/MainScreen/stockDetails/option_chain_screen.dart'; import 'package:traderscircuit/view/MainScreen/stockDetails/stock_details_screen.dart'; import 'package:traderscircuit/view/Sidemenu/AboutUs.dart'; -import 'package:traderscircuit/view/Sidemenu/ContentByte/ContentBytes.dart'; import 'package:traderscircuit/view/Sidemenu/ContentByte/AudioMore.dart'; +import 'package:traderscircuit/view/Sidemenu/ContentByte/ContentBytes.dart'; import 'package:traderscircuit/view/Sidemenu/ContentByte/ReadMore.dart'; import 'package:traderscircuit/view/Sidemenu/ContentByte/VideosMore.dart'; import 'package:traderscircuit/view/Sidemenu/FaqScreen.dart'; import 'package:traderscircuit/view/Sidemenu/PrivacyPolicy.dart'; import 'package:traderscircuit/view/Sidemenu/Settings.dart'; +import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart'; import 'package:traderscircuit/view/Sidemenu/TermsAndCondition.dart'; import 'package:traderscircuit/view/Sidemenu/contactUs/contact_us_main.dart'; import 'package:traderscircuit/view/Sidemenu/myProfile/my_profile_screen.dart'; - import 'package:traderscircuit/view/login/AddDetails.dart'; import 'package:traderscircuit/view/login/Kyc.dart'; - -import 'package:traderscircuit/view/MainScreen/HomeScreen.dart'; -import 'package:traderscircuit/view/MainScreen/MainScreen.dart'; -import 'package:traderscircuit/view/MainScreen/Notification.dart'; -import 'package:traderscircuit/view/MainScreen/ShortTrade.dart'; -import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart'; - import 'package:traderscircuit/view/login/LoginScreen.dart'; import 'package:traderscircuit/view/login/UpdateRiskProfile.dart'; import 'package:traderscircuit/view/login/VerifyOtp.dart'; @@ -207,7 +203,7 @@ class AppRoutes { ), //search - GetPage( + GetPage( name: RouteName.search, page: () => const Search(), ), diff --git a/lib/view/MainScreen/Portfolio/Holdings.dart b/lib/view/MainScreen/Portfolio/Holdings.dart deleted file mode 100644 index c30aff5..0000000 --- a/lib/view/MainScreen/Portfolio/Holdings.dart +++ /dev/null @@ -1,711 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; -import 'package:glassmorphism/glassmorphism.dart'; -import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart'; -import 'package:traderscircuit/Utils/Common/commonBotton.dart'; -import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart'; -import 'package:traderscircuit/Utils/Common/sized_box.dart'; -import 'package:traderscircuit/Utils/text.dart'; -import 'package:traderscircuit/view/MainScreen/MainScreen.dart'; -import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart'; -import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; - -class Holdings extends StatefulWidget { - const Holdings({super.key}); - - @override - State createState() => _HoldingsState(); -} - -class _HoldingsState extends State { - GlobalKey _scaffoldKey1 = GlobalKey(); - List containerTexts = [ - "Portfolio 1", - "Portfolio 1", - "Portfolio 1", - "Portfolio 1", - "Portfolio 1" - ]; - final selectedIndex = 0.obs; - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async { - _onBackButtonPressed(context); - return true; // Return true to allow the pop action - }, - child: Scaffold( - key: _scaffoldKey1, - backgroundColor: Colors.black, - drawerEnableOpenDragGesture: false, - drawer: Container(child: SideMenu()), - extendBody: true, - appBar: AppBar( - scrolledUnderElevation: 0.0, - backgroundColor: Colors.black, - elevation: 0, - automaticallyImplyLeading: false, - titleSpacing: 0, - leading: InkWell( - onTap: () { - _scaffoldKey1.currentState?.openDrawer(); - }, - child: Center( - child: Image.asset( - 'assets/images/png/menu.png', - height: 15.h, - width: 20.w, - ), - ), - ), - ), - body: Stack( - children: [ - CommonBlurLeft(), - CommonBlurRight(), - Stack( - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: ListView( - physics: NeverScrollableScrollPhysics(), - children: [ - text25W600("My Portfolio"), - SizedBox( - height: 10, - ), - DefaultTabController( - length: 5, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - PortfolioTabBar(), - SizedBox( - height: 30.h, - ), - SizedBox( - height: 570.h, - child: TabBarView( - children: [ - DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - HoldingsTabBar(), - Expanded( - child: TabBarView( - children: [ - Holdings(), - PortfolioReview(), - ], - ), - ), - ], - ), - ), - DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - HoldingsTabBar(), - Expanded( - child: TabBarView( - children: [ - Holdings(), - PortfolioReview(), - ], - ), - ), - ], - ), - ), - DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - HoldingsTabBar(), - Expanded( - child: TabBarView( - children: [ - Holdings(), - PortfolioReview(), - ], - ), - ), - ], - ), - ), - DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - HoldingsTabBar(), - Expanded( - child: TabBarView( - children: [ - Holdings(), - PortfolioReview(), - ], - ), - ), - ], - ), - ), - DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column( - children: [ - HoldingsTabBar(), - Expanded( - child: TabBarView( - children: [ - Holdings(), - PortfolioReview(), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ), - sizedBoxHeight(40.h), - ], - ), - ), - ], - ), - ], - ), - bottomNavigationBar: bottomnavigationbar(mainController), - ), - ); - } - - Future _onBackButtonPressed(BuildContext context) async { - bool? exitApp = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - backgroundColor: const Color(0xFFFFF3E4), - title: const Text('Exit App'), - content: const Text('Do you really want to close the app?'), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(false); - }, - child: const Text( - 'No', - style: TextStyle( - color: Color(0xff1B243D), - ), - ), - ), - TextButton( - onPressed: () { - SystemNavigator.pop(); - Navigator.pop(context); - }, - child: const Text( - 'Yes', - style: TextStyle( - color: Color(0xff1B243D), - ), - ), - ) - ], - ); - }); - return exitApp ?? false; - } - - Widget Holdings() { - return Obx(() { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (selectedIndex == 1) _unlockbottomsheet(); - }); - return selectedIndex == 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - sizedBoxHeight(20.h), - HoldingCard( - text: 'TATA MOTORS', - content: 'Text', - ), - sizedBoxHeight(25.h), - Table( - children: [ - TableRow( - children: [ - TableCell( - child: Text( - "Stock Name", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "AVG Price", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "Quantity", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "Exchange", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - ], - ), - ], - ), - Divider( - color: Color(0xFF3A3A3A), - ), - Expanded( - child: ListView.separated( - physics: BouncingScrollPhysics(), - shrinkWrap: true, - itemCount: 16, - itemBuilder: ((context, index) { - return Table( - children: [ - TableRow( - children: [ - TableCell( - child: Text( - "TATA MOTORS", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "416.66", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "3", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - TableCell( - child: Text( - "BSE", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - ), - ), - ], - ), - ], - ); - }), - separatorBuilder: (BuildContext context, int index) { - return Divider(); - }, - ), - ), - SizedBox( - height: 30.h, - ) - ], - ) - : selectedIndex == 1 - ? Column( - children: [], - ) - : Column( - children: [], - ); - }); - } - - void _unlockbottomsheet() { - Get.bottomSheet( - SizedBox( - height: 200, - child: commonGlassContainer( - width: double.infinity, - height: 200, - borderradius: 2, - customWidget: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Image.asset( - // 'assets/images/png/Group 1000003722.png', - // height: 100.h, - // ), - // sizedBoxHeight(25.h), - text20W400('Please subscribed to unlock'), - sizedBoxHeight(30.h), - CommonBtn(text: 'Subscribe Now'), - ], - ), - ), - ), - backgroundColor: Colors.black.withOpacity(0.3), - ); - } - - Widget PortfolioReview() { - List> cardSwing = [ - { - 'text': 'Performance Overview:', - 'content': - 'Your portfolio has generated a total return of 15% over the past six months, outperforming the S&P 500 index by 5%.', - }, - { - 'text': 'Asset Allocation:', - 'content': - 'Your portfolio is well-diversified, with 60% allocated to equities, 30% to bonds, and 10% to cash equivalents.', - }, - { - 'text': 'Individual Holdings Analysis:', - 'content': - 'Your investment in Company XYZ has performed exceptionally well, with a 25% increase in share price since purchase, driven by strong quarterly earnings.', - }, - ]; - - return SingleChildScrollView( - child: Column( - children: [ - sizedBoxHeight(20.h), - Obx(() { - return selectedIndex == 0 - ? Column( - children: List.generate(cardSwing.length, (index) { - return Column( - children: [ - PortfolioCard( - text: cardSwing[index]['text']!, - content: cardSwing[index]['content']!, - ), - sizedBoxHeight(20.h) - ], - ); - }), - ) - : selectedIndex == 1 - ? Column( - children: List.generate(cardSwing.length, (index) { - return Column( - children: [ - PortfolioCard( - text: cardSwing[index]['text']!, - content: cardSwing[index]['content']!, - ), - sizedBoxHeight(20.h) - ], - ); - }), - ) - : Column( - children: List.generate(cardSwing.length, (index) { - return Column( - children: [ - PortfolioCard( - text: cardSwing[index]['text']!, - content: cardSwing[index]['content']!, - ), - sizedBoxHeight(20.h) - ], - ); - }), - ); - }), - sizedBoxHeight(200.h) - ], - ), - ); - } - - Widget PortfolioCard({ - required String text, - required String content, - }) { - return commonGlassContainer( - width: double.infinity, - height: 166.h, - borderradius: 8, - customWidget: Column( - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - color: Color(0xFF6C0000), - borderRadius: BorderRadius.circular(2), - ), - height: 25.h, - width: 4.w, - ), - sizedBoxWidth(15.w), - text18W600(text), - Spacer(), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 18), - child: text16W400(content), - ) - ], - ), - ); - } - - Widget HoldingCard({ - required String text, - required String content, - }) { - return commonGlassContainer( - width: double.infinity, - height: 166.h, - borderradius: 8, - customWidget: Column( - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - GlassmorphicContainer( - width: 47.w, - height: 47.h, - borderRadius: 100, - blur: 10, - alignment: Alignment.center, - border: 0.9, - linearGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff3A3A3A), - Color(0xFF3A3A3A), - ], - ), - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color.fromRGBO(70, 5, 1, 0.8), - Color.fromRGBO(102, 102, 102, 0.8), - ], - ), - child: Center( - child: Image.asset( - 'assets/images/png/TATAMOTORS.NS_BIG 1.png', - width: 26.w, - height: 23.h, - ), - ), - ), - sizedBoxWidth(15.w), - text18W600(text), - Spacer(), - ], - ), - ), - Container( - width: double.infinity, - height: 1.h, - color: Color(0xFF3A3A3A), - ), - Padding( - padding: const EdgeInsets.all(18), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text14W400_979797('Portfolio Value'), - sizedBoxHeight(5.h), - SizedBox(width: 150.w, child: text15W600("₹ 40,000")) - ], - ), - sizedBoxWidth(30.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text14W400_979797('%P/L'), - sizedBoxHeight(5.h), - text14W400_00FF19("-36.006%") - ], - ) - ], - ), - ], - ), - ) - ], - ), - ); - } - - Widget topContainer(String text, int index) { - return Obx(() { - return selectedIndex.value == index - ? Container( - height: 40.h, - width: 126.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5), - color: Color(0Xff6C0000), - ), - child: Center(child: text16W500(text)), - ) - : commonGlassContainer( - width: 126.w, - height: 40.h, - borderradius: 5, - customWidget: Center(child: text16W400(text)), - ); - }); - } -} - -class HoldingsTabBar extends StatelessWidget { - // Set the desired height - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - border: Border.all(color: Color(0Xff3A3A3A)), - borderRadius: BorderRadius.circular(8.r), - ), - padding: const EdgeInsets.all(8.0), // Set the desired padding - child: TabBar( - indicator: BoxDecoration( - color: const Color(0xff6C0000), - borderRadius: BorderRadius.circular(5), - ), - dividerColor: Colors.transparent, - labelStyle: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - indicatorSize: TabBarIndicatorSize.tab, - indicatorColor: const Color(0xFFFFFFFF), - labelColor: Colors.white, - unselectedLabelColor: const Color(0xffFFFFFF), - overlayColor: MaterialStateProperty.all(const Color(0xFFFFFFFF)), - tabs: const [ - Tab( - text: 'Holdings', - ), - Tab( - text: 'Portfolio Reviews', - ), - ]), - ); - } -} - -class PortfolioTabBar extends StatelessWidget { - // Set the desired height - - @override - Widget build(BuildContext context) { - return TabBar( - tabAlignment: TabAlignment.start, - isScrollable: true, - dividerColor: Colors.transparent, - labelStyle: TextStyle( - fontSize: 18.sp, - color: Colors.white, - fontWeight: FontWeight.w500, - fontFamily: 'hiragino'), - indicatorSize: TabBarIndicatorSize.tab, - indicatorWeight: 2, - indicatorColor: const Color(0xff6C0000), - labelColor: Colors.white, - unselectedLabelColor: const Color(0xFF464646), - overlayColor: MaterialStateProperty.all(const Color(0xFFFFFFFF)), - tabs: const [ - Tab( - text: 'Portfolio 1', - ), - Tab( - text: 'Portfolio 2', - ), - Tab( - text: 'Portfolio 3', - ), - Tab( - text: 'Portfolio 4', - ), - Tab( - text: 'Portfolio 5', - ), - ]); - } -} diff --git a/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart b/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart index 13a22bd..7682da3 100644 --- a/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart +++ b/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart @@ -1,21 +1,24 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:developer'; import 'package:async/async.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; import 'package:lottie/lottie.dart'; import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart'; import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart'; import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/Common/sized_box.dart'; import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/view/MainScreen/MainScreen.dart'; -import 'package:traderscircuit/view/MainScreen/Portfolio/Holdings.dart'; import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import '../../../Utils/Common/comonGlassmorphicContainer.dart'; import '../../../model/SmallCaseModel/broker_account_model.dart'; import '../../../view_model/SmallCaseApi/smallcase_api_methods.dart'; @@ -27,233 +30,327 @@ class Portfolio extends StatefulWidget { } class _PortfolioState extends State { - GlobalKey _scaffoldKey1 = GlobalKey(); + final GlobalKey _scaffoldKey1 = GlobalKey(); List containerTexts = ["Swing Trade", "Multibagger", "Options"]; final selectedIndex = 0.obs; + RxBool noBrokerAvailable = true.obs; FutureGroup fetchUserIdAndBrokerAccounts = FutureGroup(); - List myBrokerAccounts = []; + List myBrokerAccounts = []; + @override void initState() { - // fetchUserIdAndBrokerAccounts.add(getUserId()); // TODO Need to add userid here fetchUserIdAndBrokerAccounts.add(fetchBrokerAccounts()); fetchUserIdAndBrokerAccounts.close(); - // fetchUserIdAndBrokerAccounts.future.then((value) { - // int userId = value[0]; - // List brokerAccounts = value[1]; - // try { - // myBrokerAccounts.addAll(brokerAccounts - // .where((element) => element.userId == userId.toString())); - // } catch (e) {} - // debugPrint("myBrokerAccounts.length ${myBrokerAccounts.length}"); - // debugPrint("BrokerAccounts.length ${brokerAccounts.length}"); - // if (myBrokerAccounts.isEmpty) { - // setState(() { - // body = Center( - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // const Text("You need to add broker account"), - // const Text("to fetch holdings"), - // const SizedBox(height: 6), - // OutlinedButton( - // onPressed: () { - // //Get.off(Broker()); - // Get.to(() => Broker()); - // }, - // child: const Text("Brokerage Account"), - // ) - // ], - // )); - // }); - // } else { - // setBodyToBrokers(); - // } - // }); + fetchUserIdAndBrokerAccounts.future.then((value) { + log(value.toString()); + + try { + myBrokerAccounts = value[0] as List; + } catch (e) {} + debugPrint("myBrokerAccounts.length ${myBrokerAccounts.length}"); + + if (myBrokerAccounts.isEmpty) { + noBrokerAvailable.value = true; + } else { + noBrokerAvailable.value = false; + } + }); super.initState(); } - // void setBodyToBrokers() { - // setState(() { - // body = Padding( - // padding: const EdgeInsets.only(top: 28, left: 28, right: 28), - // child: Column(mainAxisSize: MainAxisSize.min, children: [ - // const Text("Please select your broker account"), - // const SizedBox(height: 8), - // Expanded( - // child: ListView.builder( - // itemCount: myBrokerAccounts.length, - // itemBuilder: (context, index) { - // return OutlinedButton( - // onPressed: () { - // setState(() { - // body = const Center(child: CircularProgressIndicator()); - // }); - // fetchHoldingsImportTxnId( - // myBrokerAccounts.elementAt(index).authToken!) - // .then((txnIdResponse) { - // if (txnIdResponse.statusCode == 200) { - // debugPrint('SESSION STARTED'); - // debugPrint( - // 'AUTH TOKEN: ${myBrokerAccounts.elementAt(index).authToken!}'); - // fetchHoldingsImportTxnId( - // myBrokerAccounts.elementAt(index).authToken!) - // .then((txnRes) { - // String txnId = - // jsonDecode(txnRes.body)['data']['transactionId']; - // debugPrint('TXN ID $txnId'); - // ScgatewayFlutterPlugin.triggerGatewayTransaction( - // txnId) - // .then( - // (txnRes) { - // debugPrint('TXN RES $txnRes'); - // if (txnRes != null) { - // fetchHoldings( - // //holdingsAuthToken - // myBrokerAccounts - // .elementAt(index) - // .authToken!) - // .then( - // (holdings) { - // setState(() { - // // body = netWorthPage(holdings); - // }); - // }, - // ); - // } - // }, - // ); - // }); - // } else { - // debugPrint('SESSION EXPIRED'); - // onTxnTimeout(); - // } - // }); - // }, - // child: Text(myBrokerAccounts.elementAt(index).brokerName!), - // ); - // }, - // ), - // ) - // ]), - // ); - // }); - // } + Widget holdings() { + return Obx(() { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (selectedIndex.value == 1) _unlockbottomsheet(); + }); + return selectedIndex.value == 0 + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(25.h), + GestureDetector( + onTap: () { + log(myBrokerAccounts[selectedIndex.value].brokerName!); + ScgatewayFlutterPlugin.setConfigEnvironment( + GatewayEnvironment.PRODUCTION, + 'traderscircuit', + false, + [myBrokerAccounts[selectedIndex.value].brokerName!], + ); + fetchHoldingsImportTxnId(myBrokerAccounts + .elementAt(selectedIndex.value) + .authToken!) + .then((txnIdResponse) { + if (txnIdResponse != "Failed") { + fetchHoldingsImportTxnId(myBrokerAccounts + .elementAt(selectedIndex.value) + .authToken!) + .then((txnIdResponse) { + debugPrint('SESSION STARTED'); + debugPrint( + 'AUTH TOKEN: ${myBrokerAccounts.elementAt(selectedIndex.value).authToken!}'); + String txnId = txnIdResponse; + debugPrint('TXN ID $txnId'); + ScgatewayFlutterPlugin.triggerGatewayTransaction( + txnId) + .then( + (txnRes) { + debugPrint('TXN RES $txnRes'); + if (txnRes != null) { + fetchHoldings( + //holdingsAuthToken + myBrokerAccounts + .elementAt(selectedIndex.value) + .authToken!) + .then( + (holdings) { + setState(() {}); + }, + ); + } + }, + ); + }); + } else { + debugPrint('SESSION EXPIRED'); + onTxnTimeout(); + } + }); + }, + child: Align( + alignment: Alignment.centerRight, + child: Container( + width: 180, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: const Color(0xff6C0000), + ), + child: Center(child: text15W600("Update Stock's")), + ), + ), + ), + sizedBoxHeight(25.h), + Table( + children: [ + TableRow( + children: [ + TableCell( + child: Text( + "Stock Name", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + TableCell( + child: Text( + "AVG Price", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + TableCell( + child: Text( + "Quantity", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + ], + ), + ], + ), + const Divider( + color: Color(0xFF3A3A3A), + ), + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemCount: 16, + itemBuilder: ((context, index) { + return Table( + children: [ + TableRow( + children: [ + TableCell( + child: Text( + "TATA MOTORS", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + TableCell( + child: Text( + "416.66", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + TableCell( + child: Text( + "3", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + ), + ), + ], + ), + ], + ); + }), + separatorBuilder: (BuildContext context, int index) { + return const Divider(); + }, + ), + ), + SizedBox( + height: 30.h, + ) + ], + ) + : selectedIndex == 1 + ? const Column( + children: [], + ) + : const Column( + children: [], + ); + }); + } - // void onTxnTimeout() { - // bool showDialogContent = true; - // bool replaceDialogContentWithLoader = false; - // showDialog( - // barrierDismissible: false, - // context: context, - // builder: (context) => AlertDialog(content: StatefulBuilder( - // builder: (context, setDialogState) { - // return Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // Visibility( - // visible: showDialogContent, - // child: Column( - // mainAxisSize: MainAxisSize.min, - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // const Text("Transaction Timeout", - // style: TextStyle( - // fontWeight: FontWeight.bold, - // fontSize: 18, - // )), - // const SizedBox(height: 18), - // const Text("You need to login again to continue"), - // const SizedBox(height: 18), - // Row( - // mainAxisAlignment: MainAxisAlignment.end, - // children: [ - // OutlinedButton( - // onPressed: () { - // setBodyToBrokers(); - // Get.back(); - // }, - // child: const Text("Cancel"), - // ), - // const SizedBox(width: 12), - // ElevatedButton( - // onPressed: () { - // setDialogState(() { - // showDialogContent = false; - // replaceDialogContentWithLoader = true; - // }); - // //login again - // fetchAuthToken().then((fetchedAuthToken) { - // debugPrint( - // "fetchedAuthToken $fetchedAuthToken"); - // fetchBrokerConnectTxnId( - // authToken: fetchedAuthToken) - // .then( - // (txnId) => - // ScgatewayFlutterPlugin.initGateway( - // fetchedAuthToken) - // .then( - // (value) => ScgatewayFlutterPlugin - // .triggerGatewayTransaction( - // txnId, - // ).then( - // (loginRes) { - // if (loginRes != null) { - // var data = - // jsonDecode(loginRes)['data']; - // if (data != null) { - // String authToken = jsonDecode( - // data)['smallcaseAuthToken']; - // String brokerName = - // jsonDecode(data)['broker']; - // String txnId = jsonDecode( - // data)['transactionId']; - // getUserId().then((userId) { - // postBrokerAccount( - // userId: userId! - // .toString(), - // brokerName: - // brokerName, - // authToken: authToken, - // txnId: txnId) - // .then((isPosted) { - // if (isPosted) { - // // Get.back(); - // // setBodyToBrokers(); - // Get.off(Holdings()); - // } - // }); - // }); - // } - // } - // }, - // ), - // ), - // ); - // }); - // }, - // child: const Text("Login Again"), - // ), - // ], - // ) - // ], - // ), - // ), - // Visibility( - // visible: replaceDialogContentWithLoader, - // child: const Padding( - // padding: EdgeInsets.symmetric(vertical: 28.0), - // child: Center( - // child: CircularProgressIndicator(), - // ), - // ), - // ) - // ], - // ); - // }, - // ))); - // } + void onTxnTimeout() { + bool showDialogContent = true; + bool replaceDialogContentWithLoader = false; + showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AlertDialog(content: StatefulBuilder( + builder: (context, setDialogState) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Visibility( + visible: showDialogContent, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("Transaction Timeout", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + const SizedBox(height: 18), + const Text("You need to login again to continue"), + const SizedBox(height: 18), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + OutlinedButton( + onPressed: () { + Get.back(); + }, + child: const Text("Cancel"), + ), + const SizedBox(width: 12), + ElevatedButton( + onPressed: () { + setDialogState(() { + showDialogContent = false; + replaceDialogContentWithLoader = true; + }); + //login again + fetchAuthToken().then((fetchedAuthToken) { + debugPrint( + "fetchedAuthToken $fetchedAuthToken"); + fetchBrokerConnectTxnId( + authToken: fetchedAuthToken) + .then( + (txnId) => + ScgatewayFlutterPlugin.initGateway( + fetchedAuthToken, + ).then( + (value) => ScgatewayFlutterPlugin + .triggerGatewayTransaction( + txnId, + ).then( + (loginRes) { + if (loginRes != null) { + var data = + jsonDecode(loginRes)['data']; + if (data != null) { + String authToken = jsonDecode( + data)['smallcaseAuthToken']; + String brokerName = + jsonDecode(data)['broker']; + String txnId = jsonDecode( + data)['transactionId']; + + postBrokerAccount( + brokerName: brokerName, + authToken: authToken, + txnId: txnId) + .then((isPosted) { + if (isPosted) { + Get.back(); + } + }); + } + } + }, + ), + ), + ); + }); + }, + child: const Text("Login Again"), + ), + ], + ) + ], + ), + ), + Visibility( + visible: replaceDialogContentWithLoader, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 28.0), + child: Center( + child: CircularProgressIndicator(), + ), + ), + ) + ], + ); + }, + ))); + } @override Widget build(BuildContext context) { @@ -266,7 +363,7 @@ class _PortfolioState extends State { key: _scaffoldKey1, backgroundColor: Colors.black, drawerEnableOpenDragGesture: false, - drawer: Container(child: const SideMenu()), + drawer: const SideMenu(), extendBody: true, appBar: AppBar( scrolledUnderElevation: 0.0, @@ -287,115 +384,521 @@ class _PortfolioState extends State { ), ), ), - body: Stack( - children: [ - const CommonBlurLeft(), - const CommonBlurRight(), - Stack( - children: [ - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: Column( - children: [ - Row( - children: [ - text25W600("My Portfolio"), - ], - ), - SizedBox( - height: 30.h, - ), - Text( - 'Please click the "Add" button below to add a portfolio.', - textAlign: TextAlign.center, - style: TextStyle( - fontFamily: 'hiragino', - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.w400, - ), - ), - const Spacer(), - LottieBuilder.asset( - "assets/images/png/TAdlX7YnR7 (1).json", - width: 200.w, - height: 200.h, - ), - const Spacer(), - CommonBtn( - text: "Add", - onTap: () { - // replaceAddAccountBtnWithLoader(); - // Timer.periodic(Duration(seconds: 8), (timer) { - // // replaceLoaderWithAddAccountBtn(); - // timer.cancel(); - // }); - fetchAuthToken().then((fetchedAuthToken) { - debugPrint("fetchedAuthToken $fetchedAuthToken"); - fetchBrokerConnectTxnId( - authToken: fetchedAuthToken) - .then( - (txnId) => ScgatewayFlutterPlugin.initGateway( - fetchedAuthToken) - .then( - (value) => ScgatewayFlutterPlugin - .triggerGatewayTransaction( - txnId, - ).then( - (loginRes) { - if (loginRes != null) { - var data = jsonDecode(loginRes)['data']; - if (data != null) { - String authToken = jsonDecode( - data)['smallcaseAuthToken']; - String brokerName = - jsonDecode(data)['broker']; - String txnId = - jsonDecode(data)['transactionId']; - // getUserId().then((userId) { - postBrokerAccount( - userId: "12", - brokerName: brokerName, - authToken: authToken, - txnId: txnId) - .then((isPosted) { - // replaceLoaderWithAddAccountBtn(); - // Navigator.pushReplacement( - // context, - // MaterialPageRoute( - // builder: (context) => - // Broker())); - ScaffoldMessenger.of(context) - .clearSnackBars(); - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar( - content: Text( - 'New broker account is added'))); - }); - // }); - // replaceLoaderWithAddAccountBtn(); - } - } + body: Obx( + () => Stack( + children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + !noBrokerAvailable.value + ? Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 16), + child: ListView( + physics: const NeverScrollableScrollPhysics(), + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + text25W600("My Portfolio"), + GestureDetector( + onTap: () { + fetchAuthToken().then((fetchedAuthToken) { + debugPrint( + "fetchedAuthToken $fetchedAuthToken"); + fetchBrokerConnectTxnId( + authToken: fetchedAuthToken) + .then( + (txnId) => ScgatewayFlutterPlugin + .initGateway(fetchedAuthToken) + .then( + (value) => ScgatewayFlutterPlugin + .triggerGatewayTransaction( + txnId, + ).then( + (loginRes) { + log(loginRes.toString()); + if (loginRes != null) { + var data = jsonDecode( + loginRes)['data']; + if (data != null) { + String authToken = + jsonDecode(data)[ + 'smallcaseAuthToken']; + String brokerName = + jsonDecode( + data)['broker']; + String txnId = jsonDecode( + data)['transactionId']; + + postBrokerAccount( + brokerName: + brokerName, + authToken: + authToken, + txnId: txnId) + .then((isPosted) { + ScaffoldMessenger.of( + context) + .clearSnackBars(); + ScaffoldMessenger.of( + context) + .showSnackBar( + const SnackBar( + content: Text( + 'New broker account is added'))); + }); + } + } + }, + ), + ), + ); + }); + setState(() {}); }, + child: Container( + width: 80, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: const Color(0xff6C0000), + ), + child: Center(child: text15W600("ADD")), + ), ), + ], + ), + const SizedBox( + height: 10, + ), + DefaultTabController( + length: myBrokerAccounts.length, + // initialIndex: selectedIndex.value, + child: Column( + children: [ + PortfolioTabBar( + portfolioLength: myBrokerAccounts.length, + portoflioName: myBrokerAccounts, + ), + SizedBox( + height: 30.h, + ), + SizedBox( + height: 570.h, + child: TabBarView( + children: List.generate( + myBrokerAccounts.length, (count) { + return DefaultTabController( + length: 2, + child: Column( + children: [ + const HoldingsTabBar(), + Expanded( + child: TabBarView( + children: [ + holdings(), + PortfolioReview(), + ], + ), + ), + ], + ), + ); + }), + ), + ), + ], ), - ); - }); - }), - const Spacer(), - ], - ), - ), - ], - ) - ], + ), + sizedBoxHeight(40.h), + ], + ), + ), + ], + ) + : Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 16), + child: Column( + children: [ + Row( + children: [ + text25W600("My Portfolio"), + ], + ), + SizedBox( + height: 30.h, + ), + Text( + 'Please click the "Add" button below to add a portfolio.', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'hiragino', + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + ), + const Spacer(), + LottieBuilder.asset( + "assets/images/png/TAdlX7YnR7 (1).json", + width: 200.w, + height: 200.h, + ), + const Spacer(), + CommonBtn( + text: "Add", + onTap: () { + fetchAuthToken().then((fetchedAuthToken) { + debugPrint( + "fetchedAuthToken $fetchedAuthToken"); + fetchBrokerConnectTxnId( + authToken: fetchedAuthToken) + .then( + (txnId) => + ScgatewayFlutterPlugin.initGateway( + fetchedAuthToken) + .then( + (value) => ScgatewayFlutterPlugin + .triggerGatewayTransaction( + txnId, + ).then( + (loginRes) { + log(loginRes.toString()); + if (loginRes != null) { + var data = jsonDecode( + loginRes)['data']; + if (data != null) { + String authToken = + jsonDecode(data)[ + 'smallcaseAuthToken']; + String brokerName = + jsonDecode( + data)['broker']; + String txnId = jsonDecode( + data)['transactionId']; + + postBrokerAccount( + brokerName: + brokerName, + authToken: authToken, + txnId: txnId) + .then((isPosted) { + ScaffoldMessenger.of( + context) + .clearSnackBars(); + ScaffoldMessenger.of( + context) + .showSnackBar( + const SnackBar( + content: Text( + 'New broker account is added'))); + + fetchUserIdAndBrokerAccounts + .add( + fetchBrokerAccounts()); + fetchUserIdAndBrokerAccounts + .close(); + fetchUserIdAndBrokerAccounts + .future + .then((value) { + log(value.toString()); + + try { + myBrokerAccounts = + value[0] + as List; + } catch (e) {} + debugPrint( + "myBrokerAccounts.length ${myBrokerAccounts.length}"); + + if (myBrokerAccounts + .isEmpty) { + noBrokerAvailable + .value = true; + } else { + noBrokerAvailable + .value = false; + } + }); + setState(() {}); + }); + } + } + }, + ), + ), + ); + }); + }), + const Spacer(), + ], + ), + ), + ], + ) + ], + ), ), bottomNavigationBar: bottomnavigationbar(mainController), ), ); } + Widget topContainer(String text, int index) { + return Obx(() { + return selectedIndex.value == index + ? Container( + height: 40.h, + width: 126.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: const Color(0Xff6C0000), + ), + child: Center(child: text16W500(text)), + ) + : commonGlassContainer( + width: 126.w, + height: 40.h, + borderradius: 5, + customWidget: Center(child: text16W400(text)), + ); + }); + } + + void _unlockbottomsheet() { + Get.bottomSheet( + SizedBox( + height: 200, + child: commonGlassContainer( + width: double.infinity, + height: 200, + borderradius: 2, + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Image.asset( + // 'assets/images/png/Group 1000003722.png', + // height: 100.h, + // ), + // sizedBoxHeight(25.h), + text20W400('Please subscribed to unlock'), + sizedBoxHeight(30.h), + CommonBtn(text: 'Subscribe Now'), + ], + ), + ), + ), + backgroundColor: Colors.black.withOpacity(0.3), + ); + } + + Widget PortfolioReview() { + List> cardSwing = [ + { + 'text': 'Performance Overview:', + 'content': + 'Your portfolio has generated a total return of 15% over the past six months, outperforming the S&P 500 index by 5%.', + }, + { + 'text': 'Asset Allocation:', + 'content': + 'Your portfolio is well-diversified, with 60% allocated to equities, 30% to bonds, and 10% to cash equivalents.', + }, + { + 'text': 'Individual Holdings Analysis:', + 'content': + 'Your investment in Company XYZ has performed exceptionally well, with a 25% increase in share price since purchase, driven by strong quarterly earnings.', + }, + ]; + + return SingleChildScrollView( + child: Column( + children: [ + sizedBoxHeight(20.h), + Obx(() { + return selectedIndex.value == 0 + ? Column( + children: List.generate(cardSwing.length, (index) { + return Column( + children: [ + PortfolioCard( + text: cardSwing[index]['text']!, + content: cardSwing[index]['content']!, + ), + sizedBoxHeight(20.h) + ], + ); + }), + ) + : selectedIndex.value == 1 + ? Column( + children: List.generate(cardSwing.length, (index) { + return Column( + children: [ + PortfolioCard( + text: cardSwing[index]['text']!, + content: cardSwing[index]['content']!, + ), + sizedBoxHeight(20.h) + ], + ); + }), + ) + : Column( + children: List.generate(cardSwing.length, (index) { + return Column( + children: [ + PortfolioCard( + text: cardSwing[index]['text']!, + content: cardSwing[index]['content']!, + ), + sizedBoxHeight(20.h) + ], + ); + }), + ); + }), + sizedBoxHeight(200.h) + ], + ), + ); + } + + Widget PortfolioCard({ + required String text, + required String content, + }) { + return commonGlassContainer( + width: double.infinity, + height: 166.h, + borderradius: 8, + customWidget: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + color: const Color(0xFF6C0000), + borderRadius: BorderRadius.circular(2), + ), + height: 25.h, + width: 4.w, + ), + sizedBoxWidth(15.w), + text18W600(text), + const Spacer(), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18), + child: text16W400(content), + ) + ], + ), + ); + } + + Widget HoldingCard({ + required String text, + required String content, + }) { + return commonGlassContainer( + width: double.infinity, + height: 166.h, + borderradius: 8, + customWidget: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + GlassmorphicContainer( + width: 47.w, + height: 47.h, + borderRadius: 100, + blur: 10, + alignment: Alignment.center, + border: 0.9, + linearGradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff3A3A3A), + Color(0xFF3A3A3A), + ], + ), + borderGradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color.fromRGBO(70, 5, 1, 0.8), + Color.fromRGBO(102, 102, 102, 0.8), + ], + ), + child: Center( + child: Image.asset( + 'assets/images/png/TATAMOTORS.NS_BIG 1.png', + width: 26.w, + height: 23.h, + ), + ), + ), + sizedBoxWidth(15.w), + text18W600(text), + const Spacer(), + ], + ), + ), + Container( + width: double.infinity, + height: 1.h, + color: const Color(0xFF3A3A3A), + ), + Padding( + padding: const EdgeInsets.all(18), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text14W400_979797('Portfolio Value'), + sizedBoxHeight(5.h), + SizedBox(width: 150.w, child: text15W600("₹ 40,000")) + ], + ), + sizedBoxWidth(30.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text14W400_979797('%P/L'), + sizedBoxHeight(5.h), + text14W400_00FF19("-36.006%") + ], + ) + ], + ), + ], + ), + ) + ], + ), + ); + } + Future _onBackButtonPressed(BuildContext context) async { bool? exitApp = await showDialog( context: context, @@ -434,3 +937,80 @@ class _PortfolioState extends State { return exitApp ?? false; } } + +class HoldingsTabBar extends StatelessWidget { + const HoldingsTabBar({super.key}); + + // Set the desired height + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border.all(color: const Color(0Xff3A3A3A)), + borderRadius: BorderRadius.circular(8.r), + ), + padding: const EdgeInsets.all(8.0), // Set the desired padding + child: TabBar( + indicator: BoxDecoration( + color: const Color(0xff6C0000), + borderRadius: BorderRadius.circular(5), + ), + dividerColor: Colors.transparent, + labelStyle: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + indicatorSize: TabBarIndicatorSize.tab, + indicatorColor: const Color(0xFFFFFFFF), + labelColor: Colors.white, + unselectedLabelColor: const Color(0xffFFFFFF), + overlayColor: WidgetStateProperty.all(const Color(0xFFFFFFFF)), + tabs: const [ + Tab( + text: 'Holdings', + ), + Tab( + text: 'Portfolio Reviews', + ), + ]), + ); + } +} + +class PortfolioTabBar extends StatelessWidget { + final int portfolioLength; + final List portoflioName; + const PortfolioTabBar({ + super.key, + required this.portfolioLength, + required this.portoflioName, + }); + + // Set the desired height + + @override + Widget build(BuildContext context) { + return TabBar( + tabAlignment: TabAlignment.start, + isScrollable: true, + dividerColor: Colors.transparent, + labelStyle: TextStyle( + fontSize: 18.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + fontFamily: 'hiragino'), + indicatorSize: TabBarIndicatorSize.tab, + indicatorWeight: 2, + indicatorColor: const Color(0xff6C0000), + labelColor: Colors.white, + unselectedLabelColor: const Color(0xFF464646), + overlayColor: WidgetStateProperty.all(const Color(0xFFFFFFFF)), + tabs: List.generate(portfolioLength, (counter) { + return Tab( + text: portoflioName[counter].brokerName, + ); + })); + } +} diff --git a/lib/view_model/SmallCaseApi/smallcase_api_methods.dart b/lib/view_model/SmallCaseApi/smallcase_api_methods.dart index 4726b06..e4b44c9 100644 --- a/lib/view_model/SmallCaseApi/smallcase_api_methods.dart +++ b/lib/view_model/SmallCaseApi/smallcase_api_methods.dart @@ -1,9 +1,14 @@ import 'dart:convert'; +import 'dart:developer'; + +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart'; import '../../Utils/api_urls.dart'; +import '../../Utils/base_manager.dart'; +import '../../data/network/network_api_services.dart'; import '../../model/SmallCaseModel/broker_account_model.dart'; // void openDashboardPage(BuildContext context) { @@ -19,83 +24,142 @@ import '../../model/SmallCaseModel/broker_account_model.dart'; // } //broker account table -//fetch broker accounts -Future> fetchBrokerAccounts() async { - final response = await http.Client() - .get(Uri.parse('${ApiUrls.pieBase}api/get_broker_account_data')); - final parsed = jsonDecode(response.body); - return parsed - .map((json) => BrokerAccountModel.fromJson(json)) - .toList(); -} //delete broker account Future deleteBrokerAccount(int id) async { final response = await http.Client() - .get(Uri.parse('${ApiUrls.pieBase}api/delete_brokerage_account/$id')); + .get(Uri.parse('${ApiUrls.base}api/delete_brokerage_account/$id')); if (response.statusCode == 200) return true; return false; } //post broker account Future postBrokerAccount({ - required String userId, required String brokerName, required String authToken, required String txnId, }) async { - var response = await http.post( - Uri.parse('${ApiUrls.pieBase}api/add_broker_account'), - body: { - "user_id": userId, + final response = await NetworkApiServices().postApi( + FormData.fromMap({ "broker_name": brokerName, "auth_token": authToken, "transaction_id": txnId, - }, + }), + '${ApiUrls.base}add-broker-account', ); - if (response.statusCode == 200) return true; + + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + return true; + } else { + return false; + } + } return false; } -Future fetchAuthToken() async { - var response = await http.get( - Uri.parse( - '${ApiUrls.pieBase}api/get_small_case_auth_token/', - ), +//fetch broker accounts +Future> fetchBrokerAccounts() async { + final response = await NetworkApiServices().getApi( + '${ApiUrls.base}get-broker-account-data', ); - return jsonDecode(response.body)['data']; + // log(response.data.toString()); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + BrokerAccountModel brokerAccountModel = + BrokerAccountModel.fromJson(responseData); + + return brokerAccountModel.data!; + } else { + return []; + } + } + return []; +} + +Future fetchAuthToken() async { + final response = await NetworkApiServices().getApi( + '${ApiUrls.base}get-small-case-auth-token', + ); + // log(response.data.toString()); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + return response.data['data']; + } else { + return "Failed"; + } + } + return "Failed"; } Future fetchBrokerConnectTxnId({required String authToken}) async { - var response = await http.get( - Uri.parse( - '${ApiUrls.pieBase}api/get_small_case_broker_connect_transaction/$authToken', - ), + final response = await NetworkApiServices().postApi( + FormData.fromMap({"auth_token": authToken}), + '${ApiUrls.base}get-transaction-id', ); - return jsonDecode(response.body)['data']['transactionId']; + log(response.data.toString()); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + return response.data['data']["data"] + ['transactionId']; // jsonDecode(response.body) + } else { + return "Failed"; + } + } + return "Failed"; } -Future fetchHoldingsImportTxnId(String authToken) async { - var response = await http.get( - Uri.parse( - '${ApiUrls.pieBase}api/get_small_case_holding_import_transaction_id/$authToken', - ), +Future fetchHoldingsImportTxnId(String authToken) async { + log(authToken); + final response = await NetworkApiServices().postApi( + FormData.fromMap({"auth_token": authToken}), + '${ApiUrls.base}create-transaction-holdings-import', ); - return response; + log(response.data.toString()); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success" && + !responseData.toString().contains( + "{status: error, status_code: 500, message: Something went wrong.}")) { + return response.data['data']["data"] + ['transactionId']; // jsonDecode(response.body) + } else { + return "Failed"; + } + } + return "Failed"; } Future> fetchHoldings(String authToken) async { - var response = await http.get( - Uri.parse( - '${ApiUrls.pieBase}api/fetch_small_case_holding/$authToken', - ), + final response = await NetworkApiServices().postApi( + FormData.fromMap({"auth_token": authToken}), + '${ApiUrls.base}fetch-holdings', ); - return jsonDecode(response.body)['data']; + log(response.data.toString()); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + return responseData; + } else { + return {}; + } + } + return {}; } Future fetchStocksOrderTxnId(String authToken, String body) async { var response = await http.post(Uri.parse( - '${ApiUrls.pieBase}api/create_post_transaction_stock_order?body=$body&auth_token=$authToken')); + '${ApiUrls.base}api/create_post_transaction_stock_order?body=$body&auth_token=$authToken')); var txnId = jsonDecode(response.body)['data']['transactionId']; return txnId; } diff --git a/pubspec.lock b/pubspec.lock index e8e65be..6090200 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "4eec93681221723a686ad580c2e7d960e1017cf1a4e0a263c2573c2c6b0bf5cd" + sha256: "37a42d06068e2fe3deddb2da079a8c4d105f241225ba27b7122b37e9865fd8f7" url: "https://pub.dev" source: hosted - version: "1.3.25" + version: "1.3.35" another_flushbar: dependency: transitive description: @@ -21,18 +21,18 @@ packages: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.6.1" args: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.0" async: dependency: "direct main" description: @@ -53,10 +53,10 @@ packages: dependency: "direct main" description: name: audio_video_progress_bar - sha256: ccc7d7b83d2a16c52d4a7fb332faabd1baa053fb0e4c16815aefd3945ab33b81 + sha256: "552b1f73c56c4c88407999e0a8507176f60c56de3e6d63bc20a0eab48467d4c9" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" bloc: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: cached_network_image_web - sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" characters: dependency: transitive description: @@ -157,10 +157,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5" + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" url: "https://pub.dev" source: hosted - version: "0.3.3+7" + version: "0.3.4+1" crypto: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" dbus: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "0978e9a3e45305a80a7210dbeaf79d6ee8bee33f70c8e542dc654c952070217f" + sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" url: "https://pub.dev" source: hosted - version: "5.4.2+1" + version: "5.4.3+1" dotted_border: dependency: "direct main" description: @@ -261,10 +261,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: @@ -293,10 +293,10 @@ packages: dependency: transitive description: name: file_selector_macos - sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 url: "https://pub.dev" source: hosted - version: "0.9.3+3" + version: "0.9.4" file_selector_platform_interface: dependency: transitive description: @@ -317,66 +317,66 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: b13cbf1ee78744ca5e6b762e9218db3bd3967a0edfed75f58339907892a2ccb9 + sha256: dbf1e7ab22cfb1f4a4adb103b46a26276b4edc593d4a78ef6fb942bafc92e035 url: "https://pub.dev" source: hosted - version: "10.8.9" + version: "10.10.7" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: "416b33d62033db5ecd2df719fcb657ad04e9995fa0fc392ffdab4ca0e76cb679" + sha256: "3729b74f8cf1d974a27ba70332ecb55ff5ff560edc8164a6469f4a055b429c37" url: "https://pub.dev" source: hosted - version: "3.9.9" + version: "3.10.8" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "9dca9d8d468172444ef18cabb73fe99f7aae24733bfad67115bd36bffd2d65c1" + sha256: "019cd7eee74254d33fbd2e29229367ce33063516bf6b3258a341d89e3b0f1655" url: "https://pub.dev" source: hosted - version: "0.5.5+21" + version: "0.5.7+7" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "53316975310c8af75a96e365f9fccb67d1c544ef0acdbf0d88bbe30eedd1c4f9" + sha256: "26de145bb9688a90962faec6f838247377b0b0d32cc0abecd9a4e43525fc856c" url: "https://pub.dev" source: hosted - version: "2.27.0" + version: "2.32.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 + sha256: "1003a5a03a61fc9a22ef49f37cbcb9e46c86313a7b2e7029b9390cf8c6fc32cb" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: c8e1d59385eee98de63c92f961d2a7062c5d9a65e7f45bdc7f1b0b205aab2492 + sha256: "6643fe3dbd021e6ccfb751f7882b39df355708afbdeb4130fc50f9305a9d1a3d" url: "https://pub.dev" source: hosted - version: "2.11.5" + version: "2.17.2" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: c4f1b723d417bc9c4774810e774ff91df8fb0032d33fb2888b2c887e865581b8 + sha256: "9897c01efaa950d2f6da8317d12452749a74dc45f33b46390a14cfe28067f271" url: "https://pub.dev" source: hosted - version: "3.4.18" + version: "3.5.7" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: c5a11fca3df76a98e3fa68fde8b10a08aacb9a7639f619fbfd4dad6c67a08643 + sha256: "16a71e08fbf6e00382816e1b13397898c29a54fa0ad969c2c2a3b82a704877f0" url: "https://pub.dev" source: hosted - version: "3.6.25" + version: "3.6.35" fl_chart: dependency: "direct main" description: @@ -394,10 +394,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a url: "https://pub.dev" source: hosted - version: "8.1.5" + version: "8.1.6" flutter_branch_sdk: dependency: "direct main" description: @@ -482,10 +482,10 @@ packages: dependency: transitive description: name: flutter_isolate - sha256: "8ab879634322a012feb096153cf759caa118d81300189d1730455f3718bca24b" + sha256: "994ddec596da4ca12ca52154fd59404077584643eb7e3f1008a55fda9fe0b76b" url: "https://pub.dev" source: hosted - version: "2.0.5-pre" + version: "2.0.4" flutter_lints: dependency: "direct dev" description: @@ -498,18 +498,18 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.0.20" flutter_screenutil: dependency: "direct main" description: name: flutter_screenutil - sha256: "8cf100b8e4973dc570b6415a2090b0bfaa8756ad333db46939efc3e774ee100d" + sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" url: "https://pub.dev" source: hosted - version: "5.9.0" + version: "5.9.3" flutter_svg: dependency: "direct main" description: @@ -532,10 +532,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 + sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847" url: "https://pub.dev" source: hosted - version: "8.2.4" + version: "8.2.6" gap: dependency: "direct main" description: @@ -556,10 +556,10 @@ packages: dependency: transitive description: name: get_it - sha256: e6017ce7fdeaf218dc51a100344d8cb70134b80e28b760f8bb23c242437bafd7 + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 url: "https://pub.dev" source: hosted - version: "7.6.7" + version: "7.7.0" glassmorphism: dependency: "direct main" description: @@ -620,34 +620,34 @@ packages: dependency: "direct main" description: name: image_picker - sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" url: "https://pub.dev" source: hosted - version: "1.0.7" + version: "1.1.2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" + sha256: "4161e1f843d8480d2e9025ee22411778c3c9eb7e40076dcf2da23d8242b7b51c" url: "https://pub.dev" source: hosted - version: "0.8.9+3" + version: "0.8.12+3" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 + sha256: "5d6eb13048cd47b60dbf1a5495424dea226c5faf3950e20bf8120a58efb5b5f3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.4" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" url: "https://pub.dev" source: hosted - version: "0.8.9+1" + version: "0.8.12" image_picker_linux: dependency: transitive description: @@ -668,10 +668,10 @@ packages: dependency: transitive description: name: image_picker_platform_interface - sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" url: "https://pub.dev" source: hosted - version: "2.9.3" + version: "2.10.0" image_picker_windows: dependency: transitive description: @@ -692,10 +692,10 @@ packages: dependency: transitive description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" js: dependency: transitive description: @@ -708,50 +708,50 @@ packages: dependency: "direct main" description: name: just_audio - sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b + sha256: "5abfab1d199e01ab5beffa61b3e782350df5dad036cb8c83b79fa45fc656614e" url: "https://pub.dev" source: hosted - version: "0.9.37" + version: "0.9.38" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - sha256: c3dee0014248c97c91fe6299edb73dc4d6c6930a2f4f713579cd692d9e47f4a1 + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - sha256: "134356b0fe3d898293102b33b5fd618831ffdc72bb7a1b726140abdf22772b70" + sha256: "0edb481ad4aa1ff38f8c40f1a3576013c3420bf6669b686fe661627d49bc606c" url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.11" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -772,26 +772,26 @@ packages: dependency: "direct main" description: name: local_auth - sha256: "27679ed8e0d7daab2357db6bb7076359e083a56b295c0c59723845301da6aed9" + sha256: "280421b416b32de31405b0a25c3bd42dfcef2538dfbb20c03019e02a5ed55ed0" url: "https://pub.dev" source: hosted - version: "2.1.8" + version: "2.2.0" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: "3bcd732dda7c75fcb7ddaef12e131230f53dcc8c00790d0d6efb3aa0fbbeda57" + sha256: "48dfb2d954da8ef6a77adfc93a29998f7729e9308eaa817e91dea4500317b2c8" url: "https://pub.dev" source: hosted - version: "1.0.37" - local_auth_ios: + version: "1.0.39" + local_auth_darwin: dependency: transitive description: - name: local_auth_ios - sha256: eb283b530029b334698918f1e282d4483737cbca972ff21b9193be3d6de8e2b8 + name: local_auth_darwin + sha256: e424ebf90d5233452be146d4a7da4bcd7a70278b67791592f3fde1bda8eef9e2 url: "https://pub.dev" source: hosted - version: "1.1.6" + version: "1.3.1" local_auth_platform_interface: dependency: transitive description: @@ -844,18 +844,18 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" nested: dependency: transitive description: @@ -916,26 +916,26 @@ packages: dependency: transitive description: name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.5" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -972,18 +972,18 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "8bb852cd759488893805c3161d0b2b5db55db52f773dbb014420b304055ba2c5" + sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54 url: "https://pub.dev" source: hosted - version: "12.0.6" + version: "12.0.7" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 url: "https://pub.dev" source: hosted - version: "9.4.4" + version: "9.4.5" permission_handler_html: dependency: transitive description: @@ -1012,10 +1012,10 @@ packages: dependency: transitive description: name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.0.2" pin_code_fields: dependency: "direct main" description: @@ -1028,10 +1028,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -1040,14 +1040,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" - url: "https://pub.dev" - source: hosted - version: "3.7.4" provider: dependency: transitive description: @@ -1068,10 +1060,10 @@ packages: dependency: "direct main" description: name: scgateway_flutter_plugin - sha256: c52831292d73b7004af314f7e34ea4c510110da3e7d1cc274a745b3524e6a724 + sha256: "271354169511e130668b0cd06c3bd2c1c64a7a7383a328120587a5170ec75dd8" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0+3" share_plus: dependency: transitive description: @@ -1092,26 +1084,26 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.3" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -1132,10 +1124,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" shared_preferences_windows: dependency: transitive description: @@ -1177,18 +1169,18 @@ packages: dependency: transitive description: name: sqflite - sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.3+1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" stack_trace: dependency: transitive description: @@ -1217,10 +1209,10 @@ packages: dependency: "direct main" description: name: syncfusion_flutter_charts - sha256: "5f868f5a82380ef1b3de416b7812e1ac7acce6a629f9281618adee81d90716cc" + sha256: bdb7cc5814ceb187793cea587f4a5946afcffd96726b219cee79df8460f44b7b url: "https://pub.dev" source: hosted - version: "21.2.10" + version: "21.2.4" syncfusion_flutter_core: dependency: transitive description: @@ -1297,10 +1289,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" timeago: dependency: "direct main" description: @@ -1321,26 +1313,26 @@ packages: dependency: transitive description: name: url_launcher - sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.3" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.3.0" url_launcher_linux: dependency: transitive description: @@ -1353,10 +1345,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: @@ -1369,10 +1361,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" url_launcher_windows: dependency: transitive description: @@ -1425,26 +1417,26 @@ packages: dependency: "direct main" description: name: video_player - sha256: afc65f4b8bcb2c188f64a591f84fb471f4f2e19fc607c65fd8d2f8fedb3dec23 + sha256: aced48e701e24c02b0b7f881a8819e4937794e46b5a5821005e2bf3b40a324cc url: "https://pub.dev" source: hosted - version: "2.8.3" + version: "2.8.7" video_player_android: dependency: transitive description: name: video_player_android - sha256: "4dd9b8b86d70d65eecf3dcabfcdfbb9c9115d244d022654aba49a00336d540c2" + sha256: "9529001630e42988f755772972d5014d30121610700e8e502278a245939f8fc8" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.5.0" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: bc923884640d6dc403050586eb40713cdb8d1d84e6886d8aca50ab04c59124c2 + sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.6.1" video_player_platform_interface: dependency: transitive description: @@ -1457,10 +1449,10 @@ packages: dependency: transitive description: name: video_player_web - sha256: "34beb3a07d4331a24f7e7b2f75b8e2b103289038e07e65529699a671b6a6e2cb" + sha256: ff4d69a6614b03f055397c27a71c9d3ddea2b2a23d71b2ba0164f59ca32b8fe2 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.3.1" videoplayerkb: dependency: "direct main" description: @@ -1474,10 +1466,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" wakelock: dependency: transitive description: @@ -1522,18 +1514,26 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.5.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "24301d8c293ce6fe327ffe6f59d8fd8834735f0ec36e4fd383ec7ff8a64aa078" + url: "https://pub.dev" + source: hosted + version: "0.1.5" web_socket_channel: dependency: "direct main" description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: a2d56211ee4d35d9b344d9d4ce60f362e4f5d1aafb988302906bd732bc731276 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "3.0.0" win32: dependency: transitive description: @@ -1554,10 +1554,10 @@ packages: dependency: transitive description: name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.5.0" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0"