Merge branch 'main' into product

This commit is contained in:
Raj
2024-05-08 16:06:35 +05:30
committed by GitHub
24 changed files with 1473 additions and 819 deletions

View File

@@ -1,8 +1,5 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/MainController.dart';
@@ -19,13 +16,13 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
stops: const [
0.1,
1,
]),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
@@ -36,18 +33,18 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
child: BottomNavigationBar(
// backgroundColor: ,
type: BottomNavigationBarType.fixed,
backgroundColor: Color(0xFFFFFFFF).withOpacity(0),
backgroundColor: const Color(0xFFFFFFFF).withOpacity(0),
showUnselectedLabels: true,
selectedItemColor: Colors.white,
unselectedItemColor: Color(0xFF676767),
unselectedItemColor: const Color(0xFF676767),
unselectedLabelStyle: TextStyle(
fontSize: 10.sp,
color: Color(0xFF676767),
color: const Color(0xFF676767),
fontWeight: FontWeight.w400,
fontFamily: 'hiragino'),
selectedLabelStyle: TextStyle(
fontSize: 10.sp,
color: Color(0xFFFFFFFF),
color: const Color(0xFFFFFFFF),
fontWeight: FontWeight.w400,
fontFamily: 'hiragino'),
currentIndex: _mainController.selectedIndex.value,
@@ -78,7 +75,7 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
color: Colors.grey.withOpacity(0.4),
spreadRadius: 15,
blurRadius: 10,
offset: Offset(0, 10),
offset: const Offset(0, 10),
),
],
),
@@ -121,7 +118,7 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
color: Colors.grey.withOpacity(0.4),
spreadRadius: 15,
blurRadius: 10,
offset: Offset(0, 10),
offset: const Offset(0, 10),
),
],
),
@@ -163,7 +160,7 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
color: Colors.grey.withOpacity(0.4),
spreadRadius: 15,
blurRadius: 10,
offset: Offset(0, 10),
offset: const Offset(0, 10),
),
],
),
@@ -205,7 +202,7 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) {
color: Colors.grey.withOpacity(0.4),
spreadRadius: 15,
blurRadius: 10,
offset: Offset(0, 10),
offset: const Offset(0, 10),
),
],
),

View File

@@ -94,6 +94,7 @@ class _CustomTextFormFieldState extends State<CustomTextFormField> {
obscureText: obscureText,
controller: widget.textEditingController,
decoration: InputDecoration(
hintStyle: TextStyle(color: Colors.white),
hintText: widget.hintText,
prefixIconColor: widget.prefixIconColor,
// ignore: prefer_null_aware_operators

View File

@@ -1,7 +1,6 @@
import 'package:get/get.dart';
import 'package:traderscircuit/view/MainScreen/HomeScreen.dart';
import 'package:traderscircuit/view/MainScreen/PastPerformance.dart';
import 'package:traderscircuit/view/MainScreen/Portfolio/Holdings.dart';
import 'package:traderscircuit/view/MainScreen/Portfolio/PortfolioEmpty.dart';
import 'package:traderscircuit/view/MainScreen/ShortTrade.dart';

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:glassmorphism/glassmorphism.dart';
Widget commonGlassContainer(
@@ -19,14 +18,14 @@ Widget commonGlassContainer(
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
stops: const [
0.1,
1,
],
),
borderGradient: LinearGradient(
borderGradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [

View File

@@ -2,8 +2,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:traderscircuit/Utils/Common/sized_box.dart';
import 'package:traderscircuit/Utils/text.dart';
class NoInternet extends StatefulWidget {
const NoInternet({super.key});

View File

@@ -49,6 +49,8 @@ class ApiUrls {
"${base}getContentByteCategories";
static String getContentBytesApi = "${base}getContentBytes";
static String morevideoApi = "${base}get-content-bytes-of-videos";
static String getPreviousReadApi = "${base}get-previous-reads-of-user";
static String storeReadCountApi = "${base}store-content-byte-read-click";
//Profile
static String Getprofile = "${base}getuserDetails";

View File

@@ -3,9 +3,10 @@ import 'dart:io';
import 'package:get/get.dart';
import 'package:traderscircuit/model/ContactUsModel/contact_us_cat_model.dart';
import 'package:traderscircuit/model/ContactUsModel/contact_us_model.dart';
import 'package:intl/intl.dart';
import 'package:timeago/timeago.dart' as timeago;
import '../model/ContactUsModel/ticket_details_model.dart';
import 'package:intl/intl.dart';
class ContactUsController extends GetxController {
RxBool isLoading = true.obs;
@@ -29,11 +30,23 @@ class ContactUsController extends GetxController {
RxString selectedValue = "".obs;
//formated date
String formatedDateTimeMethod(String originalDateTimeString) {
DateTime dateTime = DateTime.parse(originalDateTimeString);
return DateFormat("dd MMM yyyy, hh:mm a").format(dateTime.toLocal());
}
// RxList<dynamic> contactUsDetailsChatContent = [].obs;
String timeAgoConverter(String originalDateTimeString) {
DateTime dateTime = DateTime.parse(originalDateTimeString);
// Get the difference in days
DateTime now = DateTime.now();
int differenceInDays = now.difference(dateTime).inDays;
// Convert to "2 days ago" format
return timeago.format(now.subtract(Duration(days: differenceInDays)));
}
}

View File

@@ -1,11 +1,12 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:just_audio/just_audio.dart';
import 'package:traderscircuit/Utils/base_manager.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_categories_model.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_model.dart';
import 'package:traderscircuit/view_model/ContentBytesApi/content_bytes_api.dart';
import '../model/ContentBytesModel/previous_read_user_model.dart';
import '../view/Sidemenu/ContentByte/ContentBytes.dart';
class ContentBytesController extends GetxController {
@@ -13,12 +14,15 @@ class ContentBytesController extends GetxController {
ContentBytesCategoriesModel contentBytesCategoriesModel =
ContentBytesCategoriesModel();
ContentBytesModel contentBytesModel = ContentBytesModel();
PreviousReadOfUserModel previousReadOfUserModel = PreviousReadOfUserModel();
int filterId = 0;
RxBool isApiCalling = true.obs;
RxBool isAudioSeekBarVisible = false.obs;
RxInt indexForAudios = 0.obs;
RxBool titlePlaying = false.obs;
RxList<bool>? titlePlayingList = <bool>[].obs;
bool isAudioInitialize = false;
final progressNotifier = ValueNotifier<ProgressBarState>(
ProgressBarState(
@@ -29,22 +33,21 @@ class ContentBytesController extends GetxController {
);
final buttonNotifier = ValueNotifier<ButtonState>(ButtonState.paused);
late AudioPlayer _audioPlayer;
late AudioPlayer audioPlayer;
@override
void dispose() {
_audioPlayer.stop();
audioPlayer.stop();
super.dispose();
}
void getAudio() => _audioPlayer;
void init(index) async {
_audioPlayer = AudioPlayer();
audioPlayer = AudioPlayer();
isAudioInitialize = true;
indexForAudios.value = index;
try {
await _audioPlayer.setUrl(
//contentBytesModel.data!.audio![index].file ??
'https://ghantalele.com/uploads/files/data-78/38825/Besharam%20Rang_192(Ghantalele.com).mp3');
// await _audioPlayer.setAsset(url);
log(index.toString());
await audioPlayer.setUrl(contentBytesModel.data!.audio![index].link!);
// await audioPlayer.setAsset(url);
} on PlayerException catch (e) {
print("Error code: ${e.code}");
// iOS/macOS: maps to NSError.localizedDescription
@@ -54,7 +57,7 @@ class ContentBytesController extends GetxController {
print("Error message: ${e.message}");
}
//Catching errors during playback (e.g. lost network connection)
_audioPlayer.playbackEventStream.listen((event) {},
audioPlayer.playbackEventStream.listen((event) {},
onError: (Object e, StackTrace st) {
if (e is PlayerException) {
print('Error code: ${e.code}');
@@ -64,7 +67,7 @@ class ContentBytesController extends GetxController {
}
});
_audioPlayer.playerStateStream.listen((playerState) {
audioPlayer.playerStateStream.listen((playerState) {
final isPlaying = playerState.playing;
final processingState = playerState.processingState;
if (!isPlaying) {
@@ -74,12 +77,12 @@ class ContentBytesController extends GetxController {
} else {
_playNextTrack();
// _audioPlayer.seek(Duration.zero);
// _audioPlayer.pause();
// audioPlayer.seek(Duration.zero);
// audioPlayer.pause();
}
});
_audioPlayer.positionStream.listen((position) {
audioPlayer.positionStream.listen((position) {
final oldState = progressNotifier.value;
progressNotifier.value = ProgressBarState(
current: position,
@@ -88,7 +91,7 @@ class ContentBytesController extends GetxController {
);
});
_audioPlayer.bufferedPositionStream.listen((bufferedPosition) {
audioPlayer.bufferedPositionStream.listen((bufferedPosition) {
final oldState = progressNotifier.value;
progressNotifier.value = ProgressBarState(
current: oldState.current,
@@ -97,7 +100,7 @@ class ContentBytesController extends GetxController {
);
});
_audioPlayer.durationStream.listen((totalDuration) {
audioPlayer.durationStream.listen((totalDuration) {
final oldState = progressNotifier.value;
progressNotifier.value = ProgressBarState(
current: oldState.current,
@@ -120,8 +123,8 @@ class ContentBytesController extends GetxController {
init(nextIndex);
play(nextIndex);
} else {
_audioPlayer.seek(Duration.zero);
_audioPlayer.pause();
audioPlayer.seek(Duration.zero);
audioPlayer.pause();
}
}
@@ -140,26 +143,26 @@ class ContentBytesController extends GetxController {
}
void play(index) {
_audioPlayer.play();
audioPlayer.play();
isAudioSeekBarVisible.value = false;
isAudioSeekBarVisible.value = true;
indexForAudios.value = index;
}
void pause() {
_audioPlayer.pause();
audioPlayer.pause();
}
void seek(Duration position) {
_audioPlayer.seek(position);
audioPlayer.seek(position);
}
void stop() {
_audioPlayer.stop();
audioPlayer.stop();
}
bool isPlaying() {
return _audioPlayer.playing;
return audioPlayer.playing;
}
addTitles() {

View File

@@ -1,9 +1,17 @@
import 'package:get/get.dart';
import 'package:traderscircuit/model/ProductsModel/call_recommendations_model.dart';
import 'package:intl/intl.dart';
class ProductsController extends GetxController {
RxBool isLoaded = true.obs;
CallRecommendationsModel swingTradeModel = CallRecommendationsModel();
CallRecommendationsModel multibaggerModel = CallRecommendationsModel();
CallRecommendationsModel optionModel = CallRecommendationsModel();
final selectedIndex = 0.obs;
String dateConverterMethod(String dateV) {
DateTime dateTime = DateTime.parse(dateV);
DateTime newDateTime = DateTime(dateTime.year, 3, 25);
return DateFormat("dd MMMM yyyy").format(newDateTime);
}
}

View File

@@ -5,7 +5,6 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:dio/dio.dart';
import 'package:traderscircuit/Utils/utils.dart';
import '../../Utils/base_manager.dart';
import 'base_api_services.dart';
class NetworkApiServices {
Dio dio = Dio();

View File

@@ -29,8 +29,16 @@ class Data {
List<Video>? video;
List<Audio>? audio;
List<Read>? read;
List<NewReleaseAudio>? newReleaseAudio;
List<MostReads>? mostReads;
Data({this.video, this.audio, this.read});
Data({
this.video,
this.audio,
this.read,
this.newReleaseAudio,
this.mostReads,
});
Data.fromJson(Map<String, dynamic> json) {
if (json['video'] != null) {
@@ -51,6 +59,18 @@ class Data {
read!.add(Read.fromJson(v));
});
}
if (json['new_release_audio'] != null) {
newReleaseAudio = <NewReleaseAudio>[];
json['new_release_audio'].forEach((v) {
newReleaseAudio!.add(NewReleaseAudio.fromJson(v));
});
}
if (json['most_reads'] != null) {
mostReads = <MostReads>[];
json['most_reads'].forEach((v) {
mostReads!.add(MostReads.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
@@ -64,6 +84,144 @@ class Data {
if (read != null) {
data['read'] = read!.map((v) => v.toJson()).toList();
}
if (newReleaseAudio != null) {
data['new_release_audio'] =
newReleaseAudio!.map((v) => v.toJson()).toList();
}
if (mostReads != null) {
data['most_reads'] = mostReads!.map((v) => v.toJson()).toList();
}
return data;
}
}
class MostReads {
int? id;
int? contentByteReadXid;
int? clickCount;
int? isActive;
String? createdAt;
ContentByteData? contentByteData;
MostReads(
{this.id,
this.contentByteReadXid,
this.clickCount,
this.isActive,
this.createdAt,
this.contentByteData});
MostReads.fromJson(Map<String, dynamic> json) {
id = json['id'];
contentByteReadXid = json['content_byte_read_xid'];
clickCount = json['click_count'];
isActive = json['is_active'];
createdAt = json['created_at'];
contentByteData = json['content_byte_data'] != null
? ContentByteData.fromJson(json['content_byte_data'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['content_byte_read_xid'] = contentByteReadXid;
data['click_count'] = clickCount;
data['is_active'] = isActive;
data['created_at'] = createdAt;
if (contentByteData != null) {
data['content_byte_data'] = contentByteData!.toJson();
}
return data;
}
}
class ContentByteData {
int? id;
String? title;
String? file;
int? categoryId;
String? image;
String? isActive;
String? createdAt;
ContentByteData(
{this.id,
this.title,
this.file,
this.categoryId,
this.image,
this.isActive,
this.createdAt});
ContentByteData.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
file = json['file'];
categoryId = json['category_id'];
image = json['image'];
isActive = json['is_active'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['title'] = title;
data['file'] = file;
data['category_id'] = categoryId;
data['image'] = image;
data['is_active'] = isActive;
data['created_at'] = createdAt;
return data;
}
}
class NewReleaseAudio {
int? id;
String? title;
String? file;
int? categoryId;
String? image;
String? isActive;
String? createdAt;
String? formattedCreatedAt;
String? fullCreatedAt;
NewReleaseAudio(
{this.id,
this.title,
this.file,
this.categoryId,
this.image,
this.isActive,
this.createdAt,
this.formattedCreatedAt,
this.fullCreatedAt});
NewReleaseAudio.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
file = json['file'];
categoryId = json['category_id'];
image = json['image'];
isActive = json['is_active'];
createdAt = json['created_at'];
formattedCreatedAt = json['formatted_created_at'];
fullCreatedAt = json['full_created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['title'] = title;
data['file'] = file;
data['category_id'] = categoryId;
data['image'] = image;
data['is_active'] = isActive;
data['created_at'] = createdAt;
data['formatted_created_at'] = formattedCreatedAt;
data['full_created_at'] = fullCreatedAt;
return data;
}
}
@@ -77,6 +235,8 @@ class Video {
String? file;
int? categoryId;
String? image;
String? createdAt;
String? link;
String? isActive;
Video({
@@ -86,6 +246,8 @@ class Video {
this.description,
this.tags,
this.file,
this.createdAt,
this.link,
this.categoryId,
this.image,
this.isActive,
@@ -95,7 +257,9 @@ class Video {
id = json['id'];
contentType = json['content_type'];
title = json['title'];
link = json["link"];
description = json['description'];
createdAt = json['created_at'];
tags = json['tags'];
file = json['file'];
categoryId = json['category_id'];
@@ -126,6 +290,7 @@ class Audio {
String? description;
String? tags;
String? file;
String? link;
int? categoryId;
String? image;
String? isActive;
@@ -138,6 +303,7 @@ class Audio {
this.tags,
this.file,
this.categoryId,
this.link,
this.image,
this.isActive,
});
@@ -148,6 +314,7 @@ class Audio {
title = json['title'];
description = json['description'];
tags = json['tags'];
link = json['link'];
file = json['file'];
categoryId = json['category_id'];
image = json['image'];

View File

@@ -0,0 +1,110 @@
class PreviousReadOfUserModel {
String? status;
int? statusCode;
String? message;
List<Data>? data;
PreviousReadOfUserModel(
{this.status, this.statusCode, this.message, this.data});
PreviousReadOfUserModel.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;
int? contentByteReadXid;
int? iamPrincipalXid;
String? readAt;
ContentByteData? contentByteData;
Data(
{this.id,
this.contentByteReadXid,
this.iamPrincipalXid,
this.readAt,
this.contentByteData});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
contentByteReadXid = json['content_byte_read_xid'];
iamPrincipalXid = json['iam_principal_xid'];
readAt = json['read_at'];
contentByteData = json['content_byte_data'] != null
? ContentByteData.fromJson(json['content_byte_data'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['content_byte_read_xid'] = contentByteReadXid;
data['iam_principal_xid'] = iamPrincipalXid;
data['read_at'] = readAt;
if (contentByteData != null) {
data['content_byte_data'] = contentByteData!.toJson();
}
return data;
}
}
class ContentByteData {
int? id;
String? title;
String? file;
int? categoryId;
String? image;
String? isActive;
String? createdAt;
ContentByteData(
{this.id,
this.title,
this.file,
this.categoryId,
this.image,
this.isActive,
this.createdAt});
ContentByteData.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
file = json['file'];
categoryId = json['category_id'];
image = json['image'];
isActive = json['is_active'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['title'] = title;
data['file'] = file;
data['category_id'] = categoryId;
data['image'] = image;
data['is_active'] = isActive;
data['created_at'] = createdAt;
return data;
}
}

View File

@@ -1,5 +1,3 @@
import 'package:get/get.dart';
class FAQModel {
String? status;
int? statusCode;

View File

@@ -68,14 +68,16 @@ class ActiveCalls {
String? stockImage;
String? qty;
String? duration;
int? currentPrice;
int? buyPrice;
int? targetPrice;
int? stopLoss;
String? currentPrice;
String? buyPrice;
String? targetPrice;
String? stopLoss;
int? isSendRecommendationNow;
Null? scheduleDateTime;
String? createdAt;
ProductData? productData;
int? optionTypeXid;
ProductTypeData? productTypeData;
ActionData? optionTypeData;
ActionData? actionData;
ActiveCalls(
@@ -94,7 +96,9 @@ class ActiveCalls {
this.isSendRecommendationNow,
this.scheduleDateTime,
this.createdAt,
this.productData,
this.optionTypeXid,
this.productTypeData,
this.optionTypeData,
this.actionData});
ActiveCalls.fromJson(Map<String, dynamic> json) {
@@ -112,9 +116,13 @@ class ActiveCalls {
stopLoss = json['stop_loss'];
isSendRecommendationNow = json['is_send_recommendation_now'];
scheduleDateTime = json['schedule_date_time'];
optionTypeXid = json['option_type_xid'];
createdAt = json['created_at'];
productData = json['product_data'] != null
? ProductData.fromJson(json['product_data'])
productTypeData = json['product_type_data'] != null
? ProductTypeData.fromJson(json['product_type_data'])
: null;
optionTypeData = json['option_type_data'] != null
? ActionData.fromJson(json['option_type_data'])
: null;
actionData = json['action_data'] != null
? ActionData.fromJson(json['action_data'])
@@ -138,8 +146,11 @@ class ActiveCalls {
data['is_send_recommendation_now'] = isSendRecommendationNow;
data['schedule_date_time'] = scheduleDateTime;
data['created_at'] = createdAt;
if (productData != null) {
data['product_data'] = productData!.toJson();
if (productTypeData != null) {
data['product_type_data'] = productTypeData!.toJson();
}
if (optionTypeData != null) {
data['option_type_data'] = optionTypeData!.toJson();
}
if (actionData != null) {
data['action_data'] = actionData!.toJson();
@@ -148,15 +159,15 @@ class ActiveCalls {
}
}
class ProductData {
class ProductTypeData {
int? id;
String? productName;
int? isActive;
String? isActive;
String? createdAt;
ProductData({this.id, this.productName, this.isActive, this.createdAt});
ProductTypeData({this.id, this.productName, this.isActive, this.createdAt});
ProductData.fromJson(Map<String, dynamic> json) {
ProductTypeData.fromJson(Map<String, dynamic> json) {
id = json['id'];
productName = json['product_name'];
isActive = json['is_active'];

View File

@@ -10,7 +10,11 @@ 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';
@@ -30,10 +34,14 @@ class HomeScreen extends StatefulWidget {
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) {
@@ -103,6 +111,7 @@ class _HomeScreenState extends State<HomeScreen> {
: ListView(
physics: const BouncingScrollPhysics(),
children: [
sizedBoxHeight(20.h),
Obx(
() => Text(
@@ -113,6 +122,7 @@ class _HomeScreenState extends State<HomeScreen> {
fontFamily: 'hiragino',
fontWeight: FontWeight.w500),
),
),
sizedBoxHeight(25.h),
SingleChildScrollView(

View File

@@ -11,6 +11,7 @@ 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/controller/contact_us_controller.dart';
import 'package:traderscircuit/controller/products_controller.dart';
import 'package:traderscircuit/model/ProductsModel/call_recommendations_model.dart';
import 'package:traderscircuit/view/MainScreen/MainScreen.dart';
@@ -28,7 +29,6 @@ class ShortTrade extends StatefulWidget {
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
@@ -129,7 +129,8 @@ class _ShortTradeState extends State<ShortTrade> {
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
selectedIndex.value = index;
productsController.selectedIndex.value =
index;
},
child: Row(
children: [
@@ -155,27 +156,35 @@ class _ShortTradeState extends State<ShortTrade> {
children: [
MyTabBar(),
SizedBox(
height: 700.h,
height: 0.57.sh,
child: TabBarView(
children: [
ActiveCallsTab(
selectedIndex.value == 0
ActiveCallsTab(productsController
.selectedIndex.value ==
0
? productsController
.swingTradeModel
: productsController
.selectedIndex
.value ==
1
? productsController
.swingTradeModel
: selectedIndex.value == 1
? productsController
.multibaggerModel
: productsController
.optionModel),
ExitedCallsTab(
selectedIndex.value == 0
.multibaggerModel
: productsController
.optionModel),
ExitedCallsTab(productsController
.selectedIndex.value ==
0
? productsController
.swingTradeModel
: productsController
.selectedIndex
.value ==
1
? productsController
.swingTradeModel
: selectedIndex.value == 1
? productsController
.multibaggerModel
: productsController
.optionModel),
.multibaggerModel
: productsController
.optionModel),
],
),
),
@@ -245,7 +254,7 @@ class _ShortTradeState extends State<ShortTrade> {
itemBuilder: (ctx, index) {
return Padding(
padding: EdgeInsets.only(top: 20.h, bottom: 5.h),
child: selectedIndex.value == 0
child: productsController.selectedIndex.value == 0
? cardSwingWidget(
image: callRecommendationsModel
.data!.activeCalls![index].stockImage!,
@@ -261,8 +270,12 @@ class _ShortTradeState extends State<ShortTrade> {
action: callRecommendationsModel
.data!.activeCalls![index].actionData!.name!,
)
: selectedIndex.value == 1
: productsController.selectedIndex.value == 1
? cardMultibaggerWidget(
image: callRecommendationsModel
.data!.activeCalls![index].stockImage!,
action: callRecommendationsModel
.data!.activeCalls![index].actionData!.name!,
text: callRecommendationsModel
.data!.activeCalls![index].stockName!,
price:
@@ -270,14 +283,33 @@ class _ShortTradeState extends State<ShortTrade> {
date: callRecommendationsModel
.data!.activeCalls![index].createdAt!,
returns:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
"${callRecommendationsModel.data!.activeCalls![index].targetPrice}",
stoploss:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
duration: callRecommendationsModel
.data!.activeCalls![index].duration!,
pdfname: "Download Pdf",
)
: SizedBox(),
: cardOptionWidget(
image: callRecommendationsModel
.data!.activeCalls![index].stockImage!,
action: callRecommendationsModel
.data!.activeCalls![index].actionData!.name!,
text: callRecommendationsModel
.data!.activeCalls![index].stockName!,
optiontype: callRecommendationsModel.data!
.activeCalls![index].optionTypeData!.name!,
price:
"${callRecommendationsModel.data!.activeCalls![index].buyPrice}",
date: callRecommendationsModel
.data!.activeCalls![index].createdAt!,
premium:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
price1:
"${callRecommendationsModel.data!.activeCalls![index].targetPrice}",
stoploss:
"${callRecommendationsModel.data!.activeCalls![index].stopLoss}",
),
);
});
}
@@ -319,175 +351,77 @@ class _ShortTradeState extends State<ShortTrade> {
}
Widget ExitedCallsTab(CallRecommendationsModel callRecommendationsModel) {
List<Map<String, String>> cardSwing = [
{
'text': 'Indiabulls Housing Finance Ltd',
'amount': '₹ 196.50 - ₹ 197',
'targetamount': '₹ 204',
'stoploss': '₹ 190',
'time': '4-5 Days',
},
{
'text': 'Indiabulls Housing Finance Ltd',
'amount': '₹ 196.50 - ₹ 197',
'targetamount': '₹ 204',
'stoploss': '₹ 190',
'time': '4-5 Days',
},
{
'text': 'Indiabulls Housing Finance Ltd',
'amount': '₹ 196.50 - ₹ 197',
'targetamount': '₹ 204',
'stoploss': '₹ 190',
'time': '4-5 Days',
},
];
List<Map<String, String>> cardMultibagger = [
{
'text': 'TATA MOTORS',
'price': '₹ 453 - ₹234',
'date': '25 March 2024',
'returns': '103%',
'stoploss': '₹ 198',
'duration': '271 Days',
'pdfname': 'Download Pdf'
},
{
'text': 'TATA MOTORS',
'price': '₹ 453 - ₹234',
'date': '25 March 2024',
'returns': '103%',
'stoploss': '₹ 198',
'duration': '271 Days',
'pdfname': 'Download Pdf'
},
{
'text': 'TATA MOTORS',
'price': '₹ 453 - ₹234',
'date': '25 March 2024',
'returns': '103%',
'stoploss': '₹ 198',
'duration': '271 Days',
'pdfname': 'Download Pdf'
},
];
List<Map<String, String>> cardOptionsbagger = [
{
'text': 'NIFTY/ BANK NIFTY',
'optiontype': 'Call',
'price': '₹ 46500',
'date': '6th Mar',
'premium': 'Buy above₹ 690',
'price1': '₹ 740',
'price2': '₹ 780',
'stoploss': '₹ 645',
},
{
'text': 'NIFTY/ BANK NIFTY',
'optiontype': 'Call',
'price': '₹ 46500',
'date': '6th Mar',
'premium': 'Buy above₹ 690',
'price1': '₹ 740',
'price2': '₹ 780',
'stoploss': '₹ 645',
},
{
'text': 'NIFTY/ BANK NIFTY',
'optiontype': 'Call',
'price': '₹ 46500',
'date': '6th Mar',
'premium': 'Buy above₹ 690',
'price1': '₹ 740',
'price2': '₹ 780',
'stoploss': '₹ 645',
},
];
return SingleChildScrollView(
child: Column(
children: [
sizedBoxHeight(20.h),
Obx(() {
return selectedIndex.value == 0
? callRecommendationsModel.data!.exitedCalls!.isEmpty
? Center(
child: Column(
children: [
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:
List.generate(cardMultibagger.length, (index) {
return Column(
children: [
cardMultibaggerWidget(
text: cardMultibagger[index]['text']!,
price: cardMultibagger[index]['price']!,
date: cardMultibagger[index]['date']!,
returns: cardMultibagger[index]['returns']!,
stoploss: cardMultibagger[index]['stoploss']!,
duration: cardMultibagger[index]['duration']!,
pdfname: cardMultibagger[index]['pdfname']!),
sizedBoxHeight(20.h)
],
);
}),
return callRecommendationsModel.data!.exitedCalls!.isEmpty
? Center(
child: Column(
children: [
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: productsController.selectedIndex.value == 0
? 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!,
)
: Column(
children:
List.generate(cardMultibagger.length, (index) {
return Column(
children: [
cardOptionWidget(
text: cardOptionsbagger[index]['text']!,
optiontype: cardOptionsbagger[index]
['optiontype']!,
price: cardOptionsbagger[index]['price']!,
date: cardOptionsbagger[index]['date']!,
premium: cardOptionsbagger[index]['premium']!,
price1: cardOptionsbagger[index]['price1']!,
price2: cardOptionsbagger[index]['price2']!,
stoploss: cardOptionsbagger[index]
['stoploss']!),
sizedBoxHeight(20.h)
],
);
}),
);
}),
sizedBoxHeight(200.h)
],
),
);
: productsController.selectedIndex.value == 1
? cardMultibaggerWidget(
image: callRecommendationsModel
.data!.exitedCalls![index].stockImage!,
action: callRecommendationsModel
.data!.exitedCalls![index].actionData!.name!,
text: callRecommendationsModel
.data!.exitedCalls![index].stockName!,
price:
"${callRecommendationsModel.data!.exitedCalls![index].buyPrice}",
date: callRecommendationsModel
.data!.exitedCalls![index].createdAt!,
returns:
"${callRecommendationsModel.data!.exitedCalls![index].targetPrice}",
stoploss:
"${callRecommendationsModel.data!.exitedCalls![index].stopLoss}",
duration: callRecommendationsModel
.data!.exitedCalls![index].duration!,
pdfname: "Download Pdf",
)
: cardOptionWidget(
image: callRecommendationsModel
.data!.exitedCalls![index].stockImage!,
action: callRecommendationsModel
.data!.exitedCalls![index].actionData!.name!,
text: callRecommendationsModel
.data!.exitedCalls![index].stockName!,
optiontype: callRecommendationsModel.data!
.exitedCalls![index].optionTypeData!.name!,
price:
"${callRecommendationsModel.data!.exitedCalls![index].buyPrice}",
date: callRecommendationsModel
.data!.exitedCalls![index].createdAt!,
premium:
"${callRecommendationsModel.data!.exitedCalls![index].stopLoss}",
price1:
"${callRecommendationsModel.data!.exitedCalls![index].targetPrice}",
stoploss:
"${callRecommendationsModel.data!.exitedCalls![index].stopLoss}",
),
);
});
}
Widget cardOptionWidget({
@@ -497,9 +431,11 @@ class _ShortTradeState extends State<ShortTrade> {
required String date,
required String premium,
required String price1,
required String price2,
required String stoploss,
required String action,
required String image,
}) {
ContactUsController contactUsController = Get.put(ContactUsController());
return commonGlassContainer(
width: double.infinity,
height: 400.h,
@@ -534,8 +470,8 @@ class _ShortTradeState extends State<ShortTrade> {
],
),
child: Center(
child: Image.asset(
'assets/images/png/Group 1000004495.png',
child: CachedNetworkImage(
imageUrl: image,
width: 26.w,
height: 23.h,
),
@@ -549,9 +485,11 @@ class _ShortTradeState extends State<ShortTrade> {
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: const Color(0xFFFFAD31),
color: action == "Buy"
? const Color(0xFF00FF19)
: const Color(0xFFFFAD31),
),
child: Center(child: text14W600_1B1B1B('Hold')),
child: Center(child: text14W600_1B1B1B(action)),
)
],
),
@@ -596,7 +534,10 @@ class _ShortTradeState extends State<ShortTrade> {
children: [
text14W400_979797('Expiry Date'),
sizedBoxHeight(5.h),
SizedBox(width: 150.w, child: text15W600(date))
SizedBox(
width: 150.w,
child: text15W600(contactUsController
.formatedDateTimeMethod(date)))
],
),
sizedBoxWidth(30.w),
@@ -616,7 +557,7 @@ class _ShortTradeState extends State<ShortTrade> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text14W400_979797('Target Price 01'),
text14W400_979797('Target Price'),
sizedBoxHeight(5.h),
SizedBox(width: 150.w, child: text15W600(price1))
],
@@ -625,22 +566,13 @@ class _ShortTradeState extends State<ShortTrade> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text14W400_979797('Target Price 01'),
text14W400_979797('Stop Loss'),
sizedBoxHeight(5.h),
text15W600(price2)
text15W600(stoploss)
],
)
],
),
sizedBoxHeight(15.h),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text14W400_979797('Stop Loss'),
sizedBoxHeight(5.h),
text15W600(stoploss)
],
)
],
),
)
@@ -657,6 +589,8 @@ class _ShortTradeState extends State<ShortTrade> {
required String stoploss,
required String duration,
required String pdfname,
required String action,
required String image,
}) {
return commonGlassContainer(
width: double.infinity,
@@ -692,8 +626,8 @@ class _ShortTradeState extends State<ShortTrade> {
],
),
child: Center(
child: Image.asset(
'assets/images/png/TATAMOTORS.NS_BIG 1.png',
child: CachedNetworkImage(
imageUrl: image,
width: 26.w,
height: 23.h,
),
@@ -707,9 +641,11 @@ class _ShortTradeState extends State<ShortTrade> {
height: 25.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r),
color: const Color(0xFFFFAD31),
color: action == "Buy"
? const Color(0xFF00FF19)
: const Color(0xFFFFAD31),
),
child: Center(child: text14W600_1B1B1B('Hold')),
child: Center(child: text14W600_1B1B1B(action)),
)
],
),
@@ -742,7 +678,7 @@ class _ShortTradeState extends State<ShortTrade> {
width: 130.w,
child: text14W400_979797('Date of recommendation')),
sizedBoxHeight(5.h),
text15W600(date)
text15W600(productsController.dateConverterMethod(date))
],
)
],
@@ -753,10 +689,9 @@ class _ShortTradeState extends State<ShortTrade> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text14W400_979797('% Return'),
text14W400_979797('Target Price'),
sizedBoxHeight(5.h),
SizedBox(
width: 150.w, child: text15W600_00FF19(returns))
SizedBox(width: 150.w, child: text15W600(returns))
],
),
sizedBoxWidth(30.w),
@@ -782,23 +717,23 @@ class _ShortTradeState extends State<ShortTrade> {
],
),
sizedBoxWidth(30.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text14W400_979797('Report'),
sizedBoxHeight(5.h),
Row(
children: [
Image.asset(
'assets/images/png/pdf.png',
height: 20.h,
width: 20.w,
),
text15W600(pdfname),
],
)
],
)
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// text14W400_979797('Report'),
// sizedBoxHeight(5.h),
// Row(
// children: [
// Image.asset(
// 'assets/images/png/pdf.png',
// height: 20.h,
// width: 20.w,
// ),
// text15W600(pdfname),
// ],
// )
// ],
// )
],
),
],
@@ -934,7 +869,7 @@ class _ShortTradeState extends State<ShortTrade> {
Widget topContainer(String text, int index) {
return Obx(() {
return selectedIndex.value == index
return productsController.selectedIndex.value == index
? Container(
height: 40.h,
width: 126.w,

View File

@@ -1,21 +1,21 @@
import 'dart:developer';
import 'package:audio_video_progress_bar/audio_video_progress_bar.dart';
import 'package:flutter/material.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:traderscircuit/Utils/Common/CommonAppbar.dart';
import 'package:traderscircuit/Utils/Common/CustomTextFormField.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/controller/content_bytes_controller.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_model.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view/Sidemenu/ContentByte/PlayerWidget.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
import 'package:traderscircuit/view_model/ContentBytesApi/content_bytes_api.dart';
import '../../../Utils/Common/comonGlassmorphicContainer.dart';
import 'ContentBytes.dart';
class AudioMore extends StatefulWidget {
const AudioMore({super.key});
@@ -29,7 +29,7 @@ class _VideosMoreState extends State<AudioMore> {
var data;
RxBool isLoading = false.obs;
TextEditingController searchControllera = TextEditingController();
TextEditingController searchController = TextEditingController();
@override
void initState() {
@@ -55,146 +55,286 @@ class _VideosMoreState extends State<AudioMore> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CommonAppbar(
titleTxt: "Audio",
),
backgroundColor: Colors.black,
extendBody: true,
body: Obx(
() => Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
isLoading.value
? const Center(
child: CircularProgressIndicator(
color: Color(0xFF9A0000),
),
)
: Stack(
return PopScope(
canPop: true,
onPopInvoked: (didPop) {
if (contentBytesController.isAudioInitialize) {
contentBytesController.isAudioSeekBarVisible.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
},
child: Scaffold(
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: Obx(
() => contentBytesController.isAudioSeekBarVisible.value
? commonGlassContainer(
borderradius: 8,
width: Get.size.width,
height: 100,
customWidget: Row(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text16W400_DADADA('The Beauty and Power of Audios'),
sizedBoxHeight(8.w),
Row(
children: [
SizedBox(
width: 295.w,
child: TextField(
controller: searchControllera,
onChanged: (value) {
// Call method to handle search
handleSearch(value, "");
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
hintText: 'Search videos',
border: OutlineInputBorder(),
),
),
),
SizedBox(
width: 12.w,
),
filter(),
],
),
sizedBoxHeight(20.h),
GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
mainAxisExtent: 172,
crossAxisCount:
2, // number of items in each row
mainAxisSpacing: 8.0, // spacing between rows
crossAxisSpacing:
8.0, // spacing between columns
),
itemCount: contentBytesController
Expanded(
flex: 1,
child: Align(
child: ClipRRect(
borderRadius: BorderRadius.circular(100),
child: Image.network(
contentBytesController
.contentBytesModel
.data!
.audio!
.length, // total number of items
itemBuilder: (context, index) {
return InkWell(
onTap: () {
contentBytesController.init(0);
contentBytesController
.isAudioSeekBarVisible.value = true;
//https://actions.google.com/sounds/v1/horror/aggressive_zombie_snarls.ogg
},
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF)
.withOpacity(0.05),
],
stops: [
0.1,
1,
],
),
borderRadius: BorderRadius.circular(8),
),
child: Stack(
children: [
Image.network(
contentBytesController
.contentBytesModel
.data!
.audio![index]
.image!,
),
Positioned(
bottom: 5,
left: 5,
child: Row(
children: [
CircleAvatar(
radius: 18.sp,
child: const Icon(
Icons.headphones),
),
SizedBox(
width: 5.w,
),
SizedBox(
width: 125.w,
child: text14W500(
contentBytesController
.contentBytesModel
.data!
.audio![index]
.title!),
),
],
),
),
],
),
.audio![contentBytesController
.indexForAudios.value]
.image!,
width: 57,
height: 57,
fit: BoxFit.cover,
),
),
),
),
Expanded(
flex: 3,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
contentBytesController
.contentBytesModel
.data!
.audio![contentBytesController
.indexForAudios.value]
.title!,
style: const TextStyle(
fontSize: 14,
color: Colors.white,
fontFamily: 'hiragino',
fontWeight: FontWeight.w600,
height: 1.5,
),
),
// SizedBox(height: 5),
Text(
contentBytesController
.contentBytesModel
.data!
.audio![contentBytesController
.indexForAudios.value]
.description!,
style: const TextStyle(
fontSize: 14,
color: Colors.white,
fontFamily: 'hiragino',
fontWeight: FontWeight.w600,
height: 1.5,
),
),
ValueListenableBuilder<ProgressBarState>(
valueListenable:
contentBytesController.progressNotifier,
builder: (context, value, _) {
return ProgressBar(
progress: value.current,
buffered: value.buffered,
total: value.total,
onSeek: contentBytesController.seek,
barHeight: 4,
thumbRadius: 6,
thumbGlowRadius: 15,
timeLabelTextStyle: const TextStyle(
color: Colors.white,
),
thumbColor: Colors.white,
baseBarColor: Colors.white.withOpacity(0.3),
progressBarColor: Colors.white,
bufferedBarColor:
Colors.white.withOpacity(0.3),
);
},
),
],
),
),
Expanded(
flex: 1,
child: ValueListenableBuilder<ButtonState>(
valueListenable:
contentBytesController.buttonNotifier,
builder: (context, value, _) {
switch (value) {
case ButtonState.paused:
return IconButton(
icon: const Icon(
Icons.play_arrow_rounded,
color: Colors.white,
),
iconSize: 50.0,
onPressed: () => contentBytesController.play(
contentBytesController
.indexForAudios.value),
);
case ButtonState.playing:
return IconButton(
icon: const Icon(Icons.pause,
color: Colors.white),
iconSize: 50.0,
onPressed: contentBytesController.pause,
);
}
},
),
),
],
),
],
)
: Container(),
),
appBar: const CommonAppbar(
titleTxt: "Audio",
),
backgroundColor: Colors.black,
extendBody: true,
body: Obx(
() => Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
isLoading.value
? const Center(
child: CircularProgressIndicator(
color: Color(0xFF9A0000),
),
)
: Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text16W400_DADADA(
'The Beauty and Power of Audios'),
sizedBoxHeight(8.w),
Row(
children: [
SizedBox(
width: 295.w,
child: CustomTextFormField(
textEditingController: searchController,
onInput: (value) {
// Call method to handle search
handleSearch(value, "");
},
hintText: "Search Audio",
),
),
SizedBox(
width: 12.w,
),
filter(),
],
),
sizedBoxHeight(20.h),
GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
mainAxisExtent: 172,
crossAxisCount:
2, // number of items in each row
mainAxisSpacing: 8.0, // spacing between rows
crossAxisSpacing:
8.0, // spacing between columns
),
itemCount: contentBytesController
.contentBytesModel
.data!
.audio!
.length, // total number of items
itemBuilder: (context, index) {
return InkWell(
onTap: () {
if (contentBytesController
.isAudioInitialize) {
contentBytesController
.isAudioSeekBarVisible
.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
contentBytesController.init(index);
contentBytesController
.isAudioSeekBarVisible.value = true;
//https://actions.google.com/sounds/v1/horror/aggressive_zombie_snarls.ogg
},
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF)
.withOpacity(0.05),
],
stops: const [
0.1,
1,
],
),
borderRadius: BorderRadius.circular(8),
),
child: Stack(
children: [
Image.network(
contentBytesController
.contentBytesModel
.data!
.audio![index]
.image!,
),
Positioned(
bottom: 5,
left: 5,
child: Row(
children: [
CircleAvatar(
radius: 18.sp,
child: const Icon(
Icons.headphones),
),
SizedBox(
width: 5.w,
),
SizedBox(
width: 125.w,
child: text14W500(
contentBytesController
.contentBytesModel
.data!
.audio![index]
.title!),
),
],
),
),
],
),
),
);
},
),
],
),
),
],
),
],
),
),
),
);
@@ -237,7 +377,7 @@ class _VideosMoreState extends State<AudioMore> {
.data![index]
.id!;
log(contentBytesController.filterId.toString());
handleSearch(searchControllera.text,
handleSearch(searchController.text,
contentBytesController.filterId.toString());
},
child: itemFilter(index));

View File

@@ -6,13 +6,14 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:get/get.dart';
import 'package:traderscircuit/Utils/Common/CommonAppbar.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/controller/contact_us_controller.dart';
import 'package:traderscircuit/controller/content_bytes_controller.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_categories_model.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_model.dart';
import 'package:traderscircuit/model/ContentBytesModel/previous_read_user_model.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view/Sidemenu/ContentByte/PlayerWidget.dart';
import 'package:traderscircuit/view/Sidemenu/ContentByte/read_pdf.dart';
@@ -67,23 +68,36 @@ class _ContentBytesState extends State<ContentBytes> {
ContentBytesApi().getContentBytesData("", "", "").then((value) {
contentBytesController.contentBytesModel =
ContentBytesModel.fromJson(value.data);
contentBytesController.isApiCalling.value = false;
setState(() {});
ContentBytesApi().getPreviousReadData().then((value) {
contentBytesController.previousReadOfUserModel =
PreviousReadOfUserModel.fromJson(value.data);
contentBytesController.isApiCalling.value = false;
setState(() {});
});
});
super.initState();
}
@override
void dispose() {
contentBytesController.stop();
if (contentBytesController.isAudioInitialize) {
contentBytesController.isAudioSeekBarVisible.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
return true;
return PopScope(
canPop: true,
onPopInvoked: (didPop) {
if (contentBytesController.isAudioInitialize) {
contentBytesController.isAudioSeekBarVisible.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
},
child: Scaffold(
key: _scaffoldKey1,
@@ -164,7 +178,7 @@ class _ContentBytesState extends State<ContentBytes> {
barHeight: 4,
thumbRadius: 6,
thumbGlowRadius: 15,
timeLabelTextStyle: TextStyle(
timeLabelTextStyle: const TextStyle(
color: Colors.white,
),
thumbColor: Colors.white,
@@ -214,7 +228,67 @@ class _ContentBytesState extends State<ContentBytes> {
),
backgroundColor: Colors.black,
extendBody: true,
appBar: const CommonAppbar(titleTxt: "Content Bytes"),
appBar: PreferredSize(
preferredSize: const Size.fromHeight(130),
child: 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: () {
if (contentBytesController.isAudioInitialize) {
contentBytesController.isAudioSeekBarVisible.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
Get.back();
},
child: Padding(
padding: EdgeInsets.only(left: 8.w),
child: Icon(
Icons.arrow_back_ios,
color: Colors.white,
size: 25.r,
),
),
),
),
flexibleSpace: FlexibleSpaceBar(
centerTitle: false,
titlePadding: const EdgeInsets.all(0),
title: Padding(
padding: EdgeInsets.only(left: 16.w, right: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Content Bytes",
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,
fontWeight: FontWeight.w500,
fontFamily: 'hiragino'),
maxLines: 2,
softWrap: true,
),
],
),
// newTextfield(
// FontWeight.w400, 0)
],
),
),
),
),
),
body: Stack(
children: [
const CommonBlurLeft(),
@@ -243,7 +317,7 @@ class _ContentBytesState extends State<ContentBytes> {
child: TabBarView(
children: [
Videos(images: reels),
Audios(),
const Audios(),
Reads(mostread: mostread),
],
),
@@ -297,10 +371,10 @@ class _ReadsState extends State<Reads> {
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'),
@@ -316,18 +390,23 @@ class _ReadsState extends State<Reads> {
itemCount:
contentBytesController.contentBytesModel.data!.read!.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (ctx, index) {
return Column(
children: [
InkWell(
onTap: () {
Get.to(ReadPDF(
title: contentBytesController
.contentBytesModel.data!.read![index].title,
pdfUrfl: contentBytesController
.contentBytesModel.data!.read![index].file,
));
ContentBytesApi()
.updateReadCounts(contentBytesController
.contentBytesModel.data!.read![index].id!)
.then((value) {
Get.to(ReadPDF(
title: contentBytesController
.contentBytesModel.data!.read![index].title,
pdfUrfl: contentBytesController
.contentBytesModel.data!.read![index].file,
));
});
},
child: commonGlassContainer(
borderradius: 8,
@@ -352,22 +431,17 @@ class _ReadsState extends State<Reads> {
sizedBoxHeight(10.h),
SizedBox(
width: 230.w,
height: 50,
child: text16W400(
'"${contentBytesController.contentBytesModel.data!.read![index].description}"'),
),
const Spacer()
],
),
Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Image.network(
"${contentBytesController.contentBytesModel.data!.read![index].image}",
height: 110,
),
],
)
Image.network(
"${contentBytesController.contentBytesModel.data!.read![index].image}",
height: 110,
),
],
),
),
@@ -376,117 +450,173 @@ class _ReadsState extends State<Reads> {
],
);
}),
// sizedBoxHeight(30.h),
// text22W500("Most Read"),
// sizedBoxHeight(25.h),
// Container(
// height: 220.h,
// child: ListView.separated(
// separatorBuilder: (context, index) {
// return SizedBox(
// width: 10.w,
// );
// },
// scrollDirection: Axis.horizontal,
// itemCount: 3,
// itemBuilder: (context, index) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Container(
// height: 216.h,
// width: 150.w,
// decoration: BoxDecoration(
// gradient: LinearGradient(
// begin: Alignment.topLeft,
// end: Alignment.bottomRight,
// colors: [
// Colors.white.withOpacity(0.1),
// const Color(0xFFFFFFFF).withOpacity(0.05),
// ],
// stops: [
// 0.1,
// 1,
// ],
// ),
// borderRadius: BorderRadius.circular(8),
// ),
// child: Image.asset(mostread[index]),
// ),
// ],
// );
// },
// ),
// ),
// sizedBoxHeight(30.h),
// text22W500("Previous Read"),
// sizedBoxHeight(20.h),
// Container(
// height: 90.h,
// child: ListView.separated(
// separatorBuilder: (context, index) {
// return SizedBox(
// width: 10.w,
// );
// },
// scrollDirection: Axis.horizontal,
// itemCount: 2,
// itemBuilder: (context, index) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Container(
// height: 85.h,
// width: 230.w,
// decoration: BoxDecoration(
// gradient: LinearGradient(
// begin: Alignment.topLeft,
// end: Alignment.bottomRight,
// colors: [
// Colors.white.withOpacity(0.1),
// const Color(0xFFFFFFFF).withOpacity(0.05),
// ],
// stops: [
// 0.1,
// 1,
// ],
// ),
// borderRadius: BorderRadius.circular(8),
// ),
// child: Row(
// // mainAxisAlignment:
// // MainAxisAlignment.start,
// children: [
// const SizedBox(
// width: 10,
// ),
// Image.asset(mostread[index]),
// SizedBox(
// width: 15.w,
// ),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
// children: [
// SizedBox(
// width: 135.w,
// child: text12W500("Stock Market Essentials"),
// ),
// SizedBox(
// width: 130.w,
// child: text10W300(
// "A Comprehensive Guide to Understanding the Market"),
// )
// ],
// )
// ],
// ),
// ),
// ],
// );
// },
// ),
// ),
contentBytesController.contentBytesModel.data!.mostReads!.isEmpty
? const SizedBox()
: sizedBoxHeight(30.h),
contentBytesController.contentBytesModel.data!.mostReads!.isEmpty
? const SizedBox()
: text22W500("Most Read"),
contentBytesController.contentBytesModel.data!.mostReads!.isEmpty
? const SizedBox()
: sizedBoxHeight(25.h),
contentBytesController.contentBytesModel.data!.mostReads!.isEmpty
? const SizedBox()
: SizedBox(
height: 220.h,
child: ListView.separated(
separatorBuilder: (context, index) {
return SizedBox(
width: 10.w,
);
},
scrollDirection: Axis.horizontal,
itemCount: contentBytesController
.contentBytesModel.data!.mostReads!.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () {
ContentBytesApi()
.updateReadCounts(contentBytesController
.contentBytesModel
.data!
.mostReads![index]
.id!)
.then((value) {
Get.to(ReadPDF(
title: contentBytesController
.contentBytesModel
.data!
.mostReads![index]
.contentByteData!
.title,
pdfUrfl: contentBytesController
.contentBytesModel
.data!
.mostReads![index]
.contentByteData!
.file,
));
});
},
child: Container(
height: 216.h,
width: 150.w,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
],
),
borderRadius: BorderRadius.circular(8),
),
child: Image.network(
contentBytesController.contentBytesModel.data!
.mostReads![index].contentByteData!.image!,
fit: BoxFit.cover,
),
),
);
},
),
),
contentBytesController.previousReadOfUserModel.data!.isEmpty
? const SizedBox()
: sizedBoxHeight(30.h),
contentBytesController.previousReadOfUserModel.data!.isEmpty
? const SizedBox()
: text22W500("Previous Read"),
contentBytesController.previousReadOfUserModel.data!.isEmpty
? const SizedBox()
: sizedBoxHeight(20.h),
contentBytesController.previousReadOfUserModel.data!.isEmpty
? const SizedBox()
: SizedBox(
height: 100.h,
child: ListView.separated(
separatorBuilder: (context, index) {
return SizedBox(
width: 10.w,
);
},
scrollDirection: Axis.horizontal,
itemCount: contentBytesController
.previousReadOfUserModel.data!.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 100.h,
width: 261.w,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
],
),
borderRadius: BorderRadius.circular(8),
),
child: Row(
// mainAxisAlignment:
// MainAxisAlignment.start,
children: [
const SizedBox(
width: 10,
),
Image.network(contentBytesController
.previousReadOfUserModel
.data![index]
.contentByteData!
.image!),
SizedBox(
width: 15.w,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
SizedBox(
width: 135.w,
child: text12W500(contentBytesController
.previousReadOfUserModel
.data![index]
.contentByteData!
.title!),
),
SizedBox(
width: 130.w,
child: text10W300(
" contentBytesControlle",
),
)
],
)
],
),
),
],
);
},
),
),
SizedBox(
height: 50,
)
],
),
);
@@ -545,10 +675,10 @@ class _AudiosState extends State<Audios> {
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'),
@@ -575,9 +705,14 @@ class _AudiosState extends State<Audios> {
itemBuilder: (context, index) {
return InkWell(
onTap: () {
contentBytesController.init(0);
if (contentBytesController.isAudioInitialize) {
contentBytesController.isAudioSeekBarVisible.value = false;
contentBytesController.pause();
contentBytesController.stop();
}
contentBytesController.init(index);
contentBytesController.isAudioSeekBarVisible.value = true;
//https://actions.google.com/sounds/v1/horror/aggressive_zombie_snarls.ogg
contentBytesController.indexForAudios.value = index;
},
child: Container(
decoration: BoxDecoration(
@@ -630,86 +765,85 @@ class _AudiosState extends State<Audios> {
);
},
),
// SizedBox(
// height: 20.h,
// ),
// text22W600("New Release"),
// SizedBox(
// height: 25.h,
// ),
// Container(
// height: 250.h,
// child: ListView.separated(
// separatorBuilder: (context, index) {
// return const SizedBox(
// width: 10,
// );
// },
// scrollDirection: Axis.horizontal,
// itemCount:
// contentBytesController.contentBytesModel.data!.audio!.length,
// itemBuilder: (context, index) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Container(
// height: 183.h,
// width: 148.w,
// decoration: BoxDecoration(
// gradient: LinearGradient(
// begin: Alignment.topLeft,
// end: Alignment.bottomRight,
// colors: [
// Colors.white.withOpacity(0.1),
// const Color(0xFFFFFFFF).withOpacity(0.05),
// ],
// stops: [
// 0.1,
// 1,
// ],
// ),
// borderRadius: BorderRadius.circular(8),
// ),
// child: Stack(
// children: [
// Image.network(
// contentBytesController
// .contentBytesModel.data!.audio![index].image!,
// ),
// const Positioned(
// right: 5,
// top: 5,
// child: CircleAvatar(
// radius: 15,
// child: Icon(
// Icons.headphones,
// size: 20,
// ),
// ),
// ),
// ],
// ),
// ),
// const SizedBox(
// height: 10,
// ),
// Row(
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// SizedBox(
// width: 148.w,
// child: text14W500Overflow(
// contentBytesController
// .contentBytesModel.data!.audio![index].title!,
// ),
// ),
// ],
// )
// ],
// );
// },
// ),
// )
SizedBox(
height: 20.h,
),
text22W600("New Release"),
SizedBox(
height: 25.h,
),
SizedBox(
height: 250.h,
child: ListView.separated(
separatorBuilder: (context, index) {
return const SizedBox(
width: 10,
);
},
scrollDirection: Axis.horizontal,
itemCount: contentBytesController
.contentBytesModel.data!.newReleaseAudio!.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 148.w,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
],
),
borderRadius: BorderRadius.circular(8),
),
child: Stack(
children: [
Image.network(
contentBytesController.contentBytesModel.data!
.newReleaseAudio![index].image!,
),
const Positioned(
right: 5,
top: 5,
child: CircleAvatar(
radius: 15,
child: Icon(
Icons.headphones,
size: 20,
),
),
),
],
),
),
const SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: 148.w,
child: text14W500Overflow(
contentBytesController.contentBytesModel.data!
.newReleaseAudio![index].title!,
),
),
],
)
],
);
},
),
)
],
),
);
@@ -835,16 +969,17 @@ class _VideosState extends State<Videos> {
}
Widget videoCard(Video video) {
ContactUsController contactUsController = Get.put(ContactUsController());
return InkWell(
onTap: () {
Get.to(() => const PlayerWidget(), arguments: {
"video_url": video.file,
"video_url": video.link,
});
},
child: commonGlassContainer(
borderradius: 8,
width: double.infinity,
height: 320.h,
height: 340.h,
customWidget: Padding(
padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
child: Column(
@@ -879,10 +1014,13 @@ class _VideosState extends State<Videos> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text18W500(video.title!),
text16W400(video.description!),
// sizedBoxHeight(10.h),
//text12W400_979797('20k views . 2 days ago'),
text12W400_979797('2 days ago'),
SizedBox(
width: 0.81.sw,
height: 50,
child: text16W400(video.description!,
textOver: TextOverflow.ellipsis)),
text12W400_979797(contactUsController
.timeAgoConverter(video.createdAt!)),
],
)
],
@@ -929,10 +1067,10 @@ class _VideosState extends State<Videos> {
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'),
@@ -1052,8 +1190,24 @@ class _VideosState extends State<Videos> {
}
}
class ContentTabBar extends StatelessWidget {
class ContentTabBar extends StatefulWidget {
@override
State<ContentTabBar> createState() => _ContentTabBarState();
}
class _ContentTabBarState extends State<ContentTabBar>
with SingleTickerProviderStateMixin {
// Set the desired height
TabController? tabController;
@override
void initState() {
tabController = TabController(length: 3, vsync: this);
tabController!.addListener(() {
print("${tabController!.index}");
});
super.initState();
}
@override
Widget build(BuildContext context) {

View File

@@ -30,7 +30,7 @@ class _VideosMoreState extends State<ReadMore> {
Get.put(ContentBytesController());
var data;
RxBool isLoading = false.obs;
TextEditingController searchControllerr = TextEditingController();
TextEditingController searchController = TextEditingController();
@override
void initState() {
@@ -87,17 +87,13 @@ class _VideosMoreState extends State<ReadMore> {
children: [
SizedBox(
width: 295.w,
child: TextField(
controller: searchControllerr,
onChanged: (value) {
child: CustomTextFormField(
textEditingController: searchController,
onInput: (value) {
// Call method to handle search
handleSearch(value, "");
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
hintText: 'Search videos',
border: OutlineInputBorder(),
),
hintText: "Search Books",
),
),
SizedBox(
@@ -111,81 +107,93 @@ class _VideosMoreState extends State<ReadMore> {
// ),
sizedBoxHeight(20.h),
ListView.builder(
itemCount: contentBytesController
.contentBytesModel.data!.read!.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (ctx, index) {
return Column(
contentBytesController
.contentBytesModel.data!.read!.isEmpty
? Center(
child: Column(
children: [
InkWell(
onTap: () {
Get.to(ReadPDF(
title: contentBytesController
.contentBytesModel
.data!
.read![index]
.title,
pdfUrfl: contentBytesController
.contentBytesModel
.data!
.read![index]
.file,
));
},
child: commonGlassContainer(
borderradius: 8,
width: double.infinity,
height: 150.h,
customWidget: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
const SizedBox(
width: 10,
),
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
const Spacer(),
SizedBox(
width: 235.w,
child: text20W400(
'"${contentBytesController.contentBytesModel.data!.read![index].title}"'),
),
sizedBoxHeight(10.h),
SizedBox(
width: 230.w,
child: text16W400(
'"${contentBytesController.contentBytesModel.data!.read![index].description}"'),
),
const Spacer()
],
),
Column(
Gap(250),
text24W500("No Data Found !"),
],
))
: ListView.builder(
itemCount: contentBytesController
.contentBytesModel.data!.read!.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (ctx, index) {
return Column(
children: [
InkWell(
onTap: () {
Get.to(ReadPDF(
title: contentBytesController
.contentBytesModel
.data!
.read![index]
.title,
pdfUrfl: contentBytesController
.contentBytesModel
.data!
.read![index]
.file,
));
},
child: commonGlassContainer(
borderradius: 8,
width: double.infinity,
height: 150.h,
customWidget: Row(
mainAxisAlignment:
MainAxisAlignment.end,
MainAxisAlignment
.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
const SizedBox(
width: 10,
),
Column(
crossAxisAlignment:
CrossAxisAlignment
.start,
children: [
const Spacer(),
SizedBox(
width: 235.w,
child: text20W400(
contentBytesController
.contentBytesModel
.data!
.read![index]
.title!),
),
sizedBoxHeight(10.h),
SizedBox(
width: 230.w,
height: 50,
child: text16W400(
contentBytesController
.contentBytesModel
.data!
.read![index]
.description!),
),
const Spacer()
],
),
Image.network(
"${contentBytesController.contentBytesModel.data!.read![index].image}",
height: 110,
),
],
)
],
),
),
),
),
),
sizedBoxHeight(20.h),
],
);
}),
sizedBoxHeight(20.h),
],
);
}),
],
),
),
@@ -235,7 +243,7 @@ class _VideosMoreState extends State<ReadMore> {
.id!;
log(contentBytesController.filterId.toString());
handleSearch(searchControllerr.text,
handleSearch(searchController.text,
contentBytesController.filterId.toString());
},
child: itemFilter(index));

View File

@@ -5,9 +5,11 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:get/get.dart';
import 'package:traderscircuit/Utils/Common/CommonAppBar.dart';
import 'package:traderscircuit/Utils/Common/CustomTextFormField.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/controller/contact_us_controller.dart';
import 'package:traderscircuit/controller/content_bytes_controller.dart';
import 'package:traderscircuit/model/ContentBytesModel/content_bytes_model.dart';
import 'package:traderscircuit/view/Sidemenu/ContentByte/PlayerWidget.dart';
@@ -81,17 +83,13 @@ class _VideosMoreState extends State<VideosMore> {
children: [
SizedBox(
width: 295.w,
child: TextField(
controller: searchController,
onChanged: (value) {
child: CustomTextFormField(
textEditingController: searchController,
onInput: (value) {
// Call method to handle search
handleSearch(value, "");
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
hintText: 'Search videos',
border: OutlineInputBorder(),
),
hintText: "Search videos",
),
),
SizedBox(
@@ -104,43 +102,64 @@ class _VideosMoreState extends State<VideosMore> {
height: 10.h,
),
// Display search results or regular list
SizedBox(
height: 620.h,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: contentBytesController
.contentBytesModel.data!.video!.length,
itemBuilder: (ctx, index) {
return Container(
margin: const EdgeInsets.only(
bottom: 20,
),
child: videoCard(
contentBytesController.contentBytesModel
.data!.video![index].file ??
"",
contentBytesController.contentBytesModel
.data!.video![index].title ??
"",
contentBytesController
.contentBytesModel
.data!
.video![index]
.description ??
"",
contentBytesController.contentBytesModel
.data!.video![index].image ??
""),
);
},
separatorBuilder: (ctx, inndex) {
return SizedBox(
height: 10,
);
},
),
)
contentBytesController
.contentBytesModel.data!.video!.isEmpty
? Center(
child: Column(
children: [
Gap(250),
text24W500("No Data Found !"),
],
))
: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: contentBytesController
.contentBytesModel.data!.video!.length,
itemBuilder: (ctx, index) {
return Container(
margin: const EdgeInsets.only(
bottom: 20,
),
child: videoCard(
contentBytesController
.contentBytesModel
.data!
.video![index]
.link ??
"",
contentBytesController
.contentBytesModel
.data!
.video![index]
.title ??
"",
contentBytesController
.contentBytesModel
.data!
.video![index]
.description ??
"",
contentBytesController
.contentBytesModel
.data!
.video![index]
.image ??
"",
contentBytesController
.contentBytesModel
.data!
.video![index]
.createdAt ??
""),
);
},
separatorBuilder: (ctx, inndex) {
return SizedBox(
height: 10,
);
},
)
],
),
),
@@ -235,8 +254,9 @@ class _VideosMoreState extends State<VideosMore> {
return SizedBox();
}
Widget videoCard(
String video, String title, String description, String image) {
Widget videoCard(String video, String title, String description, String image,
String createdAt) {
ContactUsController contactUsController = Get.put(ContactUsController());
return InkWell(
onTap: () {
Get.to(() => const PlayerWidget(), arguments: {
@@ -246,7 +266,7 @@ class _VideosMoreState extends State<VideosMore> {
child: commonGlassContainer(
borderradius: 8,
width: double.infinity,
height: 320.h,
height: 340.h,
customWidget: Padding(
padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
child: Column(
@@ -271,12 +291,23 @@ class _VideosMoreState extends State<VideosMore> {
sizedBoxHeight(20.h),
Row(
children: [
// CircleAvatar(
// radius: 23.r,
// backgroundImage: const AssetImage(
// 'assets/images/png/Ellipse 1494.png'),
// ),
sizedBoxWidth(10.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text18W500(title),
text16W400(description),
text12W400_979797('2 days ago'),
SizedBox(
width: 0.81.sw,
height: 50,
child: text16W400(description,
textOver: TextOverflow.ellipsis)),
text12W400_979797(
contactUsController.timeAgoConverter(createdAt)),
],
)
],

View File

@@ -17,7 +17,7 @@ class ReadPDF extends StatelessWidget {
title: Text(title!),
),
body: SfPdfViewer.network(
'https://cdn.syncfusion.com/content/PDFViewer/flutter-succinctly.pdf',
pdfUrfl!,
),
);
}

View File

@@ -47,4 +47,42 @@ class ContentBytesApi {
}
return response;
}
Future<ResponseData<dynamic>> getPreviousReadData() async {
final response = await NetworkApiServices()
.getApi(ApiUrls.getPreviousReadApi, 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>> updateReadCounts(int xid) async {
final response = await NetworkApiServices().postApi(
{
'content_byte_read_xid': xid,
},
ApiUrls.storeReadCountApi,
);
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;
}
}

View File

@@ -580,10 +580,10 @@ packages:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev"
source: hosted
version: "0.19.0"
version: "0.18.1"
js:
dependency: transitive
description:
@@ -616,6 +616,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.4.9"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
url: "https://pub.dev"
source: hosted
version: "10.0.0"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
url: "https://pub.dev"
source: hosted
version: "2.0.1"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
url: "https://pub.dev"
source: hosted
version: "2.0.1"
lints:
dependency: transitive
description:
@@ -636,10 +660,10 @@ packages:
dependency: "direct main"
description:
name: local_auth
sha256: "280421b416b32de31405b0a25c3bd42dfcef2538dfbb20c03019e02a5ed55ed0"
sha256: "27679ed8e0d7daab2357db6bb7076359e083a56b295c0c59723845301da6aed9"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.1.8"
local_auth_android:
dependency: transitive
description:
@@ -648,14 +672,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.37"
local_auth_darwin:
local_auth_ios:
dependency: transitive
description:
name: local_auth_darwin
sha256: "33381a15b0de2279523eca694089393bb146baebdce72a404555d03174ebc1e9"
name: local_auth_ios
sha256: eb283b530029b334698918f1e282d4483737cbca972ff21b9193be3d6de8e2b8
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.1.6"
local_auth_platform_interface:
dependency: transitive
description:
@@ -684,26 +708,26 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
version: "0.12.16"
version: "0.12.16+1"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
version: "0.5.0"
version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.11.0"
mime:
dependency: transitive
description:
@@ -748,10 +772,10 @@ packages:
dependency: transitive
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.8.3"
version: "1.9.0"
path_drawing:
dependency: transitive
description:
@@ -1085,6 +1109,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.1"
timeago:
dependency: "direct main"
description:
name: timeago
sha256: d3204eb4c788214883380253da7f23485320a58c11d145babc82ad16bf4e7764
url: "https://pub.dev"
source: hosted
version: "3.6.1"
typed_data:
dependency: transitive
description:
@@ -1246,6 +1278,14 @@ packages:
url: "https://github.com/kishan06/videoPlayerKB.git"
source: git
version: "0.0.2"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
url: "https://pub.dev"
source: hosted
version: "13.0.0"
wakelock:
dependency: transitive
description:
@@ -1286,14 +1326,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.2.1"
web:
dependency: transitive
description:
name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
url: "https://pub.dev"
source: hosted
version: "0.3.0"
win32:
dependency: transitive
description:
@@ -1319,5 +1351,5 @@ packages:
source: hosted
version: "6.3.0"
sdks:
dart: ">=3.2.3 <4.0.0"
flutter: ">=3.16.6"
dart: ">=3.2.0-0 <4.0.0"
flutter: ">=3.13.0"

View File

@@ -50,6 +50,7 @@ dependencies:
flutter_html: ^3.0.0-beta.2
flutter_bloc: ^8.1.5
equatable: ^2.0.5
timeago: ^3.6.1
dev_dependencies:
flutter_test: