home screen stocks api, subscription
This commit is contained in:
BIN
assets/images/png/under_maintenance.png
Normal file
BIN
assets/images/png/under_maintenance.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
3
assets/images/svg/up_arrow.svg
Normal file
3
assets/images/svg/up_arrow.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.35355 0.646447C4.15829 0.451184 3.84171 0.451184 3.64645 0.646447L0.464466 3.82843C0.269204 4.02369 0.269204 4.34027 0.464466 4.53553C0.659728 4.7308 0.976311 4.7308 1.17157 4.53553L4 1.70711L6.82843 4.53553C7.02369 4.7308 7.34027 4.7308 7.53553 4.53553C7.7308 4.34027 7.7308 4.02369 7.53553 3.82843L4.35355 0.646447ZM3.5 1L3.5 12L4.5 12L4.5 1L3.5 1Z" fill="#00FF00"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 482 B |
@@ -9,7 +9,7 @@ class ApiUrls {
|
|||||||
//send otp
|
//send otp
|
||||||
static String sendOtp = "${base}sendOTP";
|
static String sendOtp = "${base}sendOTP";
|
||||||
|
|
||||||
//verify otp
|
//verify otp ///9867890261
|
||||||
static String OTPVerify = "${base}OTPVerify";
|
static String OTPVerify = "${base}OTPVerify";
|
||||||
|
|
||||||
//secure access
|
//secure access
|
||||||
@@ -85,4 +85,7 @@ class ApiUrls {
|
|||||||
|
|
||||||
//Stock Details
|
//Stock Details
|
||||||
static String stockDetailsApi = "${base}get-details-of-stock";
|
static String stockDetailsApi = "${base}get-details-of-stock";
|
||||||
|
|
||||||
|
//Stock Details
|
||||||
|
static String subscriptionApi = "${base}my-subscription-page";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -318,12 +318,12 @@ Widget text14W300(String text) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget text14W400(String text) {
|
Widget text14W400(String text, {Color? clr}) {
|
||||||
return Text(
|
return Text(
|
||||||
text,
|
text,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
color: Colors.white,
|
color: clr ?? Colors.white,
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
fontFamily: 'hiragino'),
|
fontFamily: 'hiragino'),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:intl/intl.dart';
|
|||||||
|
|
||||||
class ProductsController extends GetxController {
|
class ProductsController extends GetxController {
|
||||||
RxBool isLoaded = true.obs;
|
RxBool isLoaded = true.obs;
|
||||||
|
RxBool isUpstoxTokenNotExpired = true.obs;
|
||||||
CallRecommendationsModel swingTradeModel = CallRecommendationsModel();
|
CallRecommendationsModel swingTradeModel = CallRecommendationsModel();
|
||||||
CallRecommendationsModel multibaggerModel = CallRecommendationsModel();
|
CallRecommendationsModel multibaggerModel = CallRecommendationsModel();
|
||||||
CallRecommendationsModel optionModel = CallRecommendationsModel();
|
CallRecommendationsModel optionModel = CallRecommendationsModel();
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ class HomeModel {
|
|||||||
status = json['status'];
|
status = json['status'];
|
||||||
statusCode = json['status_code'];
|
statusCode = json['status_code'];
|
||||||
message = json['message'];
|
message = json['message'];
|
||||||
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
|
data = json['data'] != null ? Data.fromJson(json['data']) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['status'] = this.status;
|
data['status'] = status;
|
||||||
data['status_code'] = this.statusCode;
|
data['status_code'] = statusCode;
|
||||||
data['message'] = this.message;
|
data['message'] = message;
|
||||||
if (this.data != null) {
|
if (this.data != null) {
|
||||||
data['data'] = this.data!.toJson();
|
data['data'] = this.data!.toJson();
|
||||||
}
|
}
|
||||||
@@ -28,65 +28,203 @@ class HomeModel {
|
|||||||
class Data {
|
class Data {
|
||||||
List<ExploreTheUnseenActiveCalls>? exploreTheUnseenActiveCalls;
|
List<ExploreTheUnseenActiveCalls>? exploreTheUnseenActiveCalls;
|
||||||
List<ExploreTheUnseenExitedCalls>? exploreTheUnseenExitedCalls;
|
List<ExploreTheUnseenExitedCalls>? exploreTheUnseenExitedCalls;
|
||||||
|
IndexLiveData? indexLiveData;
|
||||||
UserData? userData;
|
UserData? userData;
|
||||||
List<Products>? products;
|
List<Products>? products;
|
||||||
ContentByteVideo? contentByteVideo;
|
ContentByteVideo? contentByteVideo;
|
||||||
|
bool? isUpstoxTokenRefreshed;
|
||||||
|
|
||||||
Data(
|
Data(
|
||||||
{this.exploreTheUnseenActiveCalls,
|
{this.exploreTheUnseenActiveCalls,
|
||||||
this.exploreTheUnseenExitedCalls,
|
this.exploreTheUnseenExitedCalls,
|
||||||
this.userData,
|
this.userData,
|
||||||
this.products,
|
this.products,
|
||||||
this.contentByteVideo});
|
this.contentByteVideo,
|
||||||
|
this.isUpstoxTokenRefreshed,
|
||||||
|
this.indexLiveData});
|
||||||
|
|
||||||
Data.fromJson(Map<String, dynamic> json) {
|
Data.fromJson(Map<String, dynamic> json) {
|
||||||
if (json['explore_the_unseen_active_calls'] != null) {
|
if (json['explore_the_unseen_active_calls'] != null) {
|
||||||
exploreTheUnseenActiveCalls = <ExploreTheUnseenActiveCalls>[];
|
exploreTheUnseenActiveCalls = <ExploreTheUnseenActiveCalls>[];
|
||||||
json['explore_the_unseen_active_calls'].forEach((v) {
|
json['explore_the_unseen_active_calls'].forEach((v) {
|
||||||
exploreTheUnseenActiveCalls!
|
exploreTheUnseenActiveCalls!
|
||||||
.add(new ExploreTheUnseenActiveCalls.fromJson(v));
|
.add(ExploreTheUnseenActiveCalls.fromJson(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (json['explore_the_unseen_exited_calls'] != null) {
|
if (json['explore_the_unseen_exited_calls'] != null) {
|
||||||
exploreTheUnseenExitedCalls = <ExploreTheUnseenExitedCalls>[];
|
exploreTheUnseenExitedCalls = <ExploreTheUnseenExitedCalls>[];
|
||||||
json['explore_the_unseen_exited_calls'].forEach((v) {
|
json['explore_the_unseen_exited_calls'].forEach((v) {
|
||||||
exploreTheUnseenExitedCalls!
|
exploreTheUnseenExitedCalls!
|
||||||
.add(new ExploreTheUnseenExitedCalls.fromJson(v));
|
.add(ExploreTheUnseenExitedCalls.fromJson(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
userData = json['user_data'] != null
|
indexLiveData = json['index_live_data'] != null
|
||||||
? new UserData.fromJson(json['user_data'])
|
? IndexLiveData.fromJson(json['index_live_data'])
|
||||||
: null;
|
: null;
|
||||||
|
userData =
|
||||||
|
json['user_data'] != null ? UserData.fromJson(json['user_data']) : null;
|
||||||
if (json['products'] != null) {
|
if (json['products'] != null) {
|
||||||
products = <Products>[];
|
products = <Products>[];
|
||||||
json['products'].forEach((v) {
|
json['products'].forEach((v) {
|
||||||
products!.add(new Products.fromJson(v));
|
products!.add(Products.fromJson(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
contentByteVideo = json['content_byte_video'] != null
|
contentByteVideo = json['content_byte_video'] != null
|
||||||
? new ContentByteVideo.fromJson(json['content_byte_video'])
|
? ContentByteVideo.fromJson(json['content_byte_video'])
|
||||||
|
: null;
|
||||||
|
isUpstoxTokenRefreshed = json['isUpstoxTokenRefreshed'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
if (exploreTheUnseenActiveCalls != null) {
|
||||||
|
data['explore_the_unseen_active_calls'] =
|
||||||
|
exploreTheUnseenActiveCalls!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
if (exploreTheUnseenExitedCalls != null) {
|
||||||
|
data['explore_the_unseen_exited_calls'] =
|
||||||
|
exploreTheUnseenExitedCalls!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
if (indexLiveData != null) {
|
||||||
|
data['index_live_data'] = indexLiveData!.toJson();
|
||||||
|
}
|
||||||
|
if (userData != null) {
|
||||||
|
data['user_data'] = userData!.toJson();
|
||||||
|
}
|
||||||
|
if (products != null) {
|
||||||
|
data['products'] = products!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
if (contentByteVideo != null) {
|
||||||
|
data['content_byte_video'] = contentByteVideo!.toJson();
|
||||||
|
}
|
||||||
|
data['isUpstoxTokenRefreshed'] = isUpstoxTokenRefreshed;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class IndexLiveData {
|
||||||
|
String? status;
|
||||||
|
Data1? data;
|
||||||
|
|
||||||
|
IndexLiveData({this.status, this.data});
|
||||||
|
|
||||||
|
IndexLiveData.fromJson(Map<String, dynamic> json) {
|
||||||
|
status = json['status'];
|
||||||
|
data = json['data'] != null ? Data1.fromJson(json['data']) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['status'] = status;
|
||||||
|
if (this.data != null) {
|
||||||
|
data['data'] = this.data!.toJson();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Data1 {
|
||||||
|
NSEINDEXNiftyBank? nSEINDEXNiftyBank;
|
||||||
|
NSEINDEXNiftyBank? nSEINDEXNifty50;
|
||||||
|
|
||||||
|
Data1({this.nSEINDEXNiftyBank, this.nSEINDEXNifty50});
|
||||||
|
|
||||||
|
Data1.fromJson(Map<String, dynamic> json) {
|
||||||
|
nSEINDEXNiftyBank = json['NSE_INDEX:Nifty Bank'] != null
|
||||||
|
? NSEINDEXNiftyBank.fromJson(json['NSE_INDEX:Nifty Bank'])
|
||||||
|
: null;
|
||||||
|
nSEINDEXNifty50 = json['NSE_INDEX:Nifty 50'] != null
|
||||||
|
? NSEINDEXNiftyBank.fromJson(json['NSE_INDEX:Nifty 50'])
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
if (this.exploreTheUnseenActiveCalls != null) {
|
if (nSEINDEXNiftyBank != null) {
|
||||||
data['explore_the_unseen_active_calls'] =
|
data['NSE_INDEX:Nifty Bank'] = nSEINDEXNiftyBank!.toJson();
|
||||||
this.exploreTheUnseenActiveCalls!.map((v) => v.toJson()).toList();
|
|
||||||
}
|
}
|
||||||
if (this.exploreTheUnseenExitedCalls != null) {
|
if (nSEINDEXNifty50 != null) {
|
||||||
data['explore_the_unseen_exited_calls'] =
|
data['NSE_INDEX:Nifty 50'] = nSEINDEXNifty50!.toJson();
|
||||||
this.exploreTheUnseenExitedCalls!.map((v) => v.toJson()).toList();
|
|
||||||
}
|
}
|
||||||
if (this.userData != null) {
|
return data;
|
||||||
data['user_data'] = this.userData!.toJson();
|
}
|
||||||
}
|
}
|
||||||
if (this.products != null) {
|
|
||||||
data['products'] = this.products!.map((v) => v.toJson()).toList();
|
class NSEINDEXNiftyBank {
|
||||||
}
|
Ohlc? ohlc;
|
||||||
if (this.contentByteVideo != null) {
|
|
||||||
data['content_byte_video'] = this.contentByteVideo!.toJson();
|
String? timestamp;
|
||||||
|
String? instrumentToken;
|
||||||
|
String? symbol;
|
||||||
|
double? lastPrice;
|
||||||
|
|
||||||
|
double? netChange;
|
||||||
|
|
||||||
|
String? lastTradeTime;
|
||||||
|
|
||||||
|
NSEINDEXNiftyBank({
|
||||||
|
this.ohlc,
|
||||||
|
this.timestamp,
|
||||||
|
this.instrumentToken,
|
||||||
|
this.symbol,
|
||||||
|
this.lastPrice,
|
||||||
|
this.netChange,
|
||||||
|
this.lastTradeTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
NSEINDEXNiftyBank.fromJson(Map<String, dynamic> json) {
|
||||||
|
ohlc = json['ohlc'] != null ? Ohlc.fromJson(json['ohlc']) : null;
|
||||||
|
|
||||||
|
timestamp = json['timestamp'];
|
||||||
|
instrumentToken = json['instrument_token'];
|
||||||
|
symbol = json['symbol'];
|
||||||
|
lastPrice = json['last_price'];
|
||||||
|
|
||||||
|
netChange = json['net_change'];
|
||||||
|
|
||||||
|
lastTradeTime = json['last_trade_time'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
if (ohlc != null) {
|
||||||
|
data['ohlc'] = ohlc!.toJson();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data['timestamp'] = timestamp;
|
||||||
|
data['instrument_token'] = instrumentToken;
|
||||||
|
data['symbol'] = symbol;
|
||||||
|
data['last_price'] = lastPrice;
|
||||||
|
|
||||||
|
data['net_change'] = netChange;
|
||||||
|
|
||||||
|
data['last_trade_time'] = lastTradeTime;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Ohlc {
|
||||||
|
double? open;
|
||||||
|
double? high;
|
||||||
|
double? low;
|
||||||
|
double? close;
|
||||||
|
|
||||||
|
Ohlc({this.open, this.high, this.low, this.close});
|
||||||
|
|
||||||
|
Ohlc.fromJson(Map<String, dynamic> json) {
|
||||||
|
open = json['open'].toDouble();
|
||||||
|
high = json['high'].toDouble();
|
||||||
|
low = json['low'].toDouble();
|
||||||
|
close = json['close'].toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['open'] = open;
|
||||||
|
data['high'] = high;
|
||||||
|
data['low'] = low;
|
||||||
|
data['close'] = close;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,35 +284,35 @@ class ExploreTheUnseenActiveCalls {
|
|||||||
scheduleDateTime = json['schedule_date_time'];
|
scheduleDateTime = json['schedule_date_time'];
|
||||||
createdAt = json['created_at'];
|
createdAt = json['created_at'];
|
||||||
productData = json['product_data'] != null
|
productData = json['product_data'] != null
|
||||||
? new ProductData.fromJson(json['product_data'])
|
? ProductData.fromJson(json['product_data'])
|
||||||
: null;
|
: null;
|
||||||
actionData = json['action_data'] != null
|
actionData = json['action_data'] != null
|
||||||
? new ActionData.fromJson(json['action_data'])
|
? ActionData.fromJson(json['action_data'])
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['manage_product_xid'] = this.manageProductXid;
|
data['manage_product_xid'] = manageProductXid;
|
||||||
data['recommendation_actions_xid'] = this.recommendationActionsXid;
|
data['recommendation_actions_xid'] = recommendationActionsXid;
|
||||||
data['stock_name'] = this.stockName;
|
data['stock_name'] = stockName;
|
||||||
data['instrument_key'] = this.instrumentKey;
|
data['instrument_key'] = instrumentKey;
|
||||||
data['stock_image'] = this.stockImage;
|
data['stock_image'] = stockImage;
|
||||||
data['qty'] = this.qty;
|
data['qty'] = qty;
|
||||||
data['duration'] = this.duration;
|
data['duration'] = duration;
|
||||||
data['current_price'] = this.currentPrice;
|
data['current_price'] = currentPrice;
|
||||||
data['buy_price'] = this.buyPrice;
|
data['buy_price'] = buyPrice;
|
||||||
data['target_price'] = this.targetPrice;
|
data['target_price'] = targetPrice;
|
||||||
data['stop_loss'] = this.stopLoss;
|
data['stop_loss'] = stopLoss;
|
||||||
data['is_send_recommendation_now'] = this.isSendRecommendationNow;
|
data['is_send_recommendation_now'] = isSendRecommendationNow;
|
||||||
data['schedule_date_time'] = this.scheduleDateTime;
|
data['schedule_date_time'] = scheduleDateTime;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
if (this.productData != null) {
|
if (productData != null) {
|
||||||
data['product_data'] = this.productData!.toJson();
|
data['product_data'] = productData!.toJson();
|
||||||
}
|
}
|
||||||
if (this.actionData != null) {
|
if (actionData != null) {
|
||||||
data['action_data'] = this.actionData!.toJson();
|
data['action_data'] = actionData!.toJson();
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -235,35 +373,35 @@ class ExploreTheUnseenExitedCalls {
|
|||||||
scheduleDateTime = json['schedule_date_time'];
|
scheduleDateTime = json['schedule_date_time'];
|
||||||
createdAt = json['created_at'];
|
createdAt = json['created_at'];
|
||||||
productData = json['product_data'] != null
|
productData = json['product_data'] != null
|
||||||
? new ProductData.fromJson(json['product_data'])
|
? ProductData.fromJson(json['product_data'])
|
||||||
: null;
|
: null;
|
||||||
actionData = json['action_data'] != null
|
actionData = json['action_data'] != null
|
||||||
? new ActionData.fromJson(json['action_data'])
|
? ActionData.fromJson(json['action_data'])
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['manage_product_xid'] = this.manageProductXid;
|
data['manage_product_xid'] = manageProductXid;
|
||||||
data['recommendation_actions_xid'] = this.recommendationActionsXid;
|
data['recommendation_actions_xid'] = recommendationActionsXid;
|
||||||
data['stock_name'] = this.stockName;
|
data['stock_name'] = stockName;
|
||||||
data['instrument_key'] = this.instrumentKey;
|
data['instrument_key'] = instrumentKey;
|
||||||
data['stock_image'] = this.stockImage;
|
data['stock_image'] = stockImage;
|
||||||
data['qty'] = this.qty;
|
data['qty'] = qty;
|
||||||
data['duration'] = this.duration;
|
data['duration'] = duration;
|
||||||
data['current_price'] = this.currentPrice;
|
data['current_price'] = currentPrice;
|
||||||
data['buy_price'] = this.buyPrice;
|
data['buy_price'] = buyPrice;
|
||||||
data['target_price'] = this.targetPrice;
|
data['target_price'] = targetPrice;
|
||||||
data['stop_loss'] = this.stopLoss;
|
data['stop_loss'] = stopLoss;
|
||||||
data['is_send_recommendation_now'] = this.isSendRecommendationNow;
|
data['is_send_recommendation_now'] = isSendRecommendationNow;
|
||||||
data['schedule_date_time'] = this.scheduleDateTime;
|
data['schedule_date_time'] = scheduleDateTime;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
if (this.productData != null) {
|
if (productData != null) {
|
||||||
data['product_data'] = this.productData!.toJson();
|
data['product_data'] = productData!.toJson();
|
||||||
}
|
}
|
||||||
if (this.actionData != null) {
|
if (actionData != null) {
|
||||||
data['action_data'] = this.actionData!.toJson();
|
data['action_data'] = actionData!.toJson();
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -285,11 +423,11 @@ class ProductData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['product_name'] = this.productName;
|
data['product_name'] = productName;
|
||||||
data['is_active'] = this.isActive;
|
data['is_active'] = isActive;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,11 +448,11 @@ class ActionData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['name'] = this.name;
|
data['name'] = name;
|
||||||
data['is_active'] = this.isActive;
|
data['is_active'] = isActive;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,14 +486,14 @@ class UserData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['first_name'] = this.firstName;
|
data['first_name'] = firstName;
|
||||||
data['last_name'] = this.lastName;
|
data['last_name'] = lastName;
|
||||||
data['user_name'] = this.userName;
|
data['user_name'] = userName;
|
||||||
data['profile_photo'] = this.profilePhoto;
|
data['profile_photo'] = profilePhoto;
|
||||||
data['is_active'] = this.isActive;
|
data['is_active'] = isActive;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -374,10 +512,10 @@ class Products {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['title'] = this.title;
|
data['title'] = title;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -423,18 +561,18 @@ class ContentByteVideo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['id'] = this.id;
|
data['id'] = id;
|
||||||
data['content_type'] = this.contentType;
|
data['content_type'] = contentType;
|
||||||
data['title'] = this.title;
|
data['title'] = title;
|
||||||
data['description'] = this.description;
|
data['description'] = description;
|
||||||
data['tags'] = this.tags;
|
data['tags'] = tags;
|
||||||
data['file'] = this.file;
|
data['file'] = file;
|
||||||
data['category_id'] = this.categoryId;
|
data['category_id'] = categoryId;
|
||||||
data['image'] = this.image;
|
data['image'] = image;
|
||||||
data['is_active'] = this.isActive;
|
data['is_active'] = isActive;
|
||||||
data['created_at'] = this.createdAt;
|
data['created_at'] = createdAt;
|
||||||
data['link'] = this.link;
|
data['link'] = link;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,11 @@ import 'dart:developer';
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:glassmorphism/glassmorphism.dart';
|
|
||||||
import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart';
|
import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart';
|
||||||
import 'package:traderscircuit/Utils/Common/CommonTabBar.dart';
|
|
||||||
import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart';
|
import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart';
|
||||||
import 'package:traderscircuit/Utils/Common/sized_box.dart';
|
import 'package:traderscircuit/Utils/Common/sized_box.dart';
|
||||||
import 'package:traderscircuit/Utils/text.dart';
|
import 'package:traderscircuit/Utils/text.dart';
|
||||||
@@ -58,11 +55,21 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||||||
});
|
});
|
||||||
HomeApi().getHomeData().then((value) {
|
HomeApi().getHomeData().then((value) {
|
||||||
homeModel = HomeModel.fromJson(value.data);
|
homeModel = HomeModel.fromJson(value.data);
|
||||||
|
productsController.isUpstoxTokenNotExpired.value =
|
||||||
|
homeModel.data!.isUpstoxTokenRefreshed!;
|
||||||
isApiCalling.value = false;
|
isApiCalling.value = false;
|
||||||
});
|
});
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String calculatePercentageChange(double openPrice, double currentPrice) {
|
||||||
|
final percentageChange = ((currentPrice - openPrice) / openPrice) * 100;
|
||||||
|
|
||||||
|
log(percentageChange.toStringAsFixed(2));
|
||||||
|
|
||||||
|
return percentageChange.toStringAsFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
@@ -145,31 +152,83 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||||||
fontFamily: 'hiragino',
|
fontFamily: 'hiragino',
|
||||||
fontWeight: FontWeight.w500),
|
fontWeight: FontWeight.w500),
|
||||||
),
|
),
|
||||||
sizedBoxHeight(25.h),
|
!homeModel.data!.isUpstoxTokenRefreshed!
|
||||||
SingleChildScrollView(
|
? const SizedBox()
|
||||||
scrollDirection: Axis.horizontal,
|
: sizedBoxHeight(25.h),
|
||||||
child: Row(
|
!homeModel.data!.isUpstoxTokenRefreshed!
|
||||||
children: [
|
? const SizedBox()
|
||||||
commoncontainer(
|
: SingleChildScrollView(
|
||||||
width: 195.w,
|
scrollDirection: Axis.horizontal,
|
||||||
text: 'NIFTY',
|
child: Row(
|
||||||
amount: '22,286.95',
|
children: [
|
||||||
rate: '+304.15 (+1.38%)'),
|
commoncontainer(
|
||||||
sizedBoxWidth(10.w),
|
width: 250.w,
|
||||||
commoncontainer(
|
text: homeModel
|
||||||
width: 240.w,
|
.data!
|
||||||
text: 'BANKNIFTY',
|
.indexLiveData!
|
||||||
amount: '22,286.95',
|
.data!
|
||||||
rate: '+896.10 (+1.94%)'),
|
.nSEINDEXNifty50!
|
||||||
],
|
.instrumentToken!
|
||||||
),
|
.split("NSE_INDEX|")[1],
|
||||||
),
|
amount: homeModel.data!.indexLiveData!
|
||||||
sizedBoxHeight(30.h),
|
.data!.nSEINDEXNifty50!.lastPrice!
|
||||||
Container(
|
.toString(),
|
||||||
width: double.infinity,
|
rate: homeModel.data!.indexLiveData!
|
||||||
height: 1.h,
|
.data!.nSEINDEXNifty50!.netChange
|
||||||
color: const Color(0xFF3A3A3A),
|
.toString(),
|
||||||
),
|
percentageChange:
|
||||||
|
calculatePercentageChange(
|
||||||
|
homeModel.data!.indexLiveData!.data!
|
||||||
|
.nSEINDEXNifty50!.ohlc!.open!,
|
||||||
|
homeModel.data!.indexLiveData!.data!
|
||||||
|
.nSEINDEXNifty50!.lastPrice!,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
sizedBoxWidth(10.w),
|
||||||
|
commoncontainer(
|
||||||
|
width: 250.w,
|
||||||
|
text: homeModel
|
||||||
|
.data!
|
||||||
|
.indexLiveData!
|
||||||
|
.data!
|
||||||
|
.nSEINDEXNiftyBank!
|
||||||
|
.instrumentToken!
|
||||||
|
.split("NSE_INDEX|")[1],
|
||||||
|
amount: homeModel
|
||||||
|
.data!
|
||||||
|
.indexLiveData!
|
||||||
|
.data!
|
||||||
|
.nSEINDEXNiftyBank!
|
||||||
|
.lastPrice!
|
||||||
|
.toString(),
|
||||||
|
rate: homeModel
|
||||||
|
.data!
|
||||||
|
.indexLiveData!
|
||||||
|
.data!
|
||||||
|
.nSEINDEXNiftyBank!
|
||||||
|
.netChange
|
||||||
|
.toString(),
|
||||||
|
percentageChange:
|
||||||
|
calculatePercentageChange(
|
||||||
|
homeModel.data!.indexLiveData!.data!
|
||||||
|
.nSEINDEXNiftyBank!.ohlc!.open!,
|
||||||
|
homeModel.data!.indexLiveData!.data!
|
||||||
|
.nSEINDEXNiftyBank!.lastPrice!,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
!homeModel.data!.isUpstoxTokenRefreshed!
|
||||||
|
? const SizedBox()
|
||||||
|
: sizedBoxHeight(30.h),
|
||||||
|
!homeModel.data!.isUpstoxTokenRefreshed!
|
||||||
|
? const SizedBox()
|
||||||
|
: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 1.h,
|
||||||
|
color: const Color(0xFF3A3A3A),
|
||||||
|
),
|
||||||
sizedBoxHeight(30.h),
|
sizedBoxHeight(30.h),
|
||||||
text22W500('View our products'),
|
text22W500('View our products'),
|
||||||
sizedBoxHeight(30.h),
|
sizedBoxHeight(30.h),
|
||||||
@@ -327,7 +386,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||||||
width: 105,
|
width: 105,
|
||||||
height: 35,
|
height: 35,
|
||||||
decoration: ShapeDecoration(
|
decoration: ShapeDecoration(
|
||||||
color: Color(0xFF0093FF),
|
color: const Color(0xFF0093FF),
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.circular(5)),
|
BorderRadius.circular(5)),
|
||||||
@@ -620,7 +679,7 @@ Widget cardcallWidget(
|
|||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
log("RUNNING");
|
log("RUNNING");
|
||||||
Get.to(ExploreUnseen());
|
Get.to(const ExploreUnseen());
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 52,
|
height: 52,
|
||||||
@@ -691,11 +750,13 @@ Widget ProductWidget({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget commoncontainer(
|
Widget commoncontainer({
|
||||||
{required String text,
|
required String text,
|
||||||
required String amount,
|
required String amount,
|
||||||
required String rate,
|
required String rate,
|
||||||
required double width}) {
|
required double width,
|
||||||
|
required String percentageChange,
|
||||||
|
}) {
|
||||||
return Container(
|
return Container(
|
||||||
height: 83,
|
height: 83,
|
||||||
decoration: ShapeDecoration(
|
decoration: ShapeDecoration(
|
||||||
@@ -716,15 +777,32 @@ Widget commoncontainer(
|
|||||||
sizedBoxWidth(8.w),
|
sizedBoxWidth(8.w),
|
||||||
text16W600(amount),
|
text16W600(amount),
|
||||||
sizedBoxWidth(8.w),
|
sizedBoxWidth(8.w),
|
||||||
SvgPicture.asset(
|
rate.contains("-")
|
||||||
'assets/images/svg/Line 587.svg',
|
? SvgPicture.asset(
|
||||||
height: 15.h,
|
'assets/images/svg/Line 587.svg',
|
||||||
width: 15.w,
|
height: 15.h,
|
||||||
),
|
width: 15.w,
|
||||||
|
)
|
||||||
|
: rate == "0.0"
|
||||||
|
? const SizedBox()
|
||||||
|
: SvgPicture.asset(
|
||||||
|
'assets/images/svg/up_arrow.svg',
|
||||||
|
height: 15.h,
|
||||||
|
width: 15.w,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
sizedBoxHeight(8.w),
|
sizedBoxHeight(8.w),
|
||||||
text14W400_00FF19(rate)
|
text14W400(
|
||||||
|
rate.contains("-")
|
||||||
|
? "$rate ($percentageChange%)"
|
||||||
|
: "+$rate ($percentageChange%)",
|
||||||
|
clr: rate.contains("-")
|
||||||
|
? const Color(0xFFFF0000)
|
||||||
|
: rate == "0.0"
|
||||||
|
? Colors.grey
|
||||||
|
: const Color(0xFF00FF19),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -6,13 +6,12 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:get/get.dart' hide FormData;
|
import 'package:get/get.dart' hide FormData;
|
||||||
import 'package:syncfusion_flutter_charts/charts.dart';
|
|
||||||
import 'package:traderscircuit/Utils/text.dart';
|
import 'package:traderscircuit/Utils/text.dart';
|
||||||
import 'package:traderscircuit/Utils/utils.dart';
|
import 'package:traderscircuit/Utils/utils.dart';
|
||||||
|
import 'package:traderscircuit/controller/products_controller.dart';
|
||||||
import 'package:traderscircuit/model/StockDetailsModel/stock_details_model.dart';
|
import 'package:traderscircuit/model/StockDetailsModel/stock_details_model.dart';
|
||||||
import 'package:traderscircuit/view_model/StockDetailsApi/stock_details_api.dart';
|
import 'package:traderscircuit/view_model/StockDetailsApi/stock_details_api.dart';
|
||||||
|
|
||||||
import 'dart:math';
|
|
||||||
import '../../../Utils/Common/CommonAppBar.dart';
|
import '../../../Utils/Common/CommonAppBar.dart';
|
||||||
import '../../onBoarding/splashScreen1.dart';
|
import '../../onBoarding/splashScreen1.dart';
|
||||||
|
|
||||||
@@ -30,68 +29,76 @@ class _StockDetailsScreenState extends State<StockDetailsScreen> {
|
|||||||
String percentageDifference = "";
|
String percentageDifference = "";
|
||||||
String netChange = "";
|
String netChange = "";
|
||||||
|
|
||||||
|
ProductsController productsController = Get.put(ProductsController());
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
dv.log(instrumentName);
|
dv.log(instrumentName);
|
||||||
StockDetailsApi()
|
if (productsController.isUpstoxTokenNotExpired.value) {
|
||||||
.getStockDetails(
|
StockDetailsApi()
|
||||||
FormData.fromMap({"upstox_instrument_key": instrumentName}))
|
.getStockDetails(
|
||||||
.then((value) {
|
FormData.fromMap({"upstox_instrument_key": instrumentName}))
|
||||||
final Map<String, dynamic> data = value.data;
|
.then((value) {
|
||||||
|
final Map<String, dynamic> data = value.data;
|
||||||
|
|
||||||
Map<String, dynamic> data1 = data["data"]['stock_data']['data'];
|
Map<String, dynamic> data1 = data["data"]['stock_data']['data'];
|
||||||
String dynamicKey = data1.keys.first;
|
String dynamicKey = data1.keys.first;
|
||||||
// Access nested data using dynamic key
|
// Access nested data using dynamic key
|
||||||
Map<String, dynamic> dynamicData = data1[dynamicKey];
|
Map<String, dynamic> dynamicData = data1[dynamicKey];
|
||||||
|
|
||||||
List<Candles>? candles = [];
|
List<Candles>? candles = [];
|
||||||
|
|
||||||
for (var a in data["data"]['candle_stick']["data"]["candles"]) {
|
for (var a in data["data"]['candle_stick']["data"]["candles"]) {
|
||||||
candles.add(Candles(
|
candles.add(Candles(
|
||||||
timestamp: a[0],
|
timestamp: a[0],
|
||||||
open: a[1].toDouble(),
|
open: a[1].toDouble(),
|
||||||
high: a[2].toDouble(),
|
high: a[2].toDouble(),
|
||||||
low: a[3].toDouble(),
|
low: a[3].toDouble(),
|
||||||
close: a[4].toDouble(),
|
close: a[4].toDouble(),
|
||||||
volume: a[5].toInt(),
|
volume: a[5].toInt(),
|
||||||
openInterest: a[6],
|
openInterest: a[6],
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
candles = candles.reversed.toList();
|
candles = candles.reversed.toList();
|
||||||
stockDetailsModel = StockDetailsModel(
|
stockDetailsModel = StockDetailsModel(
|
||||||
status: data["status"],
|
status: data["status"],
|
||||||
message: data["message"],
|
message: data["message"],
|
||||||
statusCode: data["status_code"],
|
statusCode: data["status_code"],
|
||||||
data: Data(
|
data: Data(
|
||||||
stockData: StockInfo(
|
stockData: StockInfo(
|
||||||
ohlc: Ohlc.fromJson(dynamicData['ohlc']),
|
ohlc: Ohlc.fromJson(dynamicData['ohlc']),
|
||||||
averagePrice: dynamicData['average_price'].toDouble(),
|
averagePrice: dynamicData['average_price'].toDouble(),
|
||||||
instrumentToken: dynamicData['instrument_token'],
|
instrumentToken: dynamicData['instrument_token'],
|
||||||
lastPrice: dynamicData['last_price'].toDouble(),
|
lastPrice: dynamicData['last_price'].toDouble(),
|
||||||
lastTradeTime: dynamicData['last_trade_time'],
|
lastTradeTime: dynamicData['last_trade_time'],
|
||||||
lowerCircuitLimit:
|
lowerCircuitLimit:
|
||||||
dynamicData['lower_circuit_limit'].toDouble(),
|
dynamicData['lower_circuit_limit'].toDouble(),
|
||||||
netChange: dynamicData['net_change'].toDouble(),
|
netChange: dynamicData['net_change'].toDouble(),
|
||||||
oi: dynamicData['oi'],
|
oi: dynamicData['oi'],
|
||||||
oiDayHigh: dynamicData['oi_day_high'],
|
oiDayHigh: dynamicData['oi_day_high'],
|
||||||
oiDayLow: dynamicData['oi_day_low'],
|
oiDayLow: dynamicData['oi_day_low'],
|
||||||
symbol: dynamicData['symbol'],
|
symbol: dynamicData['symbol'],
|
||||||
timestamp: dynamicData['timestamp'],
|
timestamp: dynamicData['timestamp'],
|
||||||
totalBuyQuantity: dynamicData['total_buy_quantity'],
|
totalBuyQuantity: dynamicData['total_buy_quantity'],
|
||||||
totalSellQuantity: dynamicData['total_sell_quantity'],
|
totalSellQuantity: dynamicData['total_sell_quantity'],
|
||||||
upperCircuitLimit: dynamicData['upper_circuit_limit'],
|
upperCircuitLimit: dynamicData['upper_circuit_limit'],
|
||||||
volume: dynamicData['volume'],
|
volume: dynamicData['volume'],
|
||||||
),
|
),
|
||||||
candleStick: CandleStick(candles: candles),
|
candleStick: CandleStick(candles: candles),
|
||||||
optionChain: OptionChain.fromJson(data["data"]['option_chain'])));
|
optionChain:
|
||||||
|
OptionChain.fromJson(data["data"]['option_chain'])));
|
||||||
|
|
||||||
netChange = dynamicData['net_change'].toString();
|
netChange = dynamicData['net_change'].toString();
|
||||||
_calculatePercentageChange(
|
_calculatePercentageChange(
|
||||||
stockDetailsModel!.data!.stockData!.ohlc!.open!,
|
stockDetailsModel!.data!.stockData!.ohlc!.open!,
|
||||||
stockDetailsModel!.data!.stockData!.lastPrice!);
|
stockDetailsModel!.data!.stockData!.lastPrice!);
|
||||||
|
|
||||||
|
isLoading.value = false;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
});
|
}
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,418 +117,453 @@ class _StockDetailsScreenState extends State<StockDetailsScreen> {
|
|||||||
appBar: const CommonAppbar(
|
appBar: const CommonAppbar(
|
||||||
titleTxt: "",
|
titleTxt: "",
|
||||||
),
|
),
|
||||||
body: Obx(() => RefreshIndicator(
|
body: Obx(() => !productsController.isUpstoxTokenNotExpired.value
|
||||||
color: const Color(0xFF0093FF),
|
? Stack(children: [
|
||||||
onRefresh: () async {
|
|
||||||
Future.delayed(const Duration(seconds: 1), () {
|
|
||||||
isLoading.value = true;
|
|
||||||
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];
|
|
||||||
|
|
||||||
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'])));
|
|
||||||
|
|
||||||
netChange = dynamicData['net_change'].toString();
|
|
||||||
_calculatePercentageChange(
|
|
||||||
stockDetailsModel!.data!.stockData!.ohlc!.open!,
|
|
||||||
stockDetailsModel!.data!.stockData!.lastPrice!);
|
|
||||||
isLoading.value = false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Stack(children: [
|
|
||||||
const CommonBlurLeft(),
|
const CommonBlurLeft(),
|
||||||
const CommonBlurRight(),
|
const CommonBlurRight(),
|
||||||
isLoading.value
|
Column(
|
||||||
? const Center(
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
child: CircularProgressIndicator(
|
children: [
|
||||||
color: Color(0xFF0093FF),
|
Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
"assets/images/png/under_maintenance.png",
|
||||||
|
width: 200,
|
||||||
|
height: 220,
|
||||||
),
|
),
|
||||||
)
|
Column(
|
||||||
: Padding(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
padding: const EdgeInsets.all(15.0),
|
children: [
|
||||||
child: SingleChildScrollView(
|
text22W600("Oops!"),
|
||||||
child: Column(
|
const Gap(5),
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
text16W400("Under Maintenance", clr: Colors.grey)
|
||||||
children: [
|
],
|
||||||
text16W700(
|
)
|
||||||
stockDetailsModel!.data!.stockData!.symbol!),
|
],
|
||||||
const Gap(14),
|
),
|
||||||
Row(
|
const Gap(150),
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
],
|
||||||
children: [
|
)
|
||||||
text25W600(
|
])
|
||||||
"₹${stockDetailsModel!.data!.stockData!.lastPrice!.toString()}"),
|
: RefreshIndicator(
|
||||||
Container(
|
color: const Color(0xFF0093FF),
|
||||||
width: 145,
|
onRefresh: () async {
|
||||||
height: 40,
|
Future.delayed(const Duration(seconds: 1), () {
|
||||||
decoration: ShapeDecoration(
|
isLoading.value = true;
|
||||||
color: const Color(0xFF0093FF),
|
StockDetailsApi()
|
||||||
shape: RoundedRectangleBorder(
|
.getStockDetails(FormData.fromMap(
|
||||||
borderRadius:
|
{"upstox_instrument_key": instrumentName}))
|
||||||
BorderRadius.circular(5)),
|
.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];
|
||||||
|
|
||||||
|
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'])));
|
||||||
|
|
||||||
|
netChange = dynamicData['net_change'].toString();
|
||||||
|
_calculatePercentageChange(
|
||||||
|
stockDetailsModel!.data!.stockData!.ohlc!.open!,
|
||||||
|
stockDetailsModel!.data!.stockData!.lastPrice!);
|
||||||
|
isLoading.value = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Stack(children: [
|
||||||
|
const CommonBlurLeft(),
|
||||||
|
const CommonBlurRight(),
|
||||||
|
isLoading.value
|
||||||
|
? const Center(
|
||||||
|
child: CircularProgressIndicator(
|
||||||
|
color: Color(0xFF0093FF),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Padding(
|
||||||
|
padding: const EdgeInsets.all(15.0),
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
text16W700(
|
||||||
|
stockDetailsModel!.data!.stockData!.symbol!),
|
||||||
|
const Gap(14),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
text25W600(
|
||||||
|
"₹${stockDetailsModel!.data!.stockData!.lastPrice!.toString()}"),
|
||||||
|
Container(
|
||||||
|
width: 145,
|
||||||
|
height: 40,
|
||||||
|
decoration: ShapeDecoration(
|
||||||
|
color: const Color(0xFF0093FF),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.circular(5)),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/svg/option_chain_icon.svg"),
|
||||||
|
const Gap(5),
|
||||||
|
text12W600("Option Chain"),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
text12W400(
|
||||||
|
netChange.contains("-")
|
||||||
|
? "${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)"
|
||||||
|
: "+${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)",
|
||||||
|
clr: netChange.contains("-")
|
||||||
|
? Colors.redAccent
|
||||||
|
: netChange == "0.0"
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.greenAccent),
|
||||||
|
text12W400(" Today"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(55),
|
||||||
|
// Container(
|
||||||
|
// // margin: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
|
// width: Get.width,
|
||||||
|
// height: 220,
|
||||||
|
// color: Colors.transparent,
|
||||||
|
// child: SfCartesianChart(
|
||||||
|
// // palette: [
|
||||||
|
// // const Color(
|
||||||
|
// // 0xFF0093FF,
|
||||||
|
// // ).withOpacity(.01),
|
||||||
|
// // const Color(
|
||||||
|
// // 0xFF0093FF,
|
||||||
|
// // ).withOpacity(.3),
|
||||||
|
// // ],
|
||||||
|
|
||||||
|
// tooltipBehavior: _tooltipBehavior,
|
||||||
|
// plotAreaBorderWidth: 0,
|
||||||
|
// primaryYAxis: NumericAxis(isVisible: false),
|
||||||
|
// // Initialize category axis
|
||||||
|
// primaryXAxis: CategoryAxis(isVisible: false),
|
||||||
|
// series: <LineSeries<SalesData, String>>[
|
||||||
|
// LineSeries<SalesData, String>(
|
||||||
|
// // Bind data source
|
||||||
|
// dataSource: salesDataV,
|
||||||
|
// color: Color(0xFF0093FF),
|
||||||
|
// enableTooltip: true,
|
||||||
|
// xValueMapper: (SalesData sales, _) =>
|
||||||
|
// sales.year,
|
||||||
|
// yValueMapper: (SalesData sales, _) =>
|
||||||
|
// sales.sales)
|
||||||
|
// ]),
|
||||||
|
// ),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
margin:
|
||||||
|
const EdgeInsets.symmetric(horizontal: 15),
|
||||||
|
width: Get.width,
|
||||||
|
height: 220,
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: LineChart(
|
||||||
|
LineChartData(
|
||||||
|
lineTouchData: LineTouchData(
|
||||||
|
touchTooltipData: LineTouchTooltipData(
|
||||||
|
fitInsideHorizontally: true,
|
||||||
|
fitInsideVertically: true,
|
||||||
|
|
||||||
|
tooltipRoundedRadius:
|
||||||
|
9, // maxContentWidth: 150,
|
||||||
|
getTooltipItems: (
|
||||||
|
List<LineBarSpot> touchedBarSpots,
|
||||||
|
) {
|
||||||
|
return touchedBarSpots.map((barSpot) {
|
||||||
|
return LineTooltipItem(
|
||||||
|
"₹ ${Utils.removeDecimal(
|
||||||
|
Utils.extractPriceFromGraph(
|
||||||
|
stockDetailsModel!
|
||||||
|
.data!
|
||||||
|
.candleStick!
|
||||||
|
.candles!)[
|
||||||
|
barSpot.x.toInt()]
|
||||||
|
.toStringAsFixed(2),
|
||||||
|
)}",
|
||||||
|
const TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
),
|
||||||
|
// children: [
|
||||||
|
// const TextSpan(text: "\n"),
|
||||||
|
// TextSpan(
|
||||||
|
// text: Utils
|
||||||
|
// .extractTimeFromGraph(
|
||||||
|
// stockDetailsModel!
|
||||||
|
// .data!
|
||||||
|
// .candleStick!
|
||||||
|
);
|
||||||
|
}).toList();
|
||||||
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
child: Row(
|
gridData: FlGridData(
|
||||||
mainAxisAlignment:
|
show: true,
|
||||||
MainAxisAlignment.center,
|
drawVerticalLine: false,
|
||||||
crossAxisAlignment:
|
drawHorizontalLine: false,
|
||||||
CrossAxisAlignment.center,
|
horizontalInterval: 4,
|
||||||
children: [
|
getDrawingHorizontalLine: (value) {
|
||||||
SvgPicture.asset(
|
return const FlLine(
|
||||||
"assets/images/svg/option_chain_icon.svg"),
|
color: Color(
|
||||||
const Gap(5),
|
0xff37434d,
|
||||||
text12W600("Option Chain"),
|
),
|
||||||
],
|
strokeWidth: 1,
|
||||||
)),
|
);
|
||||||
],
|
},
|
||||||
),
|
getDrawingVerticalLine: (value) {
|
||||||
const Gap(8),
|
return const FlLine(
|
||||||
Row(
|
color: Color(
|
||||||
children: [
|
0xff0093FF,
|
||||||
text12W400(
|
),
|
||||||
netChange.contains("-")
|
strokeWidth: 1,
|
||||||
? "${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)"
|
);
|
||||||
: "+${stockDetailsModel!.data!.stockData!.netChange} ($percentageDifference%)",
|
|
||||||
clr: netChange.contains("-")
|
|
||||||
? Colors.redAccent
|
|
||||||
: netChange == "0.0"
|
|
||||||
? Colors.grey
|
|
||||||
: Colors.greenAccent),
|
|
||||||
text12W400(" Today"),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const Gap(55),
|
|
||||||
// Container(
|
|
||||||
// // margin: const EdgeInsets.symmetric(horizontal: 8),
|
|
||||||
// width: Get.width,
|
|
||||||
// height: 220,
|
|
||||||
// color: Colors.transparent,
|
|
||||||
// child: SfCartesianChart(
|
|
||||||
// // palette: [
|
|
||||||
// // const Color(
|
|
||||||
// // 0xFF0093FF,
|
|
||||||
// // ).withOpacity(.01),
|
|
||||||
// // const Color(
|
|
||||||
// // 0xFF0093FF,
|
|
||||||
// // ).withOpacity(.3),
|
|
||||||
// // ],
|
|
||||||
|
|
||||||
// tooltipBehavior: _tooltipBehavior,
|
|
||||||
// plotAreaBorderWidth: 0,
|
|
||||||
// primaryYAxis: NumericAxis(isVisible: false),
|
|
||||||
// // Initialize category axis
|
|
||||||
// primaryXAxis: CategoryAxis(isVisible: false),
|
|
||||||
// series: <LineSeries<SalesData, String>>[
|
|
||||||
// LineSeries<SalesData, String>(
|
|
||||||
// // Bind data source
|
|
||||||
// dataSource: salesDataV,
|
|
||||||
// color: Color(0xFF0093FF),
|
|
||||||
// enableTooltip: true,
|
|
||||||
// xValueMapper: (SalesData sales, _) =>
|
|
||||||
// sales.year,
|
|
||||||
// yValueMapper: (SalesData sales, _) =>
|
|
||||||
// sales.sales)
|
|
||||||
// ]),
|
|
||||||
// ),
|
|
||||||
|
|
||||||
Container(
|
|
||||||
margin:
|
|
||||||
const EdgeInsets.symmetric(horizontal: 15),
|
|
||||||
width: Get.width,
|
|
||||||
height: 220,
|
|
||||||
color: Colors.transparent,
|
|
||||||
child: LineChart(
|
|
||||||
LineChartData(
|
|
||||||
lineTouchData: LineTouchData(
|
|
||||||
touchTooltipData: LineTouchTooltipData(
|
|
||||||
fitInsideHorizontally: true,
|
|
||||||
fitInsideVertically: true,
|
|
||||||
|
|
||||||
tooltipRoundedRadius:
|
|
||||||
9, // maxContentWidth: 150,
|
|
||||||
getTooltipItems: (
|
|
||||||
List<LineBarSpot> touchedBarSpots,
|
|
||||||
) {
|
|
||||||
return touchedBarSpots.map((barSpot) {
|
|
||||||
return LineTooltipItem(
|
|
||||||
"₹ ${Utils.removeDecimal(
|
|
||||||
Utils.extractPriceFromGraph(
|
|
||||||
stockDetailsModel!
|
|
||||||
.data!
|
|
||||||
.candleStick!
|
|
||||||
.candles!)[
|
|
||||||
barSpot.x.toInt()]
|
|
||||||
.toStringAsFixed(2),
|
|
||||||
)}",
|
|
||||||
const TextStyle(
|
|
||||||
fontSize: 16,
|
|
||||||
fontWeight: FontWeight.w700,
|
|
||||||
),
|
|
||||||
// children: [
|
|
||||||
// const TextSpan(text: "\n"),
|
|
||||||
// TextSpan(
|
|
||||||
// text: Utils
|
|
||||||
// .extractTimeFromGraph(
|
|
||||||
// stockDetailsModel!
|
|
||||||
// .data!
|
|
||||||
// .candleStick!
|
|
||||||
// .candles!)[barSpot
|
|
||||||
// .x
|
|
||||||
// .toInt()])
|
|
||||||
// ]
|
|
||||||
);
|
|
||||||
}).toList();
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
titlesData: const FlTitlesData(
|
||||||
gridData: FlGridData(
|
show: false,
|
||||||
show: true,
|
|
||||||
drawVerticalLine: false,
|
|
||||||
drawHorizontalLine: false,
|
|
||||||
horizontalInterval: 4,
|
|
||||||
getDrawingHorizontalLine: (value) {
|
|
||||||
return const FlLine(
|
|
||||||
color: Color(
|
|
||||||
0xff37434d,
|
|
||||||
),
|
|
||||||
strokeWidth: 1,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
getDrawingVerticalLine: (value) {
|
|
||||||
return const FlLine(
|
|
||||||
color: Color(
|
|
||||||
0xff0093FF,
|
|
||||||
),
|
|
||||||
strokeWidth: 1,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
titlesData: const FlTitlesData(
|
|
||||||
show: false,
|
|
||||||
),
|
|
||||||
borderData: FlBorderData(
|
|
||||||
show: false,
|
|
||||||
),
|
|
||||||
// minX: 0,
|
|
||||||
// maxX: (stockDetailsModel!
|
|
||||||
// .data!.candleStick!.candles!.length
|
|
||||||
// .toDouble()) -
|
|
||||||
// 1,
|
|
||||||
// minY: Utils.extractPriceFromGraph(
|
|
||||||
// stockDetailsModel!
|
|
||||||
// .data!.candleStick!.candles!)
|
|
||||||
// .reduce(min)
|
|
||||||
// .toDouble(),
|
|
||||||
// maxY: Utils.extractPriceFromGraph(
|
|
||||||
// stockDetailsModel!
|
|
||||||
// .data!.candleStick!.candles!)
|
|
||||||
// .reduce(max)
|
|
||||||
// .toDouble(),
|
|
||||||
lineBarsData: [
|
|
||||||
LineChartBarData(
|
|
||||||
color: const Color(0xFF0093FF),
|
|
||||||
spots: listData(
|
|
||||||
Utils.extractPriceFromGraph(
|
|
||||||
stockDetailsModel!
|
|
||||||
.data!.candleStick!.candles!),
|
|
||||||
),
|
|
||||||
barWidth: 1.3,
|
|
||||||
isStrokeCapRound: true,
|
|
||||||
dotData: const FlDotData(
|
|
||||||
show: false,
|
|
||||||
),
|
|
||||||
belowBarData: BarAreaData(
|
|
||||||
show: true,
|
|
||||||
gradient: LinearGradient(
|
|
||||||
colors: [
|
|
||||||
const Color(
|
|
||||||
0xFF0093FF,
|
|
||||||
).withOpacity(.01),
|
|
||||||
const Color(
|
|
||||||
0xFF0093FF,
|
|
||||||
).withOpacity(.3),
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
),
|
),
|
||||||
],
|
borderData: FlBorderData(
|
||||||
|
show: false,
|
||||||
|
),
|
||||||
|
// minX: 0,
|
||||||
|
// maxX: (stockDetailsModel!
|
||||||
|
// .data!.candleStick!.candles!.length
|
||||||
|
// .toDouble()) -
|
||||||
|
// 1,
|
||||||
|
// minY: Utils.extractPriceFromGraph(
|
||||||
|
// stockDetailsModel!
|
||||||
|
// .data!.candleStick!.candles!)
|
||||||
|
// .reduce(min)
|
||||||
|
// .toDouble(),
|
||||||
|
// maxY: Utils.extractPriceFromGraph(
|
||||||
|
// stockDetailsModel!
|
||||||
|
// .data!.candleStick!.candles!)
|
||||||
|
// .reduce(max)
|
||||||
|
// .toDouble(),
|
||||||
|
lineBarsData: [
|
||||||
|
LineChartBarData(
|
||||||
|
color: const Color(0xFF0093FF),
|
||||||
|
spots: listData(
|
||||||
|
Utils.extractPriceFromGraph(
|
||||||
|
stockDetailsModel!
|
||||||
|
.data!.candleStick!.candles!),
|
||||||
|
),
|
||||||
|
barWidth: 1.3,
|
||||||
|
isStrokeCapRound: true,
|
||||||
|
dotData: const FlDotData(
|
||||||
|
show: false,
|
||||||
|
),
|
||||||
|
belowBarData: BarAreaData(
|
||||||
|
show: true,
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [
|
||||||
|
const Color(
|
||||||
|
0xFF0093FF,
|
||||||
|
).withOpacity(.01),
|
||||||
|
const Color(
|
||||||
|
0xFF0093FF,
|
||||||
|
).withOpacity(.3),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
curve: Curves.linear,
|
||||||
|
duration: const Duration(milliseconds: 150),
|
||||||
),
|
),
|
||||||
curve: Curves.linear,
|
|
||||||
duration: const Duration(milliseconds: 150),
|
|
||||||
),
|
),
|
||||||
),
|
|
||||||
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
text18W400("Overview"),
|
text18W400("Overview"),
|
||||||
const Gap(15),
|
const Gap(15),
|
||||||
text20W400("Performance"),
|
text20W400("Performance"),
|
||||||
const Gap(22),
|
const Gap(22),
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment:
|
||||||
children: [
|
MainAxisAlignment.spaceBetween,
|
||||||
Column(
|
children: [
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
Column(
|
||||||
children: [
|
crossAxisAlignment:
|
||||||
text16W400('Today’s Low',
|
CrossAxisAlignment.start,
|
||||||
clr: const Color(0xFF979797)),
|
children: [
|
||||||
const Gap(5),
|
text16W400('Today’s Low',
|
||||||
text16W500(
|
clr: const Color(0xFF979797)),
|
||||||
stockDetailsModel!
|
const Gap(5),
|
||||||
.data!.stockData!.ohlc!.low!
|
text16W500(
|
||||||
.toString(),
|
stockDetailsModel!
|
||||||
)
|
.data!.stockData!.ohlc!.low!
|
||||||
],
|
.toString(),
|
||||||
),
|
)
|
||||||
Column(
|
],
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
),
|
||||||
children: [
|
Column(
|
||||||
text16W400('Today’s High',
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
clr: const Color(0xFF979797)),
|
children: [
|
||||||
const Gap(5),
|
text16W400('Today’s High',
|
||||||
text16W500(
|
clr: const Color(0xFF979797)),
|
||||||
stockDetailsModel!
|
const Gap(5),
|
||||||
.data!.stockData!.ohlc!.high!
|
text16W500(
|
||||||
.toString(),
|
stockDetailsModel!
|
||||||
)
|
.data!.stockData!.ohlc!.high!
|
||||||
],
|
.toString(),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
)
|
||||||
const Gap(40),
|
],
|
||||||
Row(
|
),
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
const Gap(40),
|
||||||
children: [
|
Row(
|
||||||
Column(
|
mainAxisAlignment:
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
text16W400('Open price',
|
Column(
|
||||||
clr: const Color(0xFF979797)),
|
crossAxisAlignment:
|
||||||
const Gap(5),
|
CrossAxisAlignment.start,
|
||||||
text16W500(
|
children: [
|
||||||
stockDetailsModel!
|
text16W400('Open price',
|
||||||
.data!.stockData!.ohlc!.open
|
clr: const Color(0xFF979797)),
|
||||||
.toString(),
|
const Gap(5),
|
||||||
)
|
text16W500(
|
||||||
],
|
stockDetailsModel!
|
||||||
),
|
.data!.stockData!.ohlc!.open
|
||||||
Column(
|
.toString(),
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
)
|
||||||
children: [
|
],
|
||||||
text16W400('Prev. Close',
|
),
|
||||||
clr: const Color(0xFF979797)),
|
Column(
|
||||||
const Gap(5),
|
crossAxisAlignment:
|
||||||
text16W500(
|
CrossAxisAlignment.start,
|
||||||
stockDetailsModel!.data!.candleStick!
|
children: [
|
||||||
.candles!.last.close
|
text16W400('Prev. Close',
|
||||||
.toString(),
|
clr: const Color(0xFF979797)),
|
||||||
)
|
const Gap(5),
|
||||||
],
|
text16W500(
|
||||||
),
|
stockDetailsModel!.data!.candleStick!
|
||||||
Column(
|
.candles!.last.close
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
.toString(),
|
||||||
children: [
|
)
|
||||||
text16W400('Volume',
|
],
|
||||||
clr: const Color(0xFF979797)),
|
),
|
||||||
const Gap(5),
|
Column(
|
||||||
text16W500(
|
crossAxisAlignment:
|
||||||
stockDetailsModel!.data!.stockData!.volume
|
CrossAxisAlignment.start,
|
||||||
.toString(),
|
children: [
|
||||||
)
|
text16W400('Volume',
|
||||||
],
|
clr: const Color(0xFF979797)),
|
||||||
)
|
const Gap(5),
|
||||||
],
|
text16W500(
|
||||||
),
|
stockDetailsModel!
|
||||||
const Gap(25),
|
.data!.stockData!.volume
|
||||||
Row(
|
.toString(),
|
||||||
children: [
|
)
|
||||||
Column(
|
],
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
)
|
||||||
children: [
|
],
|
||||||
text16W400('Lower Circuit',
|
),
|
||||||
clr: const Color(0xFF979797)),
|
const Gap(25),
|
||||||
const Gap(5),
|
Row(
|
||||||
text16W500(
|
children: [
|
||||||
stockDetailsModel!
|
Column(
|
||||||
.data!.stockData!.lowerCircuitLimit
|
crossAxisAlignment:
|
||||||
.toString(),
|
CrossAxisAlignment.start,
|
||||||
)
|
children: [
|
||||||
],
|
text16W400('Lower Circuit',
|
||||||
),
|
clr: const Color(0xFF979797)),
|
||||||
const Gap(25),
|
const Gap(5),
|
||||||
Column(
|
text16W500(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
stockDetailsModel!
|
||||||
children: [
|
.data!.stockData!.lowerCircuitLimit
|
||||||
text16W400('Upper Circuit',
|
.toString(),
|
||||||
clr: const Color(0xFF979797)),
|
)
|
||||||
const Gap(5),
|
],
|
||||||
text16W500(
|
),
|
||||||
stockDetailsModel!
|
const Gap(25),
|
||||||
.data!.stockData!.upperCircuitLimit
|
Column(
|
||||||
.toString(),
|
crossAxisAlignment:
|
||||||
)
|
CrossAxisAlignment.start,
|
||||||
],
|
children: [
|
||||||
)
|
text16W400('Upper Circuit',
|
||||||
],
|
clr: const Color(0xFF979797)),
|
||||||
),
|
const Gap(5),
|
||||||
const Gap(25),
|
text16W500(
|
||||||
],
|
stockDetailsModel!
|
||||||
|
.data!.stockData!.upperCircuitLimit
|
||||||
|
.toString(),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(25),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
]),
|
||||||
]),
|
)),
|
||||||
)),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import 'package:traderscircuit/Utils/text.dart';
|
|||||||
import 'package:traderscircuit/resources/routes/route_name.dart';
|
import 'package:traderscircuit/resources/routes/route_name.dart';
|
||||||
import 'package:traderscircuit/view_model/ProfileAPI/GetProfileApi.dart';
|
import 'package:traderscircuit/view_model/ProfileAPI/GetProfileApi.dart';
|
||||||
|
|
||||||
|
import 'webview_subscription.dart';
|
||||||
|
|
||||||
class SideMenu extends StatefulWidget {
|
class SideMenu extends StatefulWidget {
|
||||||
const SideMenu({super.key});
|
const SideMenu({super.key});
|
||||||
|
|
||||||
@@ -167,10 +169,12 @@ class _SideMenuState extends State<SideMenu> {
|
|||||||
child: Center(child: text14W500_black('Upgrade')),
|
child: Center(child: text14W500_black('Upgrade')),
|
||||||
),
|
),
|
||||||
selected: true,
|
selected: true,
|
||||||
onTap: () {
|
onTap: () async {
|
||||||
setState(() {
|
SharedPreferences prefs =
|
||||||
// Get.toNamed(RouteName.privacypolicy);
|
await SharedPreferences.getInstance();
|
||||||
});
|
|
||||||
|
Get.to(WebViewSubscription(
|
||||||
|
token: prefs.getString('accessToken').toString()));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
|
|||||||
115
lib/view/Sidemenu/webview_subscription.dart
Normal file
115
lib/view/Sidemenu/webview_subscription.dart
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:traderscircuit/Utils/api_urls.dart';
|
||||||
|
|
||||||
|
class WebViewSubscription extends StatefulWidget {
|
||||||
|
WebViewSubscription({
|
||||||
|
super.key,
|
||||||
|
required this.token,
|
||||||
|
});
|
||||||
|
String token;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<WebViewSubscription> createState() => _WebViewSubscriptionState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WebViewSubscriptionState extends State<WebViewSubscription> {
|
||||||
|
final GlobalKey webViewKey = GlobalKey();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
//getData();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
InAppWebViewController? webViewController;
|
||||||
|
InAppWebViewController? webViewPopupController;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return WillPopScope(
|
||||||
|
onWillPop: () async {
|
||||||
|
final controller = webViewController;
|
||||||
|
if (controller != null) {
|
||||||
|
if (await controller.canGoBack()) {
|
||||||
|
Get.back(result: true);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Get.back(result: true);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
child: Scaffold(
|
||||||
|
body: InAppWebView(
|
||||||
|
key: webViewKey,
|
||||||
|
initialSettings: InAppWebViewSettings(
|
||||||
|
allowsBackForwardNavigationGestures: true,
|
||||||
|
supportMultipleWindows: true,
|
||||||
|
javaScriptCanOpenWindowsAutomatically: true,
|
||||||
|
javaScriptEnabled: true,
|
||||||
|
// useOnDownloadStart: true,
|
||||||
|
// useOnLoadResource: true,
|
||||||
|
// preferredContentMode: UserPreferredContentMode.MOBILE,
|
||||||
|
// useShouldOverrideUrlLoading: true,
|
||||||
|
// mediaPlaybackRequiresUserGesture: true,
|
||||||
|
// allowFileAccessFromFileURLs: true,
|
||||||
|
// allowUniversalAccessFromFileURLs: true
|
||||||
|
),
|
||||||
|
onLoadStart: (controller, Uri? uri) {
|
||||||
|
print("Load Started: $uri");
|
||||||
|
},
|
||||||
|
onCreateWindow: (controller, createWindowRequest) async {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return AlertDialog(
|
||||||
|
content: SizedBox(
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
height: 400,
|
||||||
|
child: InAppWebView(
|
||||||
|
windowId: createWindowRequest.windowId,
|
||||||
|
initialSettings: InAppWebViewSettings(
|
||||||
|
allowsBackForwardNavigationGestures: true,
|
||||||
|
supportMultipleWindows: true,
|
||||||
|
javaScriptCanOpenWindowsAutomatically: true,
|
||||||
|
javaScriptEnabled: true,
|
||||||
|
useOnDownloadStart: true,
|
||||||
|
useOnLoadResource: true,
|
||||||
|
preferredContentMode: UserPreferredContentMode.MOBILE,
|
||||||
|
// useShouldOverrideUrlLoading: true,
|
||||||
|
mediaPlaybackRequiresUserGesture: true,
|
||||||
|
allowFileAccessFromFileURLs: true,
|
||||||
|
allowUniversalAccessFromFileURLs: true),
|
||||||
|
onWebViewCreated: (InAppWebViewController controller) {
|
||||||
|
webViewPopupController = controller;
|
||||||
|
},
|
||||||
|
onLoadStart:
|
||||||
|
(InAppWebViewController controller, Uri? url) {
|
||||||
|
print("onLoadStart popup $url");
|
||||||
|
},
|
||||||
|
onLoadStop:
|
||||||
|
(InAppWebViewController controller, Uri? url) {
|
||||||
|
print("onLoadStop popup $url");
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
initialUrlRequest: URLRequest(
|
||||||
|
url: WebUri(
|
||||||
|
"https://tradercircuit.betadelivery.com/my-subscription-page"),
|
||||||
|
headers: {
|
||||||
|
"access-token": widget.token,
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
56
pubspec.lock
56
pubspec.lock
@@ -374,6 +374,62 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0-beta.2"
|
version: "3.0.0-beta.2"
|
||||||
|
flutter_inappwebview:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview
|
||||||
|
sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.0.0"
|
||||||
|
flutter_inappwebview_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_android
|
||||||
|
sha256: d247f6ed417f1f8c364612fa05a2ecba7f775c8d0c044c1d3b9ee33a6515c421
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.13"
|
||||||
|
flutter_inappwebview_internal_annotations:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_internal_annotations
|
||||||
|
sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.1"
|
||||||
|
flutter_inappwebview_ios:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_ios
|
||||||
|
sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.13"
|
||||||
|
flutter_inappwebview_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_macos
|
||||||
|
sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.11"
|
||||||
|
flutter_inappwebview_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_platform_interface
|
||||||
|
sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.10"
|
||||||
|
flutter_inappwebview_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_inappwebview_web
|
||||||
|
sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.8"
|
||||||
flutter_isolate:
|
flutter_isolate:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ dependencies:
|
|||||||
permission_handler: ^11.3.1
|
permission_handler: ^11.3.1
|
||||||
fl_chart: ^0.68.0
|
fl_chart: ^0.68.0
|
||||||
syncfusion_flutter_charts: ^21.2.4
|
syncfusion_flutter_charts: ^21.2.4
|
||||||
|
flutter_inappwebview: ^6.0.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user