672 lines
25 KiB
Dart
672 lines
25 KiB
Dart
// import 'package:flutter/material.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: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/comonGlassmorphicContainer.dart';
|
|
import 'package:traderscircuit/Utils/Common/sized_box.dart';
|
|
import 'package:traderscircuit/Utils/text.dart';
|
|
|
|
import 'package:traderscircuit/model/HomeModel/home_model.dart';
|
|
|
|
import 'package:traderscircuit/controller/products_controller.dart';
|
|
|
|
import 'package:traderscircuit/resources/routes/route_name.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/HomeApi/home_api.dart';
|
|
|
|
import '../../view_model/ProfileAPI/GetProfileApi.dart';
|
|
|
|
class HomeScreen extends StatefulWidget {
|
|
const HomeScreen({super.key});
|
|
|
|
@override
|
|
State<HomeScreen> createState() => _HomeScreenState();
|
|
}
|
|
|
|
class _HomeScreenState extends State<HomeScreen> {
|
|
GlobalKey<ScaffoldState> _scaffoldKey1 = GlobalKey<ScaffoldState>();
|
|
RxString userName = "User".obs;
|
|
|
|
HomeModel homeModel = HomeModel();
|
|
|
|
RxBool isApiCalling = true.obs;
|
|
|
|
ProductsController productsController = Get.put(ProductsController());
|
|
|
|
|
|
@override
|
|
void initState() {
|
|
GetProfile().GetProfileAPI().then((value) {
|
|
userName.value = ProfileObj!.data!.userName ?? "User";
|
|
});
|
|
HomeApi().getHomeData().then((value) {
|
|
homeModel = HomeModel.fromJson(value.data);
|
|
});
|
|
isApiCalling.value = false;
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return WillPopScope(
|
|
onWillPop: () async {
|
|
_onBackButtonPressed(context);
|
|
return true; // Return true to allow the pop action
|
|
},
|
|
child: Scaffold(
|
|
drawerEnableOpenDragGesture: false,
|
|
key: _scaffoldKey1,
|
|
backgroundColor: Colors.black,
|
|
drawer: Container(child: const SideMenu()),
|
|
extendBody: true,
|
|
appBar: AppBar(
|
|
scrolledUnderElevation: 0.0,
|
|
backgroundColor: Colors.black,
|
|
elevation: 0,
|
|
automaticallyImplyLeading: false,
|
|
titleSpacing: 0,
|
|
leading: InkWell(
|
|
onTap: () {
|
|
_scaffoldKey1.currentState?.openDrawer();
|
|
},
|
|
child: Center(
|
|
child: Image.asset(
|
|
'assets/images/png/menu.png',
|
|
height: 15.h,
|
|
width: 20.w,
|
|
),
|
|
),
|
|
),
|
|
actions: [
|
|
InkWell(
|
|
onTap: () {
|
|
Get.toNamed(RouteName.notification);
|
|
},
|
|
child: Padding(
|
|
padding: EdgeInsets.only(right: 14.w),
|
|
child: SvgPicture.asset('assets/images/svg/Group 1897.svg')),
|
|
),
|
|
],
|
|
),
|
|
body: Stack(
|
|
children: [
|
|
const CommonBlurLeft(),
|
|
const CommonBlurRight(),
|
|
Stack(children: [
|
|
Padding(
|
|
padding:
|
|
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
|
|
child: isApiCalling.value
|
|
? Center(
|
|
child: CircularProgressIndicator(),
|
|
)
|
|
: ListView(
|
|
physics: const BouncingScrollPhysics(),
|
|
children: [
|
|
|
|
sizedBoxHeight(20.h),
|
|
Obx(
|
|
() => Text(
|
|
"Welcome $userName",
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 24.sp,
|
|
fontFamily: 'hiragino',
|
|
fontWeight: FontWeight.w500),
|
|
),
|
|
|
|
),
|
|
sizedBoxHeight(25.h),
|
|
SingleChildScrollView(
|
|
scrollDirection: Axis.horizontal,
|
|
child: Row(
|
|
children: [
|
|
commoncontainer(
|
|
width: 195.w,
|
|
text: 'NIFTY',
|
|
amount: '22,286.95',
|
|
rate: '+304.15 (+1.38%)'),
|
|
sizedBoxWidth(10.w),
|
|
commoncontainer(
|
|
width: 240.w,
|
|
text: 'BANKNIFTY',
|
|
amount: '22,286.95',
|
|
rate: '+896.10 (+1.94%)'),
|
|
],
|
|
),
|
|
),
|
|
sizedBoxHeight(30.h),
|
|
Container(
|
|
width: double.infinity,
|
|
height: 1.h,
|
|
color: const Color(0xFF3A3A3A),
|
|
),
|
|
sizedBoxHeight(30.h),
|
|
text22W500('View our products'),
|
|
sizedBoxHeight(30.h),
|
|
SizedBox(
|
|
height: 210,
|
|
child: GridView.builder(
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
gridDelegate:
|
|
const SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount:
|
|
2, // number of items in each row
|
|
mainAxisSpacing: 8.0, // spacing between rows
|
|
crossAxisSpacing:
|
|
8.0, // spacing between columns
|
|
childAspectRatio: 2.2,
|
|
),
|
|
itemCount: homeModel.data!.products!.length,
|
|
itemBuilder: (context, index) {
|
|
return ProductWidget(
|
|
text: homeModel.data!.products!
|
|
.elementAt(index)
|
|
.title!,
|
|
subtext: "recommendation");
|
|
},
|
|
),
|
|
),
|
|
sizedBoxHeight(25.h),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
SvgPicture.asset(
|
|
'assets/images/svg/Vector (2).svg'),
|
|
sizedBoxWidth(10.w),
|
|
text18W500('UNLOCK NOW!'),
|
|
],
|
|
),
|
|
sizedBoxHeight(25.h),
|
|
Container(
|
|
width: double.infinity,
|
|
height: 1.h,
|
|
color: const Color(0xFF3A3A3A),
|
|
),
|
|
sizedBoxHeight(25.h),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.end,
|
|
children: [
|
|
text22W600('Explore The Unseen'),
|
|
GestureDetector(
|
|
onTap: () {
|
|
Get.toNamed(RouteName.exploreUnseen);
|
|
},
|
|
child: Container(
|
|
height: 35.h,
|
|
width: 105.w,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF3A3A3A)
|
|
.withOpacity(0.6),
|
|
borderRadius: BorderRadius.circular(5.r),
|
|
border: Border.all(
|
|
color: const Color(0xFF3A3A3A),
|
|
)),
|
|
child: Center(child: text16W500('View More')),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
sizedBoxHeight(35.h),
|
|
DefaultTabController(
|
|
length: 2,
|
|
child: Column(
|
|
children: [
|
|
MyTabBar(),
|
|
SizedBox(
|
|
height: 250.h,
|
|
child: TabBarView(
|
|
children: [
|
|
ActiveCallsTab(),
|
|
ExitedCallsTab(),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
text22W600('Content Bytes'),
|
|
sizedBoxHeight(8.w),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
SizedBox(
|
|
width: 240.w,
|
|
child: text16W400_DADADA(
|
|
'The Beauty and Power of Video')),
|
|
// sizedBoxWidth(10.w),
|
|
const Spacer(),
|
|
Container(
|
|
height: 35.h,
|
|
width: 105.w,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF3A3A3A)
|
|
.withOpacity(0.6),
|
|
borderRadius: BorderRadius.circular(5.r),
|
|
border: Border.all(
|
|
color: const 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(() => const PlayerWidget(),
|
|
arguments: {
|
|
"video_url": "",
|
|
});
|
|
},
|
|
child: Container(
|
|
height: 200.h,
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
borderRadius:
|
|
BorderRadius.circular(8.r),
|
|
image: DecorationImage(
|
|
image: NetworkImage(homeModel
|
|
.data!
|
|
.contentByteVideo!
|
|
.image ??
|
|
""),
|
|
),
|
|
),
|
|
child: Center(
|
|
child: SvgPicture.asset(
|
|
'assets/images/svg/gridicons_play.svg',
|
|
height: 56.h,
|
|
width: 56.w,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
sizedBoxHeight(20.h),
|
|
Row(
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.center,
|
|
children: [
|
|
CircleAvatar(
|
|
radius: 23.r,
|
|
backgroundImage: NetworkImage(
|
|
homeModel
|
|
.data!
|
|
.contentByteVideo!
|
|
.title ??
|
|
""),
|
|
),
|
|
sizedBoxWidth(10.w),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
text18W500(homeModel
|
|
.data!
|
|
.contentByteVideo!
|
|
.title ??
|
|
""),
|
|
// sizedBoxHeight(10.h),
|
|
text12W400_979797(
|
|
'20k views . 2 days ago'),
|
|
],
|
|
),
|
|
)
|
|
],
|
|
)
|
|
],
|
|
),
|
|
))
|
|
],
|
|
),
|
|
],
|
|
),
|
|
)
|
|
])
|
|
],
|
|
),
|
|
bottomNavigationBar: bottomnavigationbar(mainController),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<bool> _onBackButtonPressed(BuildContext context) async {
|
|
bool? exitApp = await showDialog(
|
|
context: context,
|
|
builder: (context) {
|
|
return AlertDialog(
|
|
backgroundColor: const Color(0xFFFFF3E4),
|
|
title: const Text('Exit App'),
|
|
content: const Text('Do you really want to close the app?'),
|
|
actions: [
|
|
TextButton(
|
|
onPressed: () {
|
|
Navigator.of(context).pop(false);
|
|
},
|
|
child: const Text(
|
|
'No',
|
|
style: TextStyle(
|
|
color: Color(0xff1B243D),
|
|
),
|
|
),
|
|
),
|
|
TextButton(
|
|
onPressed: () {
|
|
SystemNavigator.pop();
|
|
Navigator.pop(context);
|
|
},
|
|
child: const Text(
|
|
'Yes',
|
|
style: TextStyle(
|
|
color: Color(0xff1B243D),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
);
|
|
});
|
|
return exitApp ?? false;
|
|
}
|
|
|
|
Widget ActiveCallsTab() {
|
|
return Column(
|
|
children: [
|
|
sizedBoxHeight(30.h),
|
|
cardcallWidget(
|
|
action: homeModel.data!.exploreTheUnseenActiveCalls!.first
|
|
.recommendationActionsXid ==
|
|
1
|
|
? "Buy"
|
|
: homeModel.data!.exploreTheUnseenActiveCalls!.first
|
|
.recommendationActionsXid ==
|
|
2
|
|
? "Sell"
|
|
: homeModel.data!.exploreTheUnseenActiveCalls!.first
|
|
.recommendationActionsXid ==
|
|
3
|
|
? "Hold"
|
|
: homeModel.data!.exploreTheUnseenActiveCalls!.first
|
|
.recommendationActionsXid ==
|
|
4
|
|
? "Exit"
|
|
: "",
|
|
text: homeModel.data!.exploreTheUnseenActiveCalls!.first.stockName!,
|
|
amount:
|
|
"₹ ${homeModel.data!.exploreTheUnseenActiveCalls!.first.buyPrice!}",
|
|
pdfname: 'Download Pdf'),
|
|
sizedBoxHeight(30.h),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget ExitedCallsTab() {
|
|
return Column(
|
|
children: [
|
|
sizedBoxHeight(30.h),
|
|
homeModel.data!.exploreTheUnseenExitedCalls!.isEmpty ||
|
|
homeModel.data!.exploreTheUnseenExitedCalls == null
|
|
? text14W300("No Data")
|
|
: Column(
|
|
children: List.generate(
|
|
homeModel.data!.exploreTheUnseenExitedCalls!.length,
|
|
(index) {
|
|
return Column(
|
|
children: [
|
|
cardcallWidget(
|
|
action: "Hold",
|
|
text: homeModel.data!.exploreTheUnseenExitedCalls!
|
|
.elementAt(index)
|
|
.stockName ??
|
|
"",
|
|
amount: homeModel.data!.exploreTheUnseenExitedCalls!
|
|
.elementAt(index)
|
|
.buyPrice ??
|
|
"",
|
|
pdfname: "Download Pdf"),
|
|
sizedBoxHeight(20.h)
|
|
],
|
|
);
|
|
}),
|
|
)
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
Widget cardcallWidget(
|
|
{required String text,
|
|
required String amount,
|
|
required String pdfname,
|
|
required String action}) {
|
|
return commonGlassContainer(
|
|
width: double.infinity,
|
|
height: 176.h,
|
|
borderradius: 8,
|
|
customWidget: Column(
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w),
|
|
child: Row(
|
|
children: [
|
|
GlassmorphicContainer(
|
|
width: 47.w,
|
|
height: 47.h,
|
|
borderRadius: 100,
|
|
blur: 10,
|
|
alignment: Alignment.center,
|
|
border: 0.9,
|
|
linearGradient: const LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Color(0xff3A3A3A),
|
|
Color(0xFF3A3A3A),
|
|
],
|
|
),
|
|
borderGradient: const LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Color.fromRGBO(70, 5, 1, 0.8),
|
|
Color.fromRGBO(102, 102, 102, 0.8),
|
|
],
|
|
),
|
|
child: Center(
|
|
child:
|
|
Image.asset('assets/images/png/square_TRIDENT_com 1.png'),
|
|
),
|
|
),
|
|
sizedBoxWidth(15.w),
|
|
text18W600(text),
|
|
const Spacer(),
|
|
Container(
|
|
width: 62.w,
|
|
height: 25.h,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(4.r),
|
|
color: action == "Buy"
|
|
? Colors.green
|
|
: action == "Sell"
|
|
? Colors.red
|
|
: action == "Hold"
|
|
? const Color(0xFFFFAD31)
|
|
: Colors.white,
|
|
),
|
|
child: Center(child: text16W400_1B1B1B(action)),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
width: double.infinity,
|
|
height: 1.h,
|
|
color: const Color(0xFF3A3A3A),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(20),
|
|
child: Row(
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
text14W400_979797('Initial Entry Price'),
|
|
sizedBoxHeight(5.h),
|
|
text15W600(amount)
|
|
],
|
|
),
|
|
// sizedBoxWidth(50.w),
|
|
const Spacer(),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
text14W400_979797('Report'),
|
|
sizedBoxHeight(5.h),
|
|
Row(
|
|
children: [
|
|
// SvgPicture.asset('assets/images/svg/pdfsvg.svg'),
|
|
Image.asset(
|
|
'assets/images/png/pdf.png',
|
|
height: 20.h,
|
|
width: 20.w,
|
|
),
|
|
text15W600(pdfname),
|
|
],
|
|
)
|
|
],
|
|
)
|
|
],
|
|
),
|
|
)
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget ProductWidget({required String text, required String subtext}) {
|
|
return GlassmorphicContainer(
|
|
width: 175.w,
|
|
height: 83.h,
|
|
borderRadius: 8,
|
|
blur: 10,
|
|
alignment: Alignment.center,
|
|
border: 0.8,
|
|
linearGradient: LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Colors.white.withOpacity(0.1),
|
|
const Color(0xFFFFFFFF).withOpacity(0.05),
|
|
],
|
|
stops: [
|
|
0.1,
|
|
1,
|
|
]),
|
|
borderGradient: const LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Color(0xff3A3A3A),
|
|
Color(0xFF3A3A3A),
|
|
],
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
|
|
child: Column(
|
|
// crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
text18W600(text),
|
|
sizedBoxWidth(8.w),
|
|
text14W400_979797(subtext),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget commoncontainer(
|
|
{required String text,
|
|
required String amount,
|
|
required String rate,
|
|
required double width}) {
|
|
return GlassmorphicContainer(
|
|
width: width,
|
|
height: 83.h,
|
|
borderRadius: 8,
|
|
blur: 10,
|
|
alignment: Alignment.center,
|
|
border: 0.8,
|
|
linearGradient: LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Colors.white.withOpacity(0.1),
|
|
const Color(0xFFFFFFFF).withOpacity(0.05),
|
|
],
|
|
stops: [
|
|
0.1,
|
|
1,
|
|
]),
|
|
borderGradient: const LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
colors: [
|
|
Color(0xff3A3A3A),
|
|
Color(0xFF3A3A3A),
|
|
],
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
text14W400_979797(text),
|
|
sizedBoxWidth(8.w),
|
|
text16W600(amount),
|
|
sizedBoxWidth(8.w),
|
|
SvgPicture.asset(
|
|
'assets/images/svg/Line 587.svg',
|
|
height: 15.h,
|
|
width: 15.w,
|
|
),
|
|
],
|
|
),
|
|
sizedBoxHeight(8.w),
|
|
text14W400_00FF19(rate)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|