From 338a143f735ec18e20988d10f07b6b1fd50751a3 Mon Sep 17 00:00:00 2001 From: Rajshinde046 Date: Fri, 7 Jun 2024 17:00:36 +0530 Subject: [PATCH] search completed --- assets/images/png/search.png | Bin 0 -> 2760 bytes lib/Utils/Common/CustomTextFormField.dart | 3 + lib/Utils/api_urls.dart | 3 + lib/model/HomeModel/search_model.dart | 64 ++++ lib/resources/routes/route_name.dart | 3 + lib/resources/routes/routes.dart | 9 +- lib/view/MainScreen/HomeScreen.dart | 78 +++-- lib/view/MainScreen/ShortTrade.dart | 305 ++++++++++-------- lib/view/MainScreen/stockDetails/Search.dart | 201 ++++++++++++ .../stockDetails/stock_details_screen.dart | 112 +++---- lib/view/login/Kyc.dart | 4 +- lib/view_model/HomeApi/Search_api.dart | 25 ++ 12 files changed, 596 insertions(+), 211 deletions(-) create mode 100644 assets/images/png/search.png create mode 100644 lib/model/HomeModel/search_model.dart create mode 100644 lib/view/MainScreen/stockDetails/Search.dart create mode 100644 lib/view_model/HomeApi/Search_api.dart diff --git a/assets/images/png/search.png b/assets/images/png/search.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2f44cdbc1c026c5dac38add9adb91ebcbbcdf7 GIT binary patch literal 2760 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 createState() => _CustomTextFormFieldState(); @@ -84,6 +86,7 @@ class _CustomTextFormFieldState extends State { ], ), child: TextFormField( + autofocus: widget.autofocus!, textAlignVertical: TextAlignVertical.center, cursorColor: Color(0xff4A73FB), initialValue: widget.value, diff --git a/lib/Utils/api_urls.dart b/lib/Utils/api_urls.dart index 694ff41..7e0f3dc 100644 --- a/lib/Utils/api_urls.dart +++ b/lib/Utils/api_urls.dart @@ -91,4 +91,7 @@ class ApiUrls { //setting static String setting = "${base}update-notification"; + + //search + static String searchData = "${base}search-stock"; } diff --git a/lib/model/HomeModel/search_model.dart b/lib/model/HomeModel/search_model.dart new file mode 100644 index 0000000..61f20c3 --- /dev/null +++ b/lib/model/HomeModel/search_model.dart @@ -0,0 +1,64 @@ +class SearchModel { + String? status; + int? statusCode; + String? message; + List? data; + + SearchModel({this.status, this.statusCode, this.message, this.data}); + + SearchModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + String? name; + String? instrumentKey; + String? tradingSymbol; + int? isActive; + + Data( + {this.id, + this.name, + this.instrumentKey, + this.tradingSymbol, + this.isActive}); + + Data.fromJson(Map json) { + id = json['id']; + name = json['name']; + instrumentKey = json['instrument_key']; + tradingSymbol = json['trading_symbol']; + isActive = json['is_active']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['instrument_key'] = this.instrumentKey; + data['trading_symbol'] = this.tradingSymbol; + data['is_active'] = this.isActive; + return data; + } +} diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index 12ca210..51e50c4 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -61,4 +61,7 @@ class RouteName { //option chain static const String optionChain = '/optionChain'; + + //search + static const String search = '/search'; } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index ba483a8..7fc6ce7 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -3,6 +3,7 @@ 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/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'; @@ -203,6 +204,12 @@ class AppRoutes { GetPage( name: RouteName.optionChain, page: () => const OptionChainScreen(), - ) + ), + + //search + GetPage( + name: RouteName.search, + page: () => const Search(), + ), ]; } diff --git a/lib/view/MainScreen/HomeScreen.dart b/lib/view/MainScreen/HomeScreen.dart index 5a192f8..f2208d4 100644 --- a/lib/view/MainScreen/HomeScreen.dart +++ b/lib/view/MainScreen/HomeScreen.dart @@ -4,6 +4,7 @@ import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:gap/gap.dart'; @@ -24,10 +25,10 @@ import 'package:traderscircuit/view/MainScreen/ExploreUnseen.dart'; import 'package:traderscircuit/view/MainScreen/MainScreen.dart'; import 'package:traderscircuit/view/Sidemenu/ContentByte/PlayerWidget.dart'; import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart'; +import 'package:traderscircuit/view/Sidemenu/webview_subscription.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; import 'package:traderscircuit/view_model/HomeApi/home_api.dart'; -import '../../Utils/Common/CustomTextFormField.dart'; import '../../view_model/ProfileAPI/GetProfileApi.dart'; class HomeScreen extends StatefulWidget { @@ -89,11 +90,41 @@ class _HomeScreenState extends State { drawer: Container(child: const SideMenu()), extendBody: true, appBar: AppBar( + toolbarHeight: 70.h, scrolledUnderElevation: 0.0, backgroundColor: Colors.black, elevation: 0, automaticallyImplyLeading: false, titleSpacing: 0, + centerTitle: true, + title: GestureDetector( + onTap: () { + Get.toNamed(RouteName.search); + }, + child: commonGlassContainer( + width: 250, + height: 50, + borderradius: 8, + customWidget: Center( + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SizedBox( + width: 10.w, + ), + Icon( + Icons.search, + color: Colors.white, + ), + SizedBox( + width: 15.w, + ), + text20W400("Search"), + ], + ), + ), + ), + ), leading: InkWell( onTap: () { _scaffoldKey1.currentState?.openDrawer(); @@ -114,7 +145,7 @@ class _HomeScreenState extends State { child: Padding( padding: EdgeInsets.only(right: 14.w), child: SvgPicture.asset('assets/images/svg/Group 1897.svg')), - ), + ) ], ), body: Obx( @@ -135,19 +166,6 @@ class _HomeScreenState extends State { : ListView( physics: const BouncingScrollPhysics(), children: [ - sizedBoxHeight(15.h), - CustomTextFormField1( - hintText: 'Search', - leadingIcon: SizedBox( - height: 20, - width: 20, - child: Center( - child: SvgPicture.asset( - 'assets/images/svg/search-svgrepo-com.svg', - ), - ), - ), - ), sizedBoxHeight(20.h), Text( "Welcome $userName", @@ -157,6 +175,9 @@ class _HomeScreenState extends State { fontFamily: 'hiragino', fontWeight: FontWeight.w500), ), + SizedBox( + height: 10, + ), !homeModel.data!.isUpstoxTokenRefreshed! ? const SizedBox() : sizedBoxHeight(25.h), @@ -261,12 +282,21 @@ class _HomeScreenState extends State { SvgPicture.asset( 'assets/images/svg/Vector (2).svg'), sizedBoxWidth(10.w), - InkWell( - child: text18W500('UNLOCK NOW!'), - onTap: () { - throw Exception(); - }, - ), + ProfileObj!.data!.isSubscriptionTaken == true + ? SizedBox() + : InkWell( + child: text18W500('UNLOCK NOW!'), + onTap: () async { + SharedPreferences prefs = + await SharedPreferences + .getInstance(); + + Get.to(WebViewSubscription( + token: prefs + .getString('accessToken') + .toString())); + }, + ), ], ), sizedBoxHeight(25.h), @@ -777,16 +807,16 @@ Widget commoncontainer({ ), ), child: Padding( - padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w), + padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 6.w), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ text14W400_979797(text), - sizedBoxWidth(8.w), + sizedBoxWidth(7.w), text16W600(amount), - sizedBoxWidth(8.w), + sizedBoxWidth(7.w), rate.contains("-") ? SvgPicture.asset( 'assets/images/svg/Line 587.svg', diff --git a/lib/view/MainScreen/ShortTrade.dart b/lib/view/MainScreen/ShortTrade.dart index 8d536d1..ca505a7 100644 --- a/lib/view/MainScreen/ShortTrade.dart +++ b/lib/view/MainScreen/ShortTrade.dart @@ -255,21 +255,23 @@ class _ShortTradeState extends State { text22W600("No Data Available !"), ], )) - : ListView.builder( - itemCount: callRecommendationsModel.data!.activeCalls!.length, - itemBuilder: (ctx, index) { - return Padding( - padding: EdgeInsets.only(top: 20.h, bottom: 5.h), - child: productsController.selectedIndex.value == 0 - ? ProfileObj!.data!.subscriptionData!.productData! - .productName! == - "Swing Trade" - ? cardSwingWidget( + : productsController.selectedIndex.value == 0 + ? ProfileObj!.data!.isSubscriptionTaken == true && + ProfileObj!.data!.subscriptionData!.productData! + .productName! == + "Swing Trade" + ? ListView.builder( + itemCount: + callRecommendationsModel.data!.activeCalls!.length, + itemBuilder: (ctx, index) { + return Padding( + padding: EdgeInsets.only(top: 20.h, bottom: 5.h), + child: cardSwingWidget( instrumentName: callRecommendationsModel .data!.activeCalls![index].instrumentKey!, pdfLink: "", - image: callRecommendationsModel - .data!.activeCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.activeCalls![index].stockImage!, text: callRecommendationsModel .data!.activeCalls![index].stockName!, amount: @@ -282,17 +284,59 @@ class _ShortTradeState extends State { '${callRecommendationsModel.data!.activeCalls![index].duration}', action: callRecommendationsModel .data!.activeCalls![index].actionData!.name!, - ) - : Text("Please Subscribe to Swing trade") - : productsController.selectedIndex.value == 1 - ? ProfileObj!.data!.subscriptionData!.productData! - .productName! == - "MultiBagger" - ? cardMultibaggerWidget( + )); + }) + : Center( + child: commonGlassContainer( + width: double.infinity, + height: 150, + borderradius: 2, + customWidget: Center( + child: Column( + children: [ + SizedBox( + height: 20, + ), + text18W500("Please Subscribe to Swing Trade"), + SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: CommonBtn( + text: "Unlock Now", + onTap: () async { + SharedPreferences prefs = + await SharedPreferences.getInstance(); + + Get.to(WebViewSubscription( + token: prefs + .getString('accessToken') + .toString())); + }, + ), + ) + ], + ), + ), + ), + ) + : productsController.selectedIndex.value == 1 + ? ProfileObj!.data!.isSubscriptionTaken == true && + ProfileObj!.data!.subscriptionData!.productData! + .productName! == + "MultiBagger" + ? ListView.builder( + itemCount: + callRecommendationsModel.data!.activeCalls!.length, + itemBuilder: (ctx, index) { + return Padding( + padding: EdgeInsets.only(top: 20.h, bottom: 5.h), + child: cardMultibaggerWidget( instrumentName: callRecommendationsModel .data!.activeCalls![index].instrumentKey!, - image: callRecommendationsModel - .data!.activeCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.activeCalls![index].stockImage!, action: callRecommendationsModel.data! .activeCalls![index].actionData!.name!, text: callRecommendationsModel @@ -310,54 +354,59 @@ class _ShortTradeState extends State { pdfname: "Download Pdf", pdfLink: callRecommendationsModel .data!.activeCalls![index].docs!, - ) - : Center( - child: commonGlassContainer( - width: double.infinity, - height: 150, - borderradius: 2, - customWidget: Center( - child: Column( - children: [ - SizedBox( - height: 20, - ), - text18W500( - "Please Subscribe to Multibagger"), - SizedBox( - height: 20, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: CommonBtn( - text: "Unlock Now", - onTap: () async { - SharedPreferences prefs = - await SharedPreferences - .getInstance(); - - Get.to(WebViewSubscription( - token: prefs - .getString('accessToken') - .toString())); - }, - ), - ) - ], - ), - ), + )); + }) + : Center( + child: commonGlassContainer( + width: double.infinity, + height: 150, + borderradius: 2, + customWidget: Center( + child: Column( + children: [ + SizedBox( + height: 20, ), - ) - // Text("Please Subscribe to Multibagger") - : ProfileObj!.data!.subscriptionData!.productData! - .productName! == - "Options" - ? cardOptionWidget( + text18W500("Please Subscribe to Multibagger"), + SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: CommonBtn( + text: "Unlock Now", + onTap: () async { + SharedPreferences prefs = + await SharedPreferences.getInstance(); + + Get.to(WebViewSubscription( + token: prefs + .getString('accessToken') + .toString())); + }, + ), + ) + ], + ), + ), + ), + ) + : ProfileObj!.data!.isSubscriptionTaken == true && + ProfileObj!.data!.subscriptionData!.productData! + .productName! == + "Options" + ? ListView.builder( + itemCount: + callRecommendationsModel.data!.activeCalls!.length, + itemBuilder: (ctx, index) { + return Padding( + padding: EdgeInsets.only(top: 20.h, bottom: 5.h), + child: cardOptionWidget( instrumentName: callRecommendationsModel .data!.activeCalls![index].instrumentKey!, pdfLink: "", - image: callRecommendationsModel - .data!.activeCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.activeCalls![index].stockImage!, action: callRecommendationsModel.data! .activeCalls![index].actionData!.name!, text: callRecommendationsModel @@ -374,47 +423,45 @@ class _ShortTradeState extends State { "₹ ${callRecommendationsModel.data!.activeCalls![index].targetPrice}", stoploss: "₹ ${callRecommendationsModel.data!.activeCalls![index].stopLoss}", - ) - : Center( - child: commonGlassContainer( - width: double.infinity, - height: 150, - borderradius: 2, - customWidget: Center( - child: Column( - children: [ - SizedBox( - height: 20, - ), - text18W500( - "Please Subscribe to Options"), - SizedBox( - height: 20, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: CommonBtn( - text: "Unlock Now", - onTap: () async { - SharedPreferences prefs = - await SharedPreferences - .getInstance(); - - Get.to(WebViewSubscription( - token: prefs - .getString('accessToken') - .toString())); - }, - ), - ) - ], - ), - ), + )); + }) + : Center( + child: commonGlassContainer( + width: double.infinity, + height: 150, + borderradius: 2, + customWidget: Center( + child: Column( + children: [ + SizedBox( + height: 20, ), - ), - ); - }); - } + text18W500("Please Subscribe to Options"), + SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: CommonBtn( + text: "Unlock Now", + onTap: () async { + SharedPreferences prefs = + await SharedPreferences.getInstance(); + + Get.to(WebViewSubscription( + token: prefs + .getString('accessToken') + .toString())); + }, + ), + ) + ], + ), + ), + ), + ); + + } void _unlockbottomsheet() { Get.bottomSheet( @@ -472,8 +519,8 @@ class _ShortTradeState extends State { .data!.exitedCalls![index].instrumentKey!, pdfLink: callRecommendationsModel .data!.exitedCalls![index].docs!, - image: callRecommendationsModel - .data!.exitedCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.exitedCalls![index].stockImage!, text: callRecommendationsModel .data!.exitedCalls![index].stockName!, amount: '₹ 196.50 - ₹ 197', @@ -490,8 +537,8 @@ class _ShortTradeState extends State { ? cardMultibaggerWidget( instrumentName: callRecommendationsModel .data!.exitedCalls![index].instrumentKey!, - image: callRecommendationsModel - .data!.exitedCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.exitedCalls![index].stockImage!, action: callRecommendationsModel .data!.exitedCalls![index].actionData!.name!, text: callRecommendationsModel @@ -515,8 +562,8 @@ class _ShortTradeState extends State { .data!.exitedCalls![index].instrumentKey!, pdfLink: callRecommendationsModel .data!.exitedCalls![index].docs!, - image: callRecommendationsModel - .data!.exitedCalls![index].stockImage!, + // image: callRecommendationsModel + // .data!.exitedCalls![index].stockImage!, action: callRecommendationsModel .data!.exitedCalls![index].actionData!.name!, text: callRecommendationsModel @@ -548,7 +595,7 @@ class _ShortTradeState extends State { required String stoploss, required String action, required String pdfLink, - required String image, + // required String image, required String instrumentName, }) { ContactUsController contactUsController = Get.put(ContactUsController()); @@ -577,11 +624,11 @@ class _ShortTradeState extends State { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CachedNetworkImage( - imageUrl: image, - width: 78.29, - height: 31, - ), + // CachedNetworkImage( + // imageUrl: image, + // width: 78.29, + // height: 31, + // ), const Gap(10), text16W700(text), const Spacer(), @@ -722,7 +769,7 @@ class _ShortTradeState extends State { required String pdfname, required String action, required String pdfLink, - required String image, + // required String image, required String instrumentName, }) { ContactUsController contactUsController = Get.put(ContactUsController()); @@ -751,11 +798,11 @@ class _ShortTradeState extends State { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CachedNetworkImage( - imageUrl: image, - width: 78.29, - height: 31, - ), + // CachedNetworkImage( + // imageUrl: image, + // width: 78.29, + // height: 31, + // ), const Gap(10), text16W700(text), const Spacer(), @@ -898,7 +945,7 @@ class _ShortTradeState extends State { } Widget cardSwingWidget({ - required String image, + // required String image, required String text, required String amount, required String targetamount, @@ -933,11 +980,11 @@ class _ShortTradeState extends State { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CachedNetworkImage( - imageUrl: image, - width: 78.29, - height: 31, - ), + // CachedNetworkImage( + // imageUrl: image, + // width: 78.29, + // height: 31, + // ), const Gap(10), Container( width: 2, diff --git a/lib/view/MainScreen/stockDetails/Search.dart b/lib/view/MainScreen/stockDetails/Search.dart new file mode 100644 index 0000000..a8b5bfe --- /dev/null +++ b/lib/view/MainScreen/stockDetails/Search.dart @@ -0,0 +1,201 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/model/HomeModel/search_model.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/MainScreen/stockDetails/stock_details_screen.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import 'package:traderscircuit/view_model/HomeApi/Search_api.dart'; +import 'dart:async'; + +class Search extends StatefulWidget { + const Search({super.key}); + + @override + State createState() => _SearchState(); +} + +class _SearchState extends State { + RxBool isLoading = true.obs; + SearchModel searchModel = SearchModel(); + TextEditingController searchController = TextEditingController(); + Timer? _debounce; + + @override + void initState() { + super.initState(); + _loadSearchData(); + } + + Future _loadSearchData() async { + if (searchController.text.isEmpty || searchController.text.length < 2) { + setState(() { + searchModel = SearchModel(data: []); + isLoading.value = false; + }); + return; + } + + final value = + await SearchAPI().searchData(searchText: searchController.text); + setState(() { + searchModel = SearchModel.fromJson(value.data); + isLoading.value = false; + }); + } + + void _onSearchChanged() { + if (_debounce?.isActive ?? false) _debounce?.cancel(); + _debounce = Timer(const Duration(milliseconds: 300), () { + setState(() { + isLoading.value = true; + }); + _loadSearchData(); + }); + } + + @override + void dispose() { + _debounce?.cancel(); + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + toolbarHeight: 70.h, + scrolledUnderElevation: 0.0, + backgroundColor: Colors.black, + elevation: 0, + automaticallyImplyLeading: false, + titleSpacing: 0, + centerTitle: true, + leading: GestureDetector( + onTap: () { + Get.back(); + }, + child: Center( + child: Icon( + Icons.arrow_back_ios, + color: Colors.white, + ), + ), + ), + ), + // appBar: const CommonAppbar( + // titleTxt: "", + // ), + backgroundColor: Colors.black, + extendBody: true, + body: Obx( + () => Stack( + children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: Column( + children: [ + CustomTextFormField( + autofocus: true, + onInput: (p0) { + _onSearchChanged(); + }, + leadingIcon: const Icon( + Icons.search, + color: Colors.white, + ), + hintText: "Search", + texttype: TextInputType.text, + textEditingController: searchController, + ), + SizedBox( + height: 10.h, + ), + Expanded( + child: isLoading.value + ? const Center( + child: CircularProgressIndicator( + color: Color(0xFF0093FF), + ), + ) + : searchModel.data == null || searchModel.data!.isEmpty + ? const Center( + child: Text( + "Try Searching For TATA MOTORS, HCL...", + style: TextStyle(color: Colors.white), + ), + ) + : ListView.separated( + shrinkWrap: true, + itemCount: searchModel.data?.length ?? 0, + itemBuilder: (context, index) { + return InkWell( + onTap: () { + Get.to(const StockDetailsScreen(), + arguments: { + "instrument_name": searchModel.data! + .elementAt(index) + .instrumentKey, + }); + }, + child: Row( + children: [ + Image.asset( + "assets/images/png/search.png", + height: 35.h, + width: 35.w, + ), + SizedBox( + width: 25.w, + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + width: 230.w, + child: text16W500(searchModel + .data! + .elementAt(index) + .name ?? + ""), + ), + SizedBox( + width: 297.w, + child: text12W400( + searchModel.data! + .elementAt(index) + .tradingSymbol ?? + "", + ), + ), + ], + ), + ], + ), + ); + }, + separatorBuilder: + (BuildContext context, int index) => + const Divider( + color: Color(0xff242424), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/view/MainScreen/stockDetails/stock_details_screen.dart b/lib/view/MainScreen/stockDetails/stock_details_screen.dart index e8451c6..c38be91 100644 --- a/lib/view/MainScreen/stockDetails/stock_details_screen.dart +++ b/lib/view/MainScreen/stockDetails/stock_details_screen.dart @@ -39,68 +39,68 @@ class _StockDetailsScreenState extends State { void initState() { dv.log(instrumentName); if (productsController.isUpstoxTokenNotExpired.value) { - // StockDetailsApi() - // .getStockDetails( - // FormData.fromMap({"upstox_instrument_key": instrumentName})) - // .then((value) { - // final Map data = value.data; + 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; - // }); + isLoading.value = false; + }); - initializeWebSocket(); + // initializeWebSocket(); } else { isLoading.value = false; } diff --git a/lib/view/login/Kyc.dart b/lib/view/login/Kyc.dart index 9a24209..66f8532 100644 --- a/lib/view/login/Kyc.dart +++ b/lib/view/login/Kyc.dart @@ -165,7 +165,9 @@ class _KycState extends State { ? SizedBox() : InkWell( onTap: () { - Get.toNamed(RouteName.updateriskprofile); + Get.toNamed(RouteName.updateriskprofile, arguments: { + "fromScreen": "login-flow", + }); }, child: text16W400("skip"), ), diff --git a/lib/view_model/HomeApi/Search_api.dart b/lib/view_model/HomeApi/Search_api.dart new file mode 100644 index 0000000..3a9440d --- /dev/null +++ b/lib/view_model/HomeApi/Search_api.dart @@ -0,0 +1,25 @@ +import 'dart:developer'; + +import 'package:traderscircuit/Utils/api_urls.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; +import 'package:traderscircuit/data/network/network_api_services.dart'; + +class SearchAPI { + Future> searchData({String searchText = ""}) async { + final response = await NetworkApiServices().getApi( + ApiUrls.searchData + "?search=${searchText}", + ); + log("data received"); + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + return response; + } else { + return ResponseData( + responseData['message'], ResponseStatus.FAILED); + } + } + return response; + } +}