product recommendations api integration - pending

This commit is contained in:
jayesh
2024-05-02 18:41:33 +05:30
parent ce6249e494
commit ead927fb0f
14 changed files with 943 additions and 263 deletions

View File

@@ -3,7 +3,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:traderscircuit/Utils/text.dart';
class CommonAppbar extends StatelessWidget implements PreferredSizeWidget {
@override

View File

@@ -62,4 +62,13 @@ class ApiUrls {
"${base}get-detailed-ticket-data-with-chats/";
static String sendMessage = "${base}send-message-to-admin";
static String updateTicketStatusApi = "${base}update-ticket-status";
//Products
static String getListOfProducts = "${base}list-of-products";
static String getOptionsRecommendations =
"${base}get-options-recommendations";
static String getSwingTradeRecommendations =
"${base}get-swing-trade-recommendations";
static String getMultibaggerRecommendations =
"${base}get-multibagger-recommendations";
}

View File

@@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:traderscircuit/model/ProductsModel/call_recommendations_model.dart';
class ProductsController extends GetxController {
RxBool isLoaded = true.obs;
CallRecommendationsModel swingTradeModel = CallRecommendationsModel();
CallRecommendationsModel multibaggerModel = CallRecommendationsModel();
CallRecommendationsModel optionModel = CallRecommendationsModel();
}

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:developer';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
@@ -24,6 +25,7 @@ Future<void> main() async {
OneSignal.shared.promptUserForPushNotificationPermission();
OneSignal.shared
.setSubscriptionObserver((OSSubscriptionStateChanges changes) async {
log(changes.to.userId!.toString());
await prefs.setString('playerId', changes.to.userId!);
});
// GlobalVariables globalVariables = GlobalVariables();

View File

@@ -0,0 +1,199 @@
class CallRecommendationsModel {
String? status;
int? statusCode;
String? message;
Data? data;
CallRecommendationsModel(
{this.status, this.statusCode, this.message, this.data});
CallRecommendationsModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
statusCode = json['status_code'];
message = json['message'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['status'] = status;
data['status_code'] = statusCode;
data['message'] = message;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class Data {
List<ActiveCalls>? activeCalls;
List<ActiveCalls>? exitedCalls;
Data({this.activeCalls, this.exitedCalls});
Data.fromJson(Map<String, dynamic> json) {
if (json['active_calls'] != null) {
activeCalls = <ActiveCalls>[];
json['active_calls'].forEach((v) {
activeCalls!.add(ActiveCalls.fromJson(v));
});
}
if (json['exited_calls'] != null) {
exitedCalls = <ActiveCalls>[];
json['exited_calls'].forEach((v) {
exitedCalls!.add(ActiveCalls.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (activeCalls != null) {
data['active_calls'] = activeCalls!.map((v) => v.toJson()).toList();
}
if (exitedCalls != null) {
data['exited_calls'] = exitedCalls!.map((v) => v.toJson()).toList();
}
return data;
}
}
class ActiveCalls {
int? id;
int? manageProductXid;
int? recommendationActionsXid;
String? stockName;
String? instrumentKey;
String? stockImage;
String? qty;
String? duration;
int? currentPrice;
int? buyPrice;
int? targetPrice;
int? stopLoss;
int? isSendRecommendationNow;
Null? scheduleDateTime;
String? createdAt;
ProductData? productData;
ActionData? actionData;
ActiveCalls(
{this.id,
this.manageProductXid,
this.recommendationActionsXid,
this.stockName,
this.instrumentKey,
this.stockImage,
this.qty,
this.duration,
this.currentPrice,
this.buyPrice,
this.targetPrice,
this.stopLoss,
this.isSendRecommendationNow,
this.scheduleDateTime,
this.createdAt,
this.productData,
this.actionData});
ActiveCalls.fromJson(Map<String, dynamic> json) {
id = json['id'];
manageProductXid = json['manage_product_xid'];
recommendationActionsXid = json['recommendation_actions_xid'];
stockName = json['stock_name'];
instrumentKey = json['instrument_key'];
stockImage = json['stock_image'];
qty = json['qty'];
duration = json['duration'];
currentPrice = json['current_price'];
buyPrice = json['buy_price'];
targetPrice = json['target_price'];
stopLoss = json['stop_loss'];
isSendRecommendationNow = json['is_send_recommendation_now'];
scheduleDateTime = json['schedule_date_time'];
createdAt = json['created_at'];
productData = json['product_data'] != null
? ProductData.fromJson(json['product_data'])
: null;
actionData = json['action_data'] != null
? ActionData.fromJson(json['action_data'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['manage_product_xid'] = manageProductXid;
data['recommendation_actions_xid'] = recommendationActionsXid;
data['stock_name'] = stockName;
data['instrument_key'] = instrumentKey;
data['stock_image'] = stockImage;
data['qty'] = qty;
data['duration'] = duration;
data['current_price'] = currentPrice;
data['buy_price'] = buyPrice;
data['target_price'] = targetPrice;
data['stop_loss'] = stopLoss;
data['is_send_recommendation_now'] = isSendRecommendationNow;
data['schedule_date_time'] = scheduleDateTime;
data['created_at'] = createdAt;
if (productData != null) {
data['product_data'] = productData!.toJson();
}
if (actionData != null) {
data['action_data'] = actionData!.toJson();
}
return data;
}
}
class ProductData {
int? id;
String? productName;
int? isActive;
String? createdAt;
ProductData({this.id, this.productName, this.isActive, this.createdAt});
ProductData.fromJson(Map<String, dynamic> json) {
id = json['id'];
productName = json['product_name'];
isActive = json['is_active'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['product_name'] = productName;
data['is_active'] = isActive;
data['created_at'] = createdAt;
return data;
}
}
class ActionData {
int? id;
String? name;
int? isActive;
Null? createdAt;
ActionData({this.id, this.name, this.isActive, this.createdAt});
ActionData.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
isActive = json['is_active'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['is_active'] = isActive;
data['created_at'] = createdAt;
return data;
}
}

View File

@@ -0,0 +1,140 @@
class ListOfProductsModel {
String? status;
int? statusCode;
String? message;
List<Data>? data;
ListOfProductsModel({this.status, this.statusCode, this.message, this.data});
ListOfProductsModel.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(Data.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['status'] = status;
data['status_code'] = statusCode;
data['message'] = message;
if (this.data != null) {
data['data'] = this.data!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Data {
int? id;
String? title;
List<ProductsData>? productsData;
Data({this.id, this.title, this.productsData});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
if (json['products_data'] != null) {
productsData = <ProductsData>[];
json['products_data'].forEach((v) {
productsData!.add(ProductsData.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['title'] = title;
if (productsData != null) {
data['products_data'] = productsData!.map((v) => v.toJson()).toList();
}
return data;
}
}
class ProductsData {
int? id;
int? productTypeXid;
int? productTierXid;
String? productName;
String? productDescription;
String? productPrice;
String? productImage;
int? isActive;
String? createdAt;
ProductTier? productTier;
ProductsData(
{this.id,
this.productTypeXid,
this.productTierXid,
this.productName,
this.productDescription,
this.productPrice,
this.productImage,
this.isActive,
this.createdAt,
this.productTier});
ProductsData.fromJson(Map<String, dynamic> json) {
id = json['id'];
productTypeXid = json['product_type_xid'];
productTierXid = json['product_tier_xid'];
productName = json['product_name'];
productDescription = json['product_description'];
productPrice = json['product_price'];
productImage = json['product_image'];
isActive = json['is_active'];
createdAt = json['created_at'];
productTier = json['product_tier'] != null
? ProductTier.fromJson(json['product_tier'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['product_type_xid'] = productTypeXid;
data['product_tier_xid'] = productTierXid;
data['product_name'] = productName;
data['product_description'] = productDescription;
data['product_price'] = productPrice;
data['product_image'] = productImage;
data['is_active'] = isActive;
data['created_at'] = createdAt;
if (productTier != null) {
data['product_tier'] = productTier!.toJson();
}
return data;
}
}
class ProductTier {
int? id;
String? name;
String? createdAt;
ProductTier({this.id, this.name, this.createdAt});
ProductTier.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['created_at'] = createdAt;
return data;
}
}

View File

@@ -7,7 +7,6 @@ import 'package:get/get.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart';
import 'package:traderscircuit/Utils/Common/CommonTabBar.dart';
import 'package:traderscircuit/Utils/Common/MainController.dart';
import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart';
import 'package:traderscircuit/Utils/Common/sized_box.dart';
import 'package:traderscircuit/Utils/text.dart';
@@ -17,6 +16,8 @@ import 'package:traderscircuit/view/Sidemenu/ContentByte/PlayerWidget.dart';
import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
import '../../view_model/ProfileAPI/GetProfileApi.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@@ -26,6 +27,16 @@ class HomeScreen extends StatefulWidget {
class _HomeScreenState extends State<HomeScreen> {
GlobalKey<ScaffoldState> _scaffoldKey1 = GlobalKey<ScaffoldState>();
RxString userName = "User".obs;
@override
void initState() {
GetProfile().GetProfileAPI().then((value) {
userName.value = ProfileObj!.data!.userName ?? "User";
});
super.initState();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
@@ -37,7 +48,7 @@ class _HomeScreenState extends State<HomeScreen> {
drawerEnableOpenDragGesture: false,
key: _scaffoldKey1,
backgroundColor: Colors.black,
drawer: Container(child: SideMenu()),
drawer: Container(child: const SideMenu()),
extendBody: true,
appBar: AppBar(
scrolledUnderElevation: 0.0,
@@ -70,22 +81,25 @@ class _HomeScreenState extends State<HomeScreen> {
),
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: BouncingScrollPhysics(),
physics: const BouncingScrollPhysics(),
children: [
sizedBoxHeight(20.h),
Text(
"Welcome Afrid",
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,
fontFamily: 'hiragino',
fontWeight: FontWeight.w500),
Obx(
() => Text(
"Welcome $userName",
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,
fontFamily: 'hiragino',
fontWeight: FontWeight.w500),
),
),
sizedBoxHeight(25.h),
SingleChildScrollView(
@@ -110,7 +124,7 @@ class _HomeScreenState extends State<HomeScreen> {
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
sizedBoxHeight(30.h),
text22W500('View our products'),
@@ -147,7 +161,7 @@ class _HomeScreenState extends State<HomeScreen> {
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
sizedBoxHeight(25.h),
Row(
@@ -163,10 +177,10 @@ class _HomeScreenState extends State<HomeScreen> {
height: 35.h,
width: 105.w,
decoration: BoxDecoration(
color: Color(0xFF3A3A3A).withOpacity(0.6),
color: const Color(0xFF3A3A3A).withOpacity(0.6),
borderRadius: BorderRadius.circular(5.r),
border: Border.all(
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
)),
child: Center(child: text16W500('View More')),
),
@@ -261,15 +275,15 @@ Widget ActiveCallsTab() {
width: 240.w,
child: text16W400_DADADA('The Beauty and Power of Video')),
// sizedBoxWidth(10.w),
Spacer(),
const Spacer(),
Container(
height: 35.h,
width: 105.w,
decoration: BoxDecoration(
color: Color(0xFF3A3A3A).withOpacity(0.6),
color: const Color(0xFF3A3A3A).withOpacity(0.6),
borderRadius: BorderRadius.circular(5.r),
border: Border.all(
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
),
child: Center(
@@ -294,7 +308,7 @@ Widget ActiveCallsTab() {
children: [
InkWell(
onTap: () {
Get.to(() => PlayerWidget(), arguments: {
Get.to(() => const PlayerWidget(), arguments: {
"video_url": "",
});
},
@@ -303,7 +317,7 @@ Widget ActiveCallsTab() {
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
image: DecorationImage(
image: const DecorationImage(
image: AssetImage(
'assets/images/png/Rectangle 17934.png'))),
child: Center(
@@ -321,8 +335,8 @@ Widget ActiveCallsTab() {
children: [
CircleAvatar(
radius: 23.r,
backgroundImage:
AssetImage('assets/images/png/Ellipse 1494.png'),
backgroundImage: const AssetImage(
'assets/images/png/Ellipse 1494.png'),
),
sizedBoxWidth(10.w),
Expanded(
@@ -406,7 +420,7 @@ Widget cardcallWidget(
blur: 10,
alignment: Alignment.center,
border: 0.9,
linearGradient: LinearGradient(
linearGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -414,7 +428,7 @@ Widget cardcallWidget(
Color(0xFF3A3A3A),
],
),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -429,13 +443,13 @@ Widget cardcallWidget(
),
sizedBoxWidth(15.w),
text18W600(text),
Spacer(),
const Spacer(),
Container(
width: 62.w,
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: Color(0xFFFFAD31),
color: const Color(0xFFFFAD31),
),
child: Center(child: text16W400_1B1B1B('Hold')),
)
@@ -445,7 +459,7 @@ Widget cardcallWidget(
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
Padding(
padding: const EdgeInsets.all(20),
@@ -460,7 +474,7 @@ Widget cardcallWidget(
],
),
// sizedBoxWidth(50.w),
Spacer(),
const Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -500,13 +514,13 @@ Widget ProductWidget({required String text, required String subtext}) {
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -545,13 +559,13 @@ Widget commoncontainer(
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [

View File

@@ -1,21 +1,22 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:gap/gap.dart';
import 'package:get/get.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/CommonAppBar.dart';
import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart';
import 'package:traderscircuit/Utils/Common/CommonTabBar.dart';
import 'package:traderscircuit/Utils/Common/commonBotton.dart';
import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart';
import 'package:traderscircuit/Utils/Common/sized_box.dart';
import 'package:traderscircuit/Utils/text.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/controller/products_controller.dart';
import 'package:traderscircuit/model/ProductsModel/call_recommendations_model.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/onBoarding/splashScreen1.dart';
import 'package:traderscircuit/view_model/ProductsApi/products_api.dart';
class ShortTrade extends StatefulWidget {
const ShortTrade({super.key});
@@ -28,6 +29,27 @@ class _ShortTradeState extends State<ShortTrade> {
GlobalKey<ScaffoldState> _scaffoldKey1 = GlobalKey<ScaffoldState>();
List<String> containerTexts = ["Swing Trade", "Multibagger", "Options"];
final selectedIndex = 0.obs;
ProductsController productsController = Get.put(ProductsController());
@override
void initState() {
productsController.isLoaded.value = true;
ProductsApi().getSwingTradeRecommendationsApi().then((value) {
productsController.swingTradeModel =
CallRecommendationsModel.fromJson(value.data);
ProductsApi().getMultibaggerRecommendationsApi().then((value) {
productsController.multibaggerModel =
CallRecommendationsModel.fromJson(value.data);
ProductsApi().getOptionsRecommendationsApi().then((value) {
productsController.optionModel =
CallRecommendationsModel.fromJson(value.data);
productsController.isLoaded.value = false;
});
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
@@ -38,7 +60,7 @@ class _ShortTradeState extends State<ShortTrade> {
child: Scaffold(
key: _scaffoldKey1,
backgroundColor: Colors.black, drawerEnableOpenDragGesture: false,
drawer: Container(child: SideMenu()),
drawer: const SideMenu(),
extendBody: true,
appBar: AppBar(
scrolledUnderElevation: 0.0,
@@ -83,63 +105,88 @@ class _ShortTradeState extends State<ShortTrade> {
// // ),
// ),
// ),
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
Stack(children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: NeverScrollableScrollPhysics(),
children: [
sizedBoxHeight(15.h),
SizedBox(
height: 60,
width: double.infinity,
// color: Colors.amber,
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemCount: containerTexts.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
selectedIndex.value = index;
},
child: Row(
body: Obx(
() => Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 16),
child: ListView(
physics: const NeverScrollableScrollPhysics(),
children: [
sizedBoxHeight(15.h),
SizedBox(
height: 60,
width: double.infinity,
// color: Colors.amber,
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemCount: containerTexts.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
selectedIndex.value = index;
},
child: Row(
children: [
topContainer(
containerTexts[index], index),
sizedBoxWidth(10.w)
],
),
);
}),
),
sizedBoxHeight(20.h),
productsController.isLoaded.value
? const Center(
child: CircularProgressIndicator(
color: Colors.redAccent,
),
)
: DefaultTabController(
length: 2,
// initialIndex: selectedIndex.value,
child: Column(
children: [
topContainer(
containerTexts[index], index),
sizedBoxWidth(10.w)
MyTabBar(),
SizedBox(
height: 700.h,
child: TabBarView(
children: [
ActiveCallsTab(
selectedIndex.value == 0
? productsController
.swingTradeModel
: selectedIndex.value == 1
? productsController
.multibaggerModel
: productsController
.optionModel),
ExitedCallsTab(
selectedIndex.value == 0
? productsController
.swingTradeModel
: selectedIndex.value == 1
? productsController
.multibaggerModel
: productsController
.optionModel),
],
),
),
],
),
);
}),
),
sizedBoxHeight(20.h),
DefaultTabController(
length: 2,
// initialIndex: selectedIndex.value,
child: Column(
children: [
MyTabBar(),
SizedBox(
height: 700.h,
child: TabBarView(
children: [
ActiveCallsTab(),
ExitedCallsTab(),
],
),
),
],
),
),
sizedBoxHeight(20.h),
]))
])
],
sizedBoxHeight(20.h),
]))
])
],
),
),
bottomNavigationBar: bottomnavigationbar(mainController),
),
@@ -184,127 +231,55 @@ class _ShortTradeState extends State<ShortTrade> {
return exitApp ?? false;
}
Widget ActiveCallsTab() {
return Obx(() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (selectedIndex == 1 || selectedIndex == 2) _unlockbottomsheet();
});
return selectedIndex == 0
? SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Padding(
padding: EdgeInsets.only(top: 20.h, bottom: 210.h),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
cardSwingWidget(
text: 'Indiabulls Housing Finance Ltd',
Widget ActiveCallsTab(CallRecommendationsModel callRecommendationsModel) {
return callRecommendationsModel.data!.activeCalls!.isEmpty
? Center(
child: Column(
children: [
const Gap(200),
text22W600("No Data Available !"),
],
))
: ListView.builder(
itemCount: callRecommendationsModel.data!.activeCalls!.length,
itemBuilder: (ctx, index) {
return Padding(
padding: EdgeInsets.only(top: 20.h, bottom: 5.h),
child: selectedIndex.value == 0
? cardSwingWidget(
image: callRecommendationsModel
.data!.activeCalls![index].stockImage!,
text: callRecommendationsModel
.data!.activeCalls![index].stockName!,
amount: '₹ 196.50 - ₹ 197',
targetamount: '₹ 204',
stoploss: '₹ 190',
time: '4-5 Days'),
sizedBoxHeight(25.h),
text22W600('Content Bytes'),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 240.w,
child: text16W400_DADADA(
'The Beauty and Power of Video')),
Spacer(),
Container(
height: 35.h,
width: 105.w,
decoration: BoxDecoration(
color: Color(0xFF3A3A3A).withOpacity(0.6),
borderRadius: BorderRadius.circular(5.r),
border: Border.all(
color: Color(0xFF3A3A3A),
)),
child: Center(
child: InkWell(
onTap: () {
Get.toNamed(RouteName.contentbytes);
},
child: text16W500('View More'),
),
),
),
],
),
sizedBoxHeight(20.h),
commonGlassContainer(
borderradius: 8,
width: double.infinity,
height: 330.h,
customWidget: Padding(
padding: EdgeInsets.symmetric(
vertical: 10.h, horizontal: 10.w),
child: Column(
children: [
InkWell(
onTap: () {
Get.to(() => PlayerWidget(), arguments: {
"video_url": "",
});
},
child: Container(
height: 200.h,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
image: DecorationImage(
image: AssetImage(
'assets/images/png/Rectangle 17934.png'))),
child: Center(
child: SvgPicture.asset(
'assets/images/svg/gridicons_play.svg',
height: 56.h,
width: 56.w,
),
),
),
),
sizedBoxHeight(20.h),
Row(
children: [
CircleAvatar(
radius: 23.r,
backgroundImage: AssetImage(
'assets/images/png/Ellipse 1494.png'),
),
sizedBoxWidth(10.w),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
text18W500('Week of 21st February 2024'),
// sizedBoxHeight(10.h),
text12W400_979797(
'20k views . 2 days ago'),
],
),
)
],
)
],
),
),
),
],
),
),
)
: selectedIndex == 1
? Column(
children: [],
)
: Column(
children: [],
);
});
targetamount:
'${callRecommendationsModel.data!.activeCalls![index].targetPrice}',
stoploss:
'${callRecommendationsModel.data!.activeCalls![index].stopLoss}',
time:
'${callRecommendationsModel.data!.activeCalls![index].duration}',
action: callRecommendationsModel
.data!.activeCalls![index].actionData!.name!,
)
: selectedIndex.value == 1
? cardMultibaggerWidget(
text: callRecommendationsModel
.data!.activeCalls![index].stockName!,
price:
"${callRecommendationsModel.data!.activeCalls![index].buyPrice}",
date: callRecommendationsModel
.data!.activeCalls![index].createdAt!,
returns:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
stoploss:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
duration: callRecommendationsModel
.data!.activeCalls![index].duration!,
pdfname: "Download Pdf",
)
: SizedBox(),
);
});
}
void _unlockbottomsheet() {
@@ -331,7 +306,7 @@ class _ShortTradeState extends State<ShortTrade> {
onTap: () {},
),
SizedBox(
const SizedBox(
height: 100,
)
],
@@ -343,7 +318,7 @@ class _ShortTradeState extends State<ShortTrade> {
);
}
Widget ExitedCallsTab() {
Widget ExitedCallsTab(CallRecommendationsModel callRecommendationsModel) {
List<Map<String, String>> cardSwing = [
{
'text': 'Indiabulls Housing Finance Ltd',
@@ -436,22 +411,38 @@ class _ShortTradeState extends State<ShortTrade> {
children: [
sizedBoxHeight(20.h),
Obx(() {
return selectedIndex == 0
? Column(
children: List.generate(cardSwing.length, (index) {
return Column(
return selectedIndex.value == 0
? callRecommendationsModel.data!.exitedCalls!.isEmpty
? Center(
child: Column(
children: [
cardSwingWidget(
text: cardSwing[index]['text']!,
amount: cardSwing[index]['amount']!,
targetamount: cardSwing[index]['targetamount']!,
stoploss: cardSwing[index]['stoploss']!,
time: cardSwing[index]['time']!),
sizedBoxHeight(20.h)
const Gap(200),
text22W600("No Data Available !"),
],
);
}),
)
))
: ListView.builder(
itemCount:
callRecommendationsModel.data!.exitedCalls!.length,
itemBuilder: (ctx, index) {
return Padding(
padding: EdgeInsets.only(top: 20.h, bottom: 5.h),
child: cardSwingWidget(
image: callRecommendationsModel
.data!.exitedCalls![index].stockImage!,
text: callRecommendationsModel
.data!.exitedCalls![index].stockName!,
amount: '₹ 196.50 - ₹ 197',
targetamount:
'${callRecommendationsModel.data!.exitedCalls![index].targetPrice}',
stoploss:
'${callRecommendationsModel.data!.exitedCalls![index].stopLoss}',
time:
'${callRecommendationsModel.data!.exitedCalls![index].duration}',
action: callRecommendationsModel
.data!.exitedCalls![index].actionData!.name!,
),
);
})
: selectedIndex == 1
? Column(
children:
@@ -526,7 +517,7 @@ class _ShortTradeState extends State<ShortTrade> {
blur: 10,
alignment: Alignment.center,
border: 0.9,
linearGradient: LinearGradient(
linearGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -534,7 +525,7 @@ class _ShortTradeState extends State<ShortTrade> {
Color(0xFF3A3A3A),
],
),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -552,13 +543,13 @@ class _ShortTradeState extends State<ShortTrade> {
),
sizedBoxWidth(15.w),
SizedBox(width: 200.w, child: text18W600(text)),
Spacer(),
const Spacer(),
Container(
width: 62.w,
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: Color(0xFFFFAD31),
color: const Color(0xFFFFAD31),
),
child: Center(child: text14W600_1B1B1B('Hold')),
)
@@ -568,7 +559,7 @@ class _ShortTradeState extends State<ShortTrade> {
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
Padding(
padding: const EdgeInsets.all(18),
@@ -684,7 +675,7 @@ class _ShortTradeState extends State<ShortTrade> {
blur: 10,
alignment: Alignment.center,
border: 0.9,
linearGradient: LinearGradient(
linearGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -692,7 +683,7 @@ class _ShortTradeState extends State<ShortTrade> {
Color(0xFF3A3A3A),
],
),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -710,13 +701,13 @@ class _ShortTradeState extends State<ShortTrade> {
),
sizedBoxWidth(15.w),
SizedBox(width: 200.w, child: text18W600(text)),
Spacer(),
const Spacer(),
Container(
width: 62.w,
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: Color(0xFFFFAD31),
color: const Color(0xFFFFAD31),
),
child: Center(child: text14W600_1B1B1B('Hold')),
)
@@ -726,7 +717,7 @@ class _ShortTradeState extends State<ShortTrade> {
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
Padding(
padding: const EdgeInsets.all(18),
@@ -819,11 +810,13 @@ class _ShortTradeState extends State<ShortTrade> {
}
Widget cardSwingWidget({
required String image,
required String text,
required String amount,
required String targetamount,
required String stoploss,
required String time,
required String action,
}) {
return commonGlassContainer(
width: double.infinity,
@@ -842,7 +835,7 @@ class _ShortTradeState extends State<ShortTrade> {
blur: 10,
alignment: Alignment.center,
border: 0.9,
linearGradient: LinearGradient(
linearGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -850,7 +843,7 @@ class _ShortTradeState extends State<ShortTrade> {
Color(0xFF3A3A3A),
],
),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -859,20 +852,22 @@ class _ShortTradeState extends State<ShortTrade> {
],
),
child: Center(
child: Image.asset('assets/images/png/Teal.png'),
child: CachedNetworkImage(imageUrl: image),
),
),
sizedBoxWidth(15.w),
SizedBox(width: 200.w, child: text18W600(text)),
Spacer(),
const Spacer(),
Container(
width: 62.w,
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: Color(0xFFFFAD31),
color: action == "Buy"
? const Color(0xFF00FF19)
: const Color(0xFFFFAD31),
),
child: Center(child: text14W600_1B1B1B('Hold')),
child: Center(child: text14W600_1B1B1B(action)),
)
],
),
@@ -880,7 +875,7 @@ class _ShortTradeState extends State<ShortTrade> {
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFF3A3A3A),
color: const Color(0xFF3A3A3A),
),
Padding(
padding: const EdgeInsets.all(20),
@@ -945,7 +940,7 @@ class _ShortTradeState extends State<ShortTrade> {
width: 126.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
color: Color(0Xff6C0000),
color: const Color(0Xff6C0000),
),
child: Center(child: text16W500(text)),
)

View File

@@ -21,7 +21,6 @@ class _SideMenuState extends State<SideMenu> {
@override
void initState() {
// TODO: implement initState
GetProfile().GetProfileAPI();
super.initState();
}
@@ -132,9 +131,7 @@ class _SideMenuState extends State<SideMenu> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text18W400(
//ProfileObj!.data!.userName ??
""),
text18W400(ProfileObj!.data!.userName ?? ""),
sizedBoxHeight(4.h),
text18W400('My Profile'),
],

View File

@@ -65,10 +65,29 @@ class _ContactUsDetailsScreenState extends State<ContactUsDetailsScreen> {
child: Form(
key: queriesForm,
child: Scaffold(
appBar: CommonAppbar(
height: 75,
titleTxt: "",
customActionWidget: text16W400(""),
appBar: AppBar(
scrolledUnderElevation: 0.0,
backgroundColor: Colors.black,
elevation: 0,
leadingWidth: 56.w,
leading: Padding(
padding: EdgeInsets.only(left: 16.w, top: 20.h),
child: GestureDetector(
onTap: () {
contactUsController.isTicketClosed
? Get.back(result: true)
: Get.back();
},
child: Padding(
padding: EdgeInsets.only(left: 8.w),
child: Icon(
Icons.arrow_back_ios,
color: Colors.white,
size: 25.r,
),
),
),
),
),
backgroundColor: Colors.black,
extendBody: true,

View File

@@ -1,3 +1,216 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:get/get.dart';
import 'package:traderscircuit/controller/contact_us_controller.dart';
import 'package:traderscircuit/model/ContactUsModel/contact_us_cat_model.dart';
import 'package:traderscircuit/model/ContactUsModel/contact_us_model.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view_model/ContactUsApi/contact_us_api.dart';
import '../../../Utils/Common/CommonAppbar.dart';
import '../../../Utils/Common/commonBotton.dart';
import '../../../Utils/text.dart';
import '../../../view_model/ProfileAPI/GetProfileApi.dart';
import '../../onBoarding/splashScreen1.dart';
import 'create_ticket_bottom_sheet.dart';
class ContactUsMainScreen extends StatefulWidget {
const ContactUsMainScreen({super.key});
@override
State<ContactUsMainScreen> createState() => _ContactUsMainScreenState();
}
class _ContactUsMainScreenState extends State<ContactUsMainScreen> {
ContactUsController contactUsController = Get.put(ContactUsController());
RxBool isEmpty = false.obs;
@override
void initState() {
contactUsController.isLoading.value == true;
ContactUsApi().getContactUsCategoriesData().then((value) {
contactUsController.contactCatModel =
ContactUsCatModel.fromJson(value.data);
ContactUsApi().getContactUsData().then((value) {
Map<String, dynamic> responseData =
Map<String, dynamic>.from(value.data);
if (responseData["message"] == "Data not found.") {
isEmpty.value = true;
} else {
contactUsController.allC.value = 0;
contactUsController.openC.value = 0;
contactUsController.closeC.value = 0;
contactUsController.resolvedC.value = 0;
contactUsController.contactModel =
ContactUsModel.fromJson(value.data);
for (var a in contactUsController.contactModel.data!) {
if (a.status == 1) {
contactUsController.openC.value += 1;
contactUsController.allC.value += 1;
} else if (a.status == 2) {
contactUsController.closeC.value += 1;
contactUsController.allC.value += 1;
} else if (a.status == 3) {
contactUsController.resolvedC.value += 1;
contactUsController.allC.value += 1;
}
}
}
contactUsController.isLoading.value = false;
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Obx(() => DefaultTabController(
length: 4,
child: Scaffold(
appBar: CommonAppbar(
height: 75,
titleTxt: "",
customActionWidget: text16W400(""),
),
backgroundColor: Colors.black,
extendBody: true,
bottomNavigationBar: Padding(
padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 40),
child: SizedBox(
width: Get.width,
child: kycBtn(
text: "Create Ticket",
onTap: () {
contactUsController.attachmentFileList.clear();
contactUsController.attachmentPathNameList.clear();
CreateTicketBottomSheet().bottomSheet(context);
},
bgClr: const Color(0xFF6C0000),
borderClr: const Color(0xFF990000),
),
),
),
body: Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 16),
child: contactUsController.isLoading.value
? const Center(
child: CircularProgressIndicator(
color: Colors.redAccent,
))
: isEmpty.value
? Center(child: text18W800("No Data Available"))
: ListView(
physics: const NeverScrollableScrollPhysics(),
children: [
text25W600("Contact Us"),
const Gap(20),
text16W400(
"Hi ${ProfileObj!.data!.userName}"),
text16W400("We are here to help you"),
const Gap(12),
TabBar(
tabAlignment: TabAlignment.start,
labelStyle: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.w400,
fontFamily: "hiragino",
),
isScrollable: true,
labelColor: Colors.white,
unselectedLabelColor:
const Color(0xFF464646),
indicatorColor: const Color(0xFF6C0000),
indicatorSize: TabBarIndicatorSize.tab,
unselectedLabelStyle: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.w500,
fontFamily: "hiragino",
),
tabs: [
Tab(
text:
"All Tickets (${contactUsController.allC.value})"),
Tab(
text:
"Open Tickets (${contactUsController.openC.value})"),
Tab(
text:
"Closed (${contactUsController.closeC.value})"),
Tab(
text:
"Resolved (${contactUsController.resolvedC.value})"),
],
),
SizedBox(
height: 0.5.sh,
child: TabBarView(children: [
ListView.builder(
itemCount: contactUsController
.contactModel.data!.length,
itemBuilder: (ctx, index) {
return ticketCardWidget(
index, "ALL");
}),
ListView.builder(
itemCount: contactUsController
.contactModel.data!.length,
itemBuilder: (ctx, index) {
return contactUsController
.contactModel
.data![index]
.status ==
1
? ticketCardWidget(
index, "OPEN")
: const SizedBox();
}),
ListView.builder(
itemCount: contactUsController
.contactModel.data!.length,
itemBuilder: (ctx, index) {
return contactUsController
.contactModel
.data![index]
.status ==
2
? ticketCardWidget(
index, "CLOSED")
: const SizedBox();
}),
ListView.builder(
itemCount: contactUsController
.contactModel.data!.length,
itemBuilder: (ctx, index) {
return contactUsController
.contactModel
.data![index]
.status ==
3
? ticketCardWidget(
index, "RESOLVED")
: const SizedBox();
}),
]),
)
],
)),
]),
],
),
),
));
}
}
Widget ticketCardWidget(index, type) {
ContactUsController contactUsController = Get.put(ContactUsController());
return InkWell(

View File

@@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -44,6 +46,7 @@ class _VerifyOTPState extends State<VerifyOTP> {
if (isValid!) {
SharedPreferences prefs = await SharedPreferences.getInstance();
Utils.loader();
// print("PLAYER ID ==> ${prefs.getString("playerId")}");
Map<String, String> updata = {
"mobile_number": phonenumber.toString(),
"otp": pincode.text,
@@ -51,6 +54,7 @@ class _VerifyOTPState extends State<VerifyOTP> {
};
final resp = await VerifyNumberAPI(updata).verifynumberApi();
if (resp.status == ResponseStatus.SUCCESS) {
log(resp.data.toString());
Get.back();
isVendorExist = resp.data["data"]["vendor_account_exist"];
isProfileUpdated = resp.data["data"]["user_data"]["profile_updated"];
@@ -101,7 +105,7 @@ class _VerifyOTPState extends State<VerifyOTP> {
} else {
Get.back();
String? message = resp.message;
Utils.showToast("$message");
Utils.showToast(message);
}
}
}
@@ -109,21 +113,22 @@ class _VerifyOTPState extends State<VerifyOTP> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CommonAppbar(titleTxt: "Verify OTP"),
appBar: const CommonAppbar(titleTxt: "Verify OTP"),
backgroundColor: Colors.black,
extendBody: true,
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Form(
key: _otpform,
child: ListView(
physics: BouncingScrollPhysics(),
physics: const BouncingScrollPhysics(),
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -165,7 +170,7 @@ class _VerifyOTPState extends State<VerifyOTP> {
fieldHeight: 60.h,
fieldWidth: 60.w,
),
animationDuration: Duration(milliseconds: 300),
animationDuration: const Duration(milliseconds: 300),
enableActiveFill: true,
controller: pincode,
onCompleted: (v) {

View File

@@ -6,6 +6,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
@@ -46,7 +47,10 @@ class _SplashScreenState extends State<SplashScreen>
void initState() {
super.initState();
checkInternet();
OneSignal.shared
.setSubscriptionObserver((OSSubscriptionStateChanges changes) async {
print(changes.to.userId!.toString());
});
Future.delayed(Duration(seconds: 2), () async {
if (_connectionStatus == ConnectivityResult.none) {
var result = await Get.to(NoInternet());

View File

@@ -0,0 +1,75 @@
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 ProductsApi {
Future<ResponseData<dynamic>> getListOfProducts() async {
final response = await NetworkApiServices()
.getApi(ApiUrls.getListOfProducts, isAuth: true);
log(response.data.toString());
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;
}
Future<ResponseData<dynamic>> getOptionsRecommendationsApi() async {
final response = await NetworkApiServices()
.getApi(ApiUrls.getOptionsRecommendations, isAuth: true);
// log(response.data.toString());
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;
}
Future<ResponseData<dynamic>> getSwingTradeRecommendationsApi() async {
final response = await NetworkApiServices()
.getApi(ApiUrls.getSwingTradeRecommendations, isAuth: true);
// log(response.data.toString());
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;
}
Future<ResponseData<dynamic>> getMultibaggerRecommendationsApi() async {
final response = await NetworkApiServices()
.getApi(ApiUrls.getMultibaggerRecommendations, isAuth: true);
// log(response.data.toString());
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;
}
}