BIN
assets/images/png/search.png
Normal file
BIN
assets/images/png/search.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
@@ -22,6 +22,7 @@ class CustomTextFormField extends StatefulWidget {
|
||||
this.onTap,
|
||||
this.textCapV,
|
||||
this.suffixIcon,
|
||||
this.autofocus,
|
||||
}) : super(key: key);
|
||||
|
||||
final dynamic validator;
|
||||
@@ -41,6 +42,7 @@ class CustomTextFormField extends StatefulWidget {
|
||||
final VoidCallback? onTap;
|
||||
final TextCapitalization? textCapV;
|
||||
final Widget? suffixIcon;
|
||||
final bool? autofocus;
|
||||
|
||||
@override
|
||||
State<CustomTextFormField> createState() => _CustomTextFormFieldState();
|
||||
@@ -84,6 +86,7 @@ class _CustomTextFormFieldState extends State<CustomTextFormField> {
|
||||
],
|
||||
),
|
||||
child: TextFormField(
|
||||
autofocus: widget.autofocus!,
|
||||
textAlignVertical: TextAlignVertical.center,
|
||||
cursorColor: Color(0xff4A73FB),
|
||||
initialValue: widget.value,
|
||||
|
||||
@@ -91,4 +91,7 @@ class ApiUrls {
|
||||
|
||||
//setting
|
||||
static String setting = "${base}update-notification";
|
||||
|
||||
//search
|
||||
static String searchData = "${base}search-stock";
|
||||
}
|
||||
|
||||
64
lib/model/HomeModel/search_model.dart
Normal file
64
lib/model/HomeModel/search_model.dart
Normal file
@@ -0,0 +1,64 @@
|
||||
class SearchModel {
|
||||
String? status;
|
||||
int? statusCode;
|
||||
String? message;
|
||||
List<Data>? data;
|
||||
|
||||
SearchModel({this.status, this.statusCode, this.message, this.data});
|
||||
|
||||
SearchModel.fromJson(Map<String, dynamic> json) {
|
||||
status = json['status'];
|
||||
statusCode = json['status_code'];
|
||||
message = json['message'];
|
||||
if (json['data'] != null) {
|
||||
data = <Data>[];
|
||||
json['data'].forEach((v) {
|
||||
data!.add(new Data.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
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<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
instrumentKey = json['instrument_key'];
|
||||
tradingSymbol = json['trading_symbol'];
|
||||
isActive = json['is_active'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -61,4 +61,7 @@ class RouteName {
|
||||
|
||||
//option chain
|
||||
static const String optionChain = '/optionChain';
|
||||
|
||||
//search
|
||||
static const String search = '/search';
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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<HomeScreen> {
|
||||
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<HomeScreen> {
|
||||
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<HomeScreen> {
|
||||
: 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<HomeScreen> {
|
||||
fontFamily: 'hiragino',
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
!homeModel.data!.isUpstoxTokenRefreshed!
|
||||
? const SizedBox()
|
||||
: sizedBoxHeight(25.h),
|
||||
@@ -261,10 +282,19 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
SvgPicture.asset(
|
||||
'assets/images/svg/Vector (2).svg'),
|
||||
sizedBoxWidth(10.w),
|
||||
InkWell(
|
||||
ProfileObj!.data!.isSubscriptionTaken == true
|
||||
? SizedBox()
|
||||
: InkWell(
|
||||
child: text18W500('UNLOCK NOW!'),
|
||||
onTap: () {
|
||||
throw Exception();
|
||||
onTap: () async {
|
||||
SharedPreferences prefs =
|
||||
await SharedPreferences
|
||||
.getInstance();
|
||||
|
||||
Get.to(WebViewSubscription(
|
||||
token: prefs
|
||||
.getString('accessToken')
|
||||
.toString()));
|
||||
},
|
||||
),
|
||||
],
|
||||
@@ -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',
|
||||
|
||||
@@ -255,21 +255,23 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
text22W600("No Data Available !"),
|
||||
],
|
||||
))
|
||||
: ListView.builder(
|
||||
itemCount: callRecommendationsModel.data!.activeCalls!.length,
|
||||
: 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: productsController.selectedIndex.value == 0
|
||||
? ProfileObj!.data!.subscriptionData!.productData!
|
||||
.productName! ==
|
||||
"Swing Trade"
|
||||
? cardSwingWidget(
|
||||
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<ShortTrade> {
|
||||
'${callRecommendationsModel.data!.activeCalls![index].duration}',
|
||||
action: callRecommendationsModel
|
||||
.data!.activeCalls![index].actionData!.name!,
|
||||
));
|
||||
})
|
||||
: 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()));
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
: Text("Please Subscribe to Swing trade")
|
||||
: productsController.selectedIndex.value == 1
|
||||
? ProfileObj!.data!.subscriptionData!.productData!
|
||||
? ProfileObj!.data!.isSubscriptionTaken == true &&
|
||||
ProfileObj!.data!.subscriptionData!.productData!
|
||||
.productName! ==
|
||||
"MultiBagger"
|
||||
? cardMultibaggerWidget(
|
||||
? 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,7 +354,8 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
pdfname: "Download Pdf",
|
||||
pdfLink: callRecommendationsModel
|
||||
.data!.activeCalls![index].docs!,
|
||||
)
|
||||
));
|
||||
})
|
||||
: Center(
|
||||
child: commonGlassContainer(
|
||||
width: double.infinity,
|
||||
@@ -322,8 +367,7 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
text18W500(
|
||||
"Please Subscribe to Multibagger"),
|
||||
text18W500("Please Subscribe to Multibagger"),
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
@@ -333,8 +377,7 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
text: "Unlock Now",
|
||||
onTap: () async {
|
||||
SharedPreferences prefs =
|
||||
await SharedPreferences
|
||||
.getInstance();
|
||||
await SharedPreferences.getInstance();
|
||||
|
||||
Get.to(WebViewSubscription(
|
||||
token: prefs
|
||||
@@ -348,16 +391,22 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
),
|
||||
),
|
||||
)
|
||||
// Text("Please Subscribe to Multibagger")
|
||||
: ProfileObj!.data!.subscriptionData!.productData!
|
||||
: ProfileObj!.data!.isSubscriptionTaken == true &&
|
||||
ProfileObj!.data!.subscriptionData!.productData!
|
||||
.productName! ==
|
||||
"Options"
|
||||
? cardOptionWidget(
|
||||
? 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,7 +423,8 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
"₹ ${callRecommendationsModel.data!.activeCalls![index].targetPrice}",
|
||||
stoploss:
|
||||
"₹ ${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
|
||||
)
|
||||
));
|
||||
})
|
||||
: Center(
|
||||
child: commonGlassContainer(
|
||||
width: double.infinity,
|
||||
@@ -386,8 +436,7 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
text18W500(
|
||||
"Please Subscribe to Options"),
|
||||
text18W500("Please Subscribe to Options"),
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
@@ -397,8 +446,7 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
text: "Unlock Now",
|
||||
onTap: () async {
|
||||
SharedPreferences prefs =
|
||||
await SharedPreferences
|
||||
.getInstance();
|
||||
await SharedPreferences.getInstance();
|
||||
|
||||
Get.to(WebViewSubscription(
|
||||
token: prefs
|
||||
@@ -411,9 +459,8 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
void _unlockbottomsheet() {
|
||||
@@ -472,8 +519,8 @@ class _ShortTradeState extends State<ShortTrade> {
|
||||
.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<ShortTrade> {
|
||||
? 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<ShortTrade> {
|
||||
.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<ShortTrade> {
|
||||
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<ShortTrade> {
|
||||
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<ShortTrade> {
|
||||
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<ShortTrade> {
|
||||
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<ShortTrade> {
|
||||
}
|
||||
|
||||
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<ShortTrade> {
|
||||
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,
|
||||
|
||||
201
lib/view/MainScreen/stockDetails/Search.dart
Normal file
201
lib/view/MainScreen/stockDetails/Search.dart
Normal file
@@ -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<Search> createState() => _SearchState();
|
||||
}
|
||||
|
||||
class _SearchState extends State<Search> {
|
||||
RxBool isLoading = true.obs;
|
||||
SearchModel searchModel = SearchModel();
|
||||
TextEditingController searchController = TextEditingController();
|
||||
Timer? _debounce;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_loadSearchData();
|
||||
}
|
||||
|
||||
Future<void> _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),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -39,68 +39,68 @@ class _StockDetailsScreenState extends State<StockDetailsScreen> {
|
||||
void initState() {
|
||||
dv.log(instrumentName);
|
||||
if (productsController.isUpstoxTokenNotExpired.value) {
|
||||
// StockDetailsApi()
|
||||
// .getStockDetails(
|
||||
// FormData.fromMap({"upstox_instrument_key": instrumentName}))
|
||||
// .then((value) {
|
||||
// final Map<String, dynamic> data = value.data;
|
||||
StockDetailsApi()
|
||||
.getStockDetails(
|
||||
FormData.fromMap({"upstox_instrument_key": instrumentName}))
|
||||
.then((value) {
|
||||
final Map<String, dynamic> data = value.data;
|
||||
|
||||
// Map<String, dynamic> data1 = data["data"]['stock_data']['data'];
|
||||
// String dynamicKey = data1.keys.first;
|
||||
// // Access nested data using dynamic key
|
||||
// Map<String, dynamic> dynamicData = data1[dynamicKey];
|
||||
Map<String, dynamic> data1 = data["data"]['stock_data']['data'];
|
||||
String dynamicKey = data1.keys.first;
|
||||
// Access nested data using dynamic key
|
||||
Map<String, dynamic> dynamicData = data1[dynamicKey];
|
||||
|
||||
// List<Candles>? candles = [];
|
||||
List<Candles>? 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;
|
||||
}
|
||||
|
||||
@@ -165,7 +165,9 @@ class _KycState extends State<Kyc> {
|
||||
? SizedBox()
|
||||
: InkWell(
|
||||
onTap: () {
|
||||
Get.toNamed(RouteName.updateriskprofile);
|
||||
Get.toNamed(RouteName.updateriskprofile, arguments: {
|
||||
"fromScreen": "login-flow",
|
||||
});
|
||||
},
|
||||
child: text16W400("skip"),
|
||||
),
|
||||
|
||||
25
lib/view_model/HomeApi/Search_api.dart
Normal file
25
lib/view_model/HomeApi/Search_api.dart
Normal file
@@ -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<ResponseData<dynamic>> searchData({String searchText = ""}) async {
|
||||
final response = await NetworkApiServices().getApi(
|
||||
ApiUrls.searchData + "?search=${searchText}",
|
||||
);
|
||||
log("data received");
|
||||
if (response.status == ResponseStatus.SUCCESS) {
|
||||
Map<String, dynamic> responseData =
|
||||
Map<String, dynamic>.from(response.data);
|
||||
if (responseData['status'] == "success") {
|
||||
return response;
|
||||
} else {
|
||||
return ResponseData<dynamic>(
|
||||
responseData['message'], ResponseStatus.FAILED);
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user