Skip to content

Commit 4436474

Browse files
authored
Merge pull request #15 from piashcse/feature-tv-series
Feature tv series
2 parents 4dda77d + c956aeb commit 4436474

30 files changed

+1574
-147
lines changed

lib/core/utils/utils.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,14 @@ String formatDuration(int minutes) {
22
final hours = minutes ~/ 60;
33
final remainingMinutes = minutes % 60;
44
return '${hours}h ${remainingMinutes}m';
5+
}
6+
7+
String formatTvDuration(List<int>? episodeRunTime) {
8+
if (episodeRunTime == null || episodeRunTime.isEmpty) {
9+
return 'N/A';
10+
}
11+
12+
// For TV series, we'll show the average episode runtime
13+
final avgRuntime = episodeRunTime.reduce((a, b) => a + b) ~/ episodeRunTime.length;
14+
return '${avgRuntime}m';
515
}

lib/features/movie/presentation/pages/movie_main_page.dart

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_movie_clean_architecture/features/movie/presentation/pages/popular_page.dart';
33
import 'package:flutter_movie_clean_architecture/features/movie/presentation/pages/top_rated_page.dart';
44
import 'package:flutter_movie_clean_architecture/features/movie/presentation/pages/up_coming_page.dart';
5-
import 'package:flutter_movie_clean_architecture/features/movie/presentation/widgets/movie_search.dart';
65
import 'package:flutter_riverpod/flutter_riverpod.dart';
76

87
import 'now_playing_page.dart';
@@ -16,7 +15,6 @@ class MovieMainPage extends ConsumerStatefulWidget {
1615

1716
class _MovieMainPageState extends ConsumerState<MovieMainPage> {
1817
int _selectedIndex = 0;
19-
bool _isSearching = false;
2018

2119
final _pages = [
2220
const NowPlayingPage(),
@@ -25,70 +23,35 @@ class _MovieMainPageState extends ConsumerState<MovieMainPage> {
2523
const UpComingPage(),
2624
];
2725

28-
final _pageLabels = [
29-
'Flutter Movie',
30-
'Popular',
31-
'Top Rated',
32-
'Upcoming',
33-
];
34-
3526
void _onItemTapped(int index) {
3627
setState(() {
3728
_selectedIndex = index;
38-
_isSearching = false;
39-
});
40-
}
41-
42-
void _toggleSearch() {
43-
setState(() {
44-
_isSearching = !_isSearching;
45-
});
46-
}
47-
48-
void _closeSearch() {
49-
setState(() {
50-
_isSearching = false;
5129
});
5230
}
5331

5432
@override
5533
Widget build(BuildContext context) {
5634
return Scaffold(
57-
appBar: AppBar(
58-
title: Text(_pageLabels[_selectedIndex]),
59-
),
60-
body: Stack(
61-
children: [
62-
// Main content
63-
_pages[_selectedIndex],
64-
// Search overlay
65-
if (_isSearching)
66-
MovieSearchWidget(onClose: _closeSearch),
67-
],
68-
),
69-
floatingActionButton: FloatingActionButton(
70-
onPressed: _toggleSearch,
71-
child: const Icon(Icons.search),
72-
),
35+
body: _pages[_selectedIndex],
7336
bottomNavigationBar: BottomNavigationBar(
7437
currentIndex: _selectedIndex,
7538
onTap: _onItemTapped,
7639
type: BottomNavigationBarType.fixed,
7740
items: const [
7841
BottomNavigationBarItem(
79-
icon: Icon(Icons.movie),
42+
icon: Icon(Icons.play_circle_fill),
8043
label: 'Now Playing',
8144
),
8245
BottomNavigationBarItem(
83-
icon: Icon(Icons.trending_up),
46+
icon: Icon(Icons.favorite),
8447
label: 'Popular',
8548
),
8649
BottomNavigationBarItem(
8750
icon: Icon(Icons.star),
8851
label: 'Top Rated',
8952
),
9053
BottomNavigationBarItem(
91-
icon: Icon(Icons.keyboard_arrow_down),
54+
icon: Icon(Icons.upcoming),
9255
label: 'Upcoming',
9356
),
9457
],

lib/features/movie/presentation/pages/now_playing_page.dart

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,32 @@ class _MovieHomePageState extends ConsumerState<NowPlayingPage> {
5454

5555
@override
5656
Widget build(BuildContext context) {
57-
return Scaffold(
58-
body: _isInitialLoading
59-
? const Center(child: CircularProgressIndicator())
60-
: Column(
61-
children: [
62-
Expanded(
63-
child: GridView.builder(
64-
controller: _scrollController,
65-
padding: const EdgeInsets.all(8),
66-
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
67-
crossAxisCount: 2,
68-
childAspectRatio: 2 / 3,
69-
crossAxisSpacing: 8,
70-
mainAxisSpacing: 8,
71-
),
72-
itemCount: _movies.length,
73-
itemBuilder: (context, index) {
74-
return MovieCardWidget(movie: _movies[index]);
75-
},
57+
return _isInitialLoading
58+
? const Center(child: CircularProgressIndicator())
59+
: Column(
60+
children: [
61+
Expanded(
62+
child: GridView.builder(
63+
controller: _scrollController,
64+
padding: const EdgeInsets.all(8),
65+
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
66+
crossAxisCount: 2,
67+
childAspectRatio: 2 / 3,
68+
crossAxisSpacing: 8,
69+
mainAxisSpacing: 8,
7670
),
71+
itemCount: _movies.length,
72+
itemBuilder: (context, index) {
73+
return MovieCardWidget(movie: _movies[index]);
74+
},
7775
),
78-
if (_hasMore && _isLoadingMore && !_isInitialLoading)
79-
const Padding(
80-
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
81-
child: CircularProgressIndicator(),
82-
),
83-
],
84-
),
76+
),
77+
if (_hasMore && _isLoadingMore && !_isInitialLoading)
78+
const Padding(
79+
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
80+
child: CircularProgressIndicator(),
81+
),
82+
],
8583
);
8684
}
8785
}

lib/features/movie/presentation/pages/popular_page.dart

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,32 @@ class _PopularMoviePageState extends ConsumerState<PopularPage> {
5454

5555
@override
5656
Widget build(BuildContext context) {
57-
return Scaffold(
58-
body: _isInitialLoading
59-
? const Center(child: CircularProgressIndicator())
60-
: Column(
61-
children: [
62-
Expanded(
63-
child: GridView.builder(
64-
controller: _scrollController,
65-
padding: const EdgeInsets.all(8),
66-
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
67-
crossAxisCount: 2,
68-
childAspectRatio: 2 / 3,
69-
crossAxisSpacing: 8,
70-
mainAxisSpacing: 8,
71-
),
72-
itemCount: _movies.length,
73-
itemBuilder: (context, index) {
74-
return MovieCardWidget(movie: _movies[index]);
75-
},
57+
return _isInitialLoading
58+
? const Center(child: CircularProgressIndicator())
59+
: Column(
60+
children: [
61+
Expanded(
62+
child: GridView.builder(
63+
controller: _scrollController,
64+
padding: const EdgeInsets.all(8),
65+
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
66+
crossAxisCount: 2,
67+
childAspectRatio: 2 / 3,
68+
crossAxisSpacing: 8,
69+
mainAxisSpacing: 8,
7670
),
71+
itemCount: _movies.length,
72+
itemBuilder: (context, index) {
73+
return MovieCardWidget(movie: _movies[index]);
74+
},
7775
),
78-
if (_hasMore && _isLoadingMore && !_isInitialLoading)
79-
const Padding(
80-
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
81-
child: CircularProgressIndicator(),
82-
),
83-
],
84-
),
76+
),
77+
if (_hasMore && _isLoadingMore && !_isInitialLoading)
78+
const Padding(
79+
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
80+
child: CircularProgressIndicator(),
81+
),
82+
],
8583
);
8684
}
8785
}

lib/features/movie/presentation/pages/top_rated_page.dart

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,32 @@ class _TopRatedMoviePageState extends ConsumerState<TopRatedPage> {
5454

5555
@override
5656
Widget build(BuildContext context) {
57-
return Scaffold(
58-
body: _isInitialLoading
59-
? const Center(child: CircularProgressIndicator())
60-
: Column(
61-
children: [
62-
Expanded(
63-
child: GridView.builder(
64-
controller: _scrollController,
65-
padding: const EdgeInsets.all(8),
66-
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
67-
crossAxisCount: 2,
68-
childAspectRatio: 2 / 3,
69-
crossAxisSpacing: 8,
70-
mainAxisSpacing: 8,
71-
),
72-
itemCount: _movies.length,
73-
itemBuilder: (context, index) {
74-
return MovieCardWidget(movie: _movies[index]);
75-
},
57+
return _isInitialLoading
58+
? const Center(child: CircularProgressIndicator())
59+
: Column(
60+
children: [
61+
Expanded(
62+
child: GridView.builder(
63+
controller: _scrollController,
64+
padding: const EdgeInsets.all(8),
65+
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
66+
crossAxisCount: 2,
67+
childAspectRatio: 2 / 3,
68+
crossAxisSpacing: 8,
69+
mainAxisSpacing: 8,
7670
),
71+
itemCount: _movies.length,
72+
itemBuilder: (context, index) {
73+
return MovieCardWidget(movie: _movies[index]);
74+
},
7775
),
78-
if (_hasMore && _isLoadingMore && !_isInitialLoading)
79-
const Padding(
80-
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
81-
child: CircularProgressIndicator(),
82-
),
83-
],
84-
),
76+
),
77+
if (_hasMore && _isLoadingMore && !_isInitialLoading)
78+
const Padding(
79+
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
80+
child: CircularProgressIndicator(),
81+
),
82+
],
8583
);
8684
}
8785
}

lib/features/movie/presentation/pages/up_coming_page.dart

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,32 @@ class _UpComingMoviePageState extends ConsumerState<UpComingPage> {
5454

5555
@override
5656
Widget build(BuildContext context) {
57-
return Scaffold(
58-
body: _isInitialLoading
59-
? const Center(child: CircularProgressIndicator())
60-
: Column(
61-
children: [
62-
Expanded(
63-
child: GridView.builder(
64-
controller: _scrollController,
65-
padding: const EdgeInsets.all(8),
66-
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
67-
crossAxisCount: 2,
68-
childAspectRatio: 2 / 3,
69-
crossAxisSpacing: 8,
70-
mainAxisSpacing: 8,
71-
),
72-
itemCount: _movies.length,
73-
itemBuilder: (context, index) {
74-
return MovieCardWidget(movie: _movies[index]);
75-
},
57+
return _isInitialLoading
58+
? const Center(child: CircularProgressIndicator())
59+
: Column(
60+
children: [
61+
Expanded(
62+
child: GridView.builder(
63+
controller: _scrollController,
64+
padding: const EdgeInsets.all(8),
65+
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
66+
crossAxisCount: 2,
67+
childAspectRatio: 2 / 3,
68+
crossAxisSpacing: 8,
69+
mainAxisSpacing: 8,
7670
),
71+
itemCount: _movies.length,
72+
itemBuilder: (context, index) {
73+
return MovieCardWidget(movie: _movies[index]);
74+
},
7775
),
78-
if (_hasMore && _isLoadingMore && !_isInitialLoading)
79-
const Padding(
80-
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
81-
child: CircularProgressIndicator(),
82-
),
83-
],
84-
),
76+
),
77+
if (_hasMore && _isLoadingMore && !_isInitialLoading)
78+
const Padding(
79+
padding: EdgeInsets.only(bottom: 24.0, top: 8.0),
80+
child: CircularProgressIndicator(),
81+
),
82+
],
8583
);
8684
}
8785
}

0 commit comments

Comments
 (0)