Skip to content

Commit f6da32b

Browse files
committed
- Add recommended movies section to movie detail page
- Refactor movie detail page into smaller widgets - Add utility function for formatting movie duration
1 parent f952a99 commit f6da32b

File tree

7 files changed

+386
-332
lines changed

7 files changed

+386
-332
lines changed

lib/core/utils/utils.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
String formatDuration(int minutes) {
2+
final hours = minutes ~/ 60;
3+
final remainingMinutes = minutes % 60;
4+
return '${hours}h ${remainingMinutes}m';
5+
}

lib/features/movie/data/datasources/movie_remote_data_source.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,11 @@ class MovieRemoteDataSource {
5757
.map((e) => MovieModel.fromJson(e))
5858
.toList();
5959
}
60+
Future<List<MovieModel>> getRecommendedMovie(int movieId) async {
61+
final response =
62+
await dio.get('movie/$movieId/recommendations');
63+
return (response.data['results'] as List)
64+
.map((e) => MovieModel.fromJson(e))
65+
.toList();
66+
}
6067
}

lib/features/movie/data/repositories/movie_repository_impl.dart

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,36 @@ class MovieRepositoryImpl implements MovieRepository {
7474
runtime: model.runtime ?? 0,
7575
originalLanguage: model.originalLanguage ?? "N/A",
7676
genres: model.genres?.map((genre) => genre.name ?? "").toList() ?? [],
77-
productionCompanies: model.productionCompanies?.map((company) => company.name ?? "").toList() ?? [],
77+
productionCompanies: model.productionCompanies
78+
?.map((company) => company.name ?? "")
79+
.toList() ??
80+
[],
7881
);
7982
}
83+
8084
@override
8185
Future<List<Movie>> getMovieSearch(String query) async {
8286
final models = await remoteDataSource.getMovieSearch(query);
8387
return models
8488
.map((e) => Movie(
85-
id: e.id,
86-
title: e.title,
87-
posterPath: e.posterPath,
88-
overview: e.overview ?? '',
89-
))
89+
id: e.id,
90+
title: e.title,
91+
posterPath: e.posterPath,
92+
overview: e.overview ?? '',
93+
))
94+
.toList();
95+
}
96+
97+
@override
98+
Future<List<Movie>> getRecommendedMovie(int movieId) async {
99+
final models = await remoteDataSource.getRecommendedMovie(movieId);
100+
return models
101+
.map((e) => Movie(
102+
id: e.id,
103+
title: e.title,
104+
posterPath: e.posterPath,
105+
overview: e.overview ?? '',
106+
))
90107
.toList();
91108
}
92109
}

lib/features/movie/domain/repositories/entities/movie_repository.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ abstract class MovieRepository {
88
Future<List<Movie>> getUpComing(int page);
99
Future<MovieDetail> getMovieDetail(int movieId);
1010
Future<List<Movie>> getMovieSearch(String query);
11+
Future<List<Movie>> getRecommendedMovie(int movieId);
1112
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:flutter_movie_clean_architecture/features/movie/domain/entities/movie.dart';
2+
import 'package:flutter_movie_clean_architecture/features/movie/domain/repositories/entities/movie_repository.dart';
3+
4+
class GetRecommendedMovie {
5+
final MovieRepository repository;
6+
7+
GetRecommendedMovie(this.repository);
8+
9+
Future<List<Movie>> call(int movieId) =>
10+
repository.getRecommendedMovie(movieId);
11+
}

0 commit comments

Comments
 (0)