Skip to content

Commit d5b452d

Browse files
committed
feat(anime): continue episode card
1 parent 1ec2f07 commit d5b452d

File tree

3 files changed

+103
-13
lines changed

3 files changed

+103
-13
lines changed

lib/Adaptor/Episode/EpisodeAdaptor.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ class EpisodeAdaptorState extends State<EpisodeAdaptor> {
113113
return AnimatedSwitcher(
114114
duration: const Duration(milliseconds: 500),
115115
child: Padding(
116-
padding:
117-
const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0),
116+
padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0),
118117
child: StaggeredGrid.count(
119118
crossAxisCount: crossAxisCount,
120119
children: List.generate(

lib/Screens/Info/Tabs/Watch/Anime/AnimeWatchScreen.dart

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:get/get.dart';
77
import '../../../../../Adaptor/Episode/EpisodeAdaptor.dart';
88
import '../../../../../DataClass/Episode.dart';
99
import '../Widgets/BuildChunkSelector.dart';
10+
import '../Widgets/ContinueCard.dart';
1011
import 'AnimeParser.dart';
1112

1213
class AnimeWatchScreen extends StatefulWidget {
@@ -54,24 +55,30 @@ class AnimeWatchScreenState extends BaseWatchScreen<AnimeWatchScreen> {
5455
}
5556

5657
updateEpisodeDetails(episodeList);
57-
var (chunks, selectedChunkIndex) =
58-
buildChunks(context, episodeList, widget.mediaData.userProgress.toString());
5958

59+
var (chunks, selectedChunkIndex) = buildChunks(
60+
context, episodeList, widget.mediaData.userProgress.toString());
61+
62+
var selectedEpisode = episodeList[((widget.mediaData.userProgress ?? 0) + 1).toString()];
6063
return Column(
6164
mainAxisSize: MainAxisSize.min,
6265
crossAxisAlignment: CrossAxisAlignment.start,
6366
children: [
6467
_buildTitle(),
65-
buildChunkSelector(context,chunks, selectedChunkIndex),
68+
ContinueCard(
69+
mediaData: widget.mediaData,
70+
episode: selectedEpisode,
71+
source: _viewModel.source.value!,
72+
),
73+
buildChunkSelector(context, chunks, selectedChunkIndex),
6674
Container(
67-
margin:
68-
const EdgeInsets.symmetric(horizontal: 18, vertical: 4),
75+
margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 4),
6976
child: Obx(() => EpisodeAdaptor(
70-
type: _viewModel.viewType.value,
71-
source: _viewModel.source.value!,
72-
episodeList: chunks[selectedChunkIndex.value],
73-
mediaData: widget.mediaData,
74-
)),
77+
type: _viewModel.viewType.value,
78+
source: _viewModel.source.value!,
79+
episodeList: chunks[selectedChunkIndex.value],
80+
mediaData: widget.mediaData,
81+
)),
7582
)
7683
],
7784
);
@@ -80,7 +87,7 @@ class AnimeWatchScreenState extends BaseWatchScreen<AnimeWatchScreen> {
8087

8188
Widget _buildTitle() {
8289
return Padding(
83-
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16),
90+
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 2),
8491
child: Row(
8592
mainAxisAlignment: MainAxisAlignment.spaceBetween,
8693
children: [
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import 'package:dantotsu/Widgets/CachedNetworkImage.dart';
2+
import 'package:flutter/material.dart';
3+
4+
import '../../../../../Adaptor/Episode/EpisodeAdaptor.dart';
5+
import '../../../../../Adaptor/Episode/Widget/HandleProgress.dart';
6+
import '../../../../../DataClass/Episode.dart';
7+
import '../../../../../DataClass/Media.dart';
8+
import '../../../../../api/Mangayomi/Model/Source.dart';
9+
10+
class ContinueCard extends StatelessWidget {
11+
final Media mediaData;
12+
final Episode? episode;
13+
final Source source;
14+
15+
const ContinueCard({
16+
super.key,
17+
required this.mediaData,
18+
required this.episode,
19+
required this.source,
20+
});
21+
22+
@override
23+
Widget build(BuildContext context) {
24+
if (episode == null || mediaData.userProgress == null || mediaData.userProgress == 0) {
25+
return const SizedBox();
26+
}
27+
28+
return Card(
29+
shape: RoundedRectangleBorder(
30+
borderRadius: BorderRadius.circular(16),
31+
),
32+
clipBehavior: Clip.hardEdge,
33+
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 32),
34+
child: GestureDetector(
35+
onTap: () =>
36+
onEpisodeClick(context, episode!, source, mediaData, () {}),
37+
child: SizedBox(
38+
height: 80,
39+
child: Stack(
40+
children: [
41+
Positioned.fill(
42+
child: cachedNetworkImage(
43+
imageUrl:
44+
episode?.thumb ?? mediaData.cover ?? mediaData.banner,
45+
fit: BoxFit.cover,
46+
),
47+
),
48+
Positioned.fill(
49+
child: Container(
50+
color: Colors.black.withOpacity(0.6),
51+
),
52+
),
53+
Align(
54+
alignment: Alignment.center,
55+
child: Padding(
56+
padding: const EdgeInsets.all(16.0),
57+
child: Text(
58+
'Continue : Episode ${episode!.number} \n ${episode!.title}',
59+
maxLines: 2,
60+
overflow: TextOverflow.ellipsis,
61+
textAlign: TextAlign.center,
62+
style: const TextStyle(
63+
fontFamily: 'Poppins',
64+
fontWeight: FontWeight.bold,
65+
color: Colors.white,
66+
),
67+
),
68+
),
69+
),
70+
Align(
71+
alignment: Alignment.bottomCenter,
72+
child: handleProgress(
73+
context: context,
74+
mediaId: mediaData.id,
75+
ep: episode!.number,
76+
width: 162,
77+
),
78+
),
79+
],
80+
),
81+
),
82+
));
83+
}
84+
}

0 commit comments

Comments
 (0)