MyPlayList
unknown
dart
3 years ago
21 kB
9
Indexable
import 'package:base_architecture/core/shared_widgets/bookmark_dialog.dart';
import 'package:base_architecture/core/shared_widgets/login_dialog.dart';
import 'package:base_architecture/presentation/notifiers/auth_notifier/auth_notifier.dart';
import 'package:base_architecture/presentation/notifiers/book_view_notifier.dart';
import 'package:base_architecture/presentation/notifiers/play_list_notifier.dart/playlist_notifier.dart';
import 'package:base_architecture/presentation/notifiers/theme_notifier.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/nad_audio_player.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/player_menu.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/player_seasons.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/player_speed_dialog.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/player_timer_dialog.dart';
import 'package:base_architecture/presentation/pages/audio_player/widgets/playlist_bootom_item.dart';
import 'package:base_architecture/presentation/pages/main/main_page.dart';
import 'package:base_architecture/presentation/props/book_info_props.dart';
import 'package:base_architecture/presentation/props/bottom_item_props.dart';
import 'package:card_swiper/card_swiper.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'dart:ui' as ui;
class MyPlayList extends StatefulWidget {
const MyPlayList({
Key? key,
this.props,
}) : super(key: key);
final BookInfoProps? props;
@override
State<MyPlayList> createState() => _MyPlayListState();
}
class _MyPlayListState extends State<MyPlayList> {
BookViewNotifier bookViewNotifier = Provider.of<BookViewNotifier>(
navigatorKey.currentContext!,
listen: true,
);
ThemeNotifier themeNotifier = Provider.of<ThemeNotifier>(
navigatorKey.currentContext!,
listen: true,
);
PlayListNotifier playListNotifier = Provider.of<PlayListNotifier>(
navigatorKey.currentContext!,
listen: true,
);
AuthNotifier authNotifier = Provider.of<AuthNotifier>(
navigatorKey.currentContext!,
listen: false,
);
ui.TextDirection direction = ui.TextDirection.ltr;
@override
Widget build(BuildContext context) {
Size mediaQuery = MediaQuery.of(context).size;
bool? isFav = widget.props?.bookInfo.data?.first.isFav ?? true;
return Scaffold(
body: SafeArea(
child: Column(
children: [
_buildFirstRow(playListNotifier, themeNotifier, context),
_buildList(context, isFav, mediaQuery),
_buildBookDetails(themeNotifier, playListNotifier),
NadAudioPlayer(
props: widget.props,
),
_buildBottomNav(widget.props, authNotifier, playListNotifier),
],
),
),
);
}
Widget _buildList(
BuildContext context,
bool? isFav,
mediaQuery,
) =>
Padding(
padding: const EdgeInsets.symmetric(vertical: 15),
child: SizedBox(
height: playListNotifier.isDrive
? mediaQuery.height * 0.51
: mediaQuery.height * 0.43,
child: Directionality(
textDirection: direction,
child: Swiper(
controller: playListNotifier.swiperController,
itemCount:
widget.props?.bookInfo.data?.first.soundFiles?.length ?? 5,
onIndexChanged: (int value) {
if (playListNotifier.isPlaying) {
playListNotifier.changeIndex(value);
playListNotifier.pause();
playListNotifier.setSource(
bookViewNotifier.bookDetails.data?.first.soundFiles?[value]
.fullPathFile ??
'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
);
playListNotifier.didLog50 = false;
playListNotifier.didLog85 = false;
} else {
playListNotifier.changeIndex(value);
playListNotifier.setSource(
bookViewNotifier.bookDetails.data?.first.soundFiles?[value]
.fullPathFile ??
'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
);
playListNotifier.didLog50 = false;
playListNotifier.didLog85 = false;
}
},
viewportFraction: 0.77,
scale: 0.8,
loop: false,
index: playListNotifier.listIndex,
autoplay: false,
itemBuilder: (BuildContext context, int index) => Stack(
children: <Widget>[
Container(
padding: const EdgeInsets.symmetric(
vertical: 20,
horizontal: 20,
),
height: mediaQuery.height * 0.43,
decoration: BoxDecoration(
color: themeNotifier.getTheme().focusColor,
borderRadius: const BorderRadius.all(
Radius.circular(10),
),
),
child: Column(
children: [
Row(
children: [
_likeButton(
themeNotifier,
isFav,
),
],
),
const SizedBox(height: 16),
_cardImage(),
],
),
),
Visibility(
visible: playListNotifier.isDrive,
child: Align(
alignment: Alignment.bottomCenter,
child: InkWell(
child: SvgPicture.asset(
playListNotifier.isPlaying
? 'assets/svg/pause_audio.svg'
: 'assets/svg/play_audio.svg',
width: 128,
),
onTap: () {
String url = bookViewNotifier
.bookDetails
.data
?.first
.soundFiles?[playListNotifier.listIndex!]
.fullPathFile ??
'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';
playListNotifier.play(
url,
);
},
),
),
),
],
),
),
),
),
);
Widget _buildBottomNav(
BookInfoProps? props,
AuthNotifier authNotifier,
PlayListNotifier playListNotifier,
) =>
Expanded(
child: Visibility(
visible: !playListNotifier.isDrive,
child: Align(
alignment: Alignment.bottomCenter,
child: Consumer<PlayListNotifier>(
builder: (
BuildContext context,
PlayListNotifier notifier,
Widget? child,
) =>
Container(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
BottomItemsList(
props: BottomItemProps(
name: 'Put a mark',
svgPath: 'assets/svg/save.svg',
isSpeed: false,
ontap: () {
if (authNotifier.appUser != null) {
showDialog(
context: context,
builder: ((BuildContext context) =>
const BookMarkDialog(
isAudio: true,
)),
);
} else {
showDialog(
context: context,
builder: (BuildContext context) =>
const LoginDialog(),
);
}
},
),
),
BottomItemsList(
props: BottomItemProps(
name: 'Seasons',
svgPath: 'assets/svg/b2.svg',
isSpeed: false,
ontap: () {
Navigator.of(
context,
).push(
MaterialPageRoute<dynamic>(
builder: (BuildContext context) => PlayerSeasons(
soundFiles: widget
.props!.bookInfo.data!.first.soundFiles!,
),
),
);
},
),
),
BottomItemsList(
props: BottomItemProps(
name: 'Speed',
svgPath: 'assets/svg/b3.svg',
isSpeed: true,
ontap: () {
showDialog(
context: context,
builder: ((BuildContext context) =>
const PlayerSpeedDialog()),
);
},
),
),
BottomItemsList(
props: BottomItemProps(
name: 'Timer',
svgPath: 'assets/svg/b4.svg',
isSpeed: false,
ontap: () {
showDialog(
context: context,
builder: ((BuildContext context) =>
const PlayerTimerDialog()),
);
},
),
),
BottomItemsList(
props: BottomItemProps(
name: 'More',
svgPath: 'assets/svg/b5.svg',
isSpeed: false,
ontap: () {
if (authNotifier.appUser != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
PlayerMenuPage(
props: widget.props!,
),
),
);
} else {
showDialog(
context: context,
builder: (BuildContext context) =>
const LoginDialog(),
);
}
},
),
),
],
),
),
),
),
),
);
Widget _buildBookDetails(
ThemeNotifier themeNotifier,
PlayListNotifier playListNotifier,
) =>
Consumer<PlayListNotifier>(
builder:
(BuildContext context, PlayListNotifier notifier, Widget? child) =>
Visibility(
visible: !notifier.isDrive,
child: Padding(
padding: notifier.isDrive
? const EdgeInsets.symmetric(horizontal: 50, vertical: 10)
: EdgeInsets.only(
left: 50,
right: 50,
top: MediaQuery.of(context).size.height * 0.025,
bottom: MediaQuery.of(context).size.height * 0.035),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Semantics(
label: 'previous chapter'.tr(),
child: IconButton(
iconSize: 40,
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
onPressed: () {
playListNotifier.swiperController.next();
},
icon: SvgPicture.asset(
context.locale == const Locale('ar')
? 'assets/svg/next.svg'
: 'assets/svg/back.svg',
excludeFromSemantics: true,
),
),
),
Expanded(
child: Column(
children: [
Semantics(
label: widget.props?.bookInfo.data?.first.name ??
'اسم الكتاب',
container: true,
excludeSemantics: true,
child: Text(
widget.props?.bookInfo.data?.first.name ??
'اسم الكتاب',
style: themeNotifier
.getTheme()
.textTheme
.headline5!
.copyWith(
fontSize: 23,
),
textAlign: TextAlign.center,
),
),
Semantics(
label: widget
.props
?.bookInfo
.data
?.first
.soundFiles?[playListNotifier.listIndex!]
.name ??
'اسم الفصل',
container: true,
excludeSemantics: true,
child: Text(
widget
.props
?.bookInfo
.data
?.first
.soundFiles?[playListNotifier.listIndex!]
.name ??
'اسم الفصل',
style: themeNotifier
.getTheme()
.textTheme
.headline5!
.copyWith(fontSize: 16),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
),
],
),
),
Semantics(
label: 'next chapter'.tr(),
child: IconButton(
iconSize: 40,
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
onPressed: () {
playListNotifier.swiperController.previous();
},
icon: SvgPicture.asset(
context.locale == const Locale('ar')
? 'assets/svg/back.svg'
: 'assets/svg/next.svg',
excludeFromSemantics: true,
),
),
),
],
),
),
),
);
Widget _likeButton(
ThemeNotifier themeNotifier,
bool? isFav,
) =>
Semantics(
container: true,
button: true,
label: playListNotifier.isLiked ? 'like'.tr() : 'dislike'.tr(),
excludeSemantics: true,
child: Container(
decoration: BoxDecoration(
color: themeNotifier.getTheme().canvasColor,
border: Border.all(
color: themeNotifier.getTheme().canvasColor,
),
borderRadius: BorderRadius.circular(10),
),
child: IconButton(
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
onPressed: () {
setState(() {
bookViewNotifier.favouriteValue(isFav);
bookViewNotifier.addToWhishListORFav(
widget.props!.bookInfo.data!.first.id,
'fav',
);
});
},
icon: !isFav!
? SvgPicture.asset('assets/svg/heart.svg')
: SvgPicture.asset(
'assets/svg/filled_heart.svg',
excludeFromSemantics: true,
),
),
),
);
Expanded _cardImage() => Expanded(
child: Padding(
padding: const EdgeInsets.only(bottom: 50),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(10),
),
child: Image.network(
widget.props?.bookInfo.data?.first.imageFullPath ??
'https://arabcast.nqa.nadsoft.co/storage/uploads/book/images/b0ad5193-6509-4271-8307-3fabaebaf529-39b90772-d999-4711-a989-cb99e47f9e2c-غلاف عوالم تحت الارض.png',
),
),
),
);
Widget _buildFirstRow(
PlayListNotifier playListNotifier,
ThemeNotifier themeNotifier,
BuildContext context,
) =>
Padding(
padding: const EdgeInsets.only(left: 45, right: 45),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildBackButton(themeNotifier, context),
_buildDrivingMode(playListNotifier, themeNotifier),
],
),
);
Widget _buildDrivingMode(
PlayListNotifier playListNotifier,
ThemeNotifier themeNotifier,
) =>
InkWell(
onTap: () {
playListNotifier.setIsDrive();
},
child: Semantics(
label: playListNotifier.isDrive
? 'Disable driving mode'.tr()
: 'Enable driving mode'.tr(),
excludeSemantics: true,
child: Container(
padding: const EdgeInsets.all(8),
height: 50,
decoration: BoxDecoration(
color: themeNotifier.getTheme().shadowColor,
border: Border.all(
color: themeNotifier.getTheme().shadowColor,
),
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: [
SvgPicture.asset(
'assets/svg/car.svg',
excludeFromSemantics: true,
),
const SizedBox(width: 8),
Text(
playListNotifier.isDrive
? 'Disable driving mode'.tr()
: 'Enable driving mode'.tr(),
style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
color: themeNotifier.getTheme().focusColor,
),
),
],
),
),
),
);
Widget _buildBackButton(ThemeNotifier themeNotifier, BuildContext context) =>
Semantics(
label: 'back'.tr(),
child: Container(
decoration: BoxDecoration(
color: themeNotifier.getTheme().primaryColor,
border: Border.all(
color: themeNotifier.getTheme().shadowColor,
),
borderRadius: BorderRadius.circular(10),
),
child: IconButton(
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
onPressed: () {
Navigator.pop(context);
},
icon: SvgPicture.asset(
'assets/svg/down_arrow.svg',
excludeFromSemantics: true,
),
),
),
);
}
Editor is loading...