Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion assets/strings/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"trending": "Trending",
"information": "Information",
"trailers": "Trailers",
"casts": "Casts"
"casts": "Casts",
"delete": "Delete"
}
3 changes: 2 additions & 1 deletion assets/strings/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"trending": "Trending",
"information": "Information",
"trailers": "Trailers",
"casts": "Casts"
"casts": "Casts",
"delete": "Delete"
}
1 change: 1 addition & 0 deletions lib/src/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class App extends StatelessWidget {
MainScreen.routeName: (context) => MainScreen(),
GenreScreen.routeName: (context) => GenreScreen(),
DetailMovieScreen.routeName: (context) => DetailMovieScreen(),
FavoriteScreen.routeName: (context) => FavoriteScreen(),
},
);
}
Expand Down
1 change: 1 addition & 0 deletions lib/src/blocs/blocs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export 'genre_bloc/blocs.dart';
export 'setting_bloc/blocs.dart';
export 'detail_movie_bloc/blocs.dart';
export 'main_bloc/blocs.dart';
export 'favorite_bloc/blocs.dart';
2 changes: 1 addition & 1 deletion lib/src/blocs/detail_movie_bloc/detail_movie_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:moviesdb/src/locator.dart';
import 'package:moviesdb/src/repositories/repositories.dart';

class DetailMovieBloc extends Bloc<BaseEvent, BaseState> {
MoviesRepositories moviesRepositories = locator<MoviesRepositories>();
MoviesRepository moviesRepositories = locator<MoviesRepository>();

@override
BaseState get initialState => InitState();
Expand Down
3 changes: 3 additions & 0 deletions lib/src/blocs/favorite_bloc/blocs.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export 'favorite_event.dart';
export 'favorite_state.dart';
export 'favorite_bloc.dart';
53 changes: 53 additions & 0 deletions lib/src/blocs/favorite_bloc/favorite_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:moviesdb/src/blocs/base_bloc/base.dart';
import 'package:moviesdb/src/blocs/blocs.dart';
import 'package:moviesdb/src/locator.dart';
import 'package:moviesdb/src/repositories/repositories.dart';

class FavoriteBloc extends Bloc<BaseEvent, BaseState> {
final FavoriteRepository repository = locator<FavoriteRepository>();

@override
BaseState get initialState => InitState();

@override
Stream<BaseState> mapEventToState(BaseEvent event) async* {
if (event is ClickedFavorite) {
try {
yield (LoadingState());
final result = await repository.isFavorite(event.movie);
if (result == true) {
await repository.deleteFavorite(event.movie);
yield (NormalState());
} else if (result == false) {
await repository.addFavorite(event.movie);
yield (FavoriteState());
}
} catch (e) {
yield (ErrorState(data: e.toString()));
}
} else if (event is CheckFavorite) {
try {
yield (LoadingState());
final result = await repository.isFavorite(event.movie);
yield (result == true ? FavoriteState() : NormalState());
} catch (e) {
yield (ErrorState(data: e.toString()));
}
} else if (event is GetFavorites) {
try {
yield (LoadingState());
final result = await repository.getFavorites();
yield (LoadedState(data: result));
} catch (e) {
yield (ErrorState(data: e.toString()));
}
} else if (event is UnFavorite) {
try {
await repository.deleteFavorite(event.movie);
} catch (e) {
yield (ErrorState(data: e.toString()));
}
}
}
}
22 changes: 22 additions & 0 deletions lib/src/blocs/favorite_bloc/favorite_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:moviesdb/src/blocs/base_bloc/base.dart';
import 'package:moviesdb/src/data/models/models.dart';

class GetFavorites extends BaseEvent {}

class CheckFavorite extends BaseEvent {
final Movie movie;

CheckFavorite(this.movie);
}

class ClickedFavorite extends BaseEvent {
final Movie movie;

ClickedFavorite(this.movie);
}

class UnFavorite extends BaseEvent {
final Movie movie;

UnFavorite(this.movie);
}
5 changes: 5 additions & 0 deletions lib/src/blocs/favorite_bloc/favorite_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:moviesdb/src/blocs/base_bloc/base.dart';

class FavoriteState extends BaseState {}

class NormalState extends BaseState {}
2 changes: 1 addition & 1 deletion lib/src/blocs/genre_bloc/genre_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:moviesdb/src/repositories/repositories.dart';
import 'package:rxdart/rxdart.dart';

class GenreBloc extends Bloc<BaseEvent, BaseState> {
MoviesRepositories moviesRepositories = locator<MoviesRepositories>();
MoviesRepository moviesRepositories = locator<MoviesRepository>();
bool loadingMore = false;

@override
Expand Down
2 changes: 1 addition & 1 deletion lib/src/blocs/home_bloc/home_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:moviesdb/src/locator.dart';
import 'package:moviesdb/src/repositories/repositories.dart';

class HomeBloc extends Bloc<BaseEvent, BaseState> {
MoviesRepositories moviesRepositories = locator<MoviesRepositories>();
MoviesRepository moviesRepositories = locator<MoviesRepository>();

@override
BaseState get initialState => InitState();
Expand Down
2 changes: 1 addition & 1 deletion lib/src/blocs/setting_bloc/setting_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:moviesdb/src/repositories/repositories.dart';
import 'package:package_info/package_info.dart';

class SettingBloc extends Bloc<BaseEvent, BaseState> {
SettingRepositories settingRepositories = locator<SettingRepositories>();
SettingRepository settingRepositories = locator<SettingRepository>();

@override
BaseState get initialState => InitState();
Expand Down
20 changes: 20 additions & 0 deletions lib/src/data/dao/movie_dao.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:floor/floor.dart';
import 'package:moviesdb/src/data/models/models.dart';

@dao
abstract class MovieDao {
@Query("SELECT * FROM $TABLE_FAVORITE")
Future<List<Movie>> getMovies();

@Query("SELECT * FROM $TABLE_FAVORITE WHERE id = :id")
Future<Movie> findMovieById(int id);

@delete
Future<int> deleteMovie(Movie movie);

@insert
Future<int> addMovie(Movie movie);

@Query("SELECT * FROM $TABLE_FAVORITE")
Stream<List<Movie>> getMoviesAsStream();
}
35 changes: 34 additions & 1 deletion lib/src/data/models/movie.dart
Original file line number Diff line number Diff line change
@@ -1,28 +1,51 @@
import 'package:equatable/equatable.dart';
import 'package:floor/floor.dart';
import 'package:moviesdb/src/data/models/models.dart';

const String TABLE_FAVORITE = "table_favorite";

@Entity(tableName: TABLE_FAVORITE)
class Movie extends Equatable {
@primaryKey
int id;
@ignore
String backdropPath;
@ignore
List<Genre> genres;
@ColumnInfo(name: "title", nullable: false)
String title;
@ColumnInfo(name: "overview", nullable: true)
String overview;
@ColumnInfo(name: "poster_path", nullable: true)
String porterPath;
@ignore
List<Company> productionCompanies;
@ColumnInfo(name: "release_date", nullable: true)
String releaseDate;
@ignore
int runtime;
@ignore
int revenue;
@ignore
int budget;
@ignore
List<Video> videos;
@ignore
List<Actor> cast;
@ColumnInfo(name: "vote_average", nullable: true)
double voteAverage;
@ignore
int voteCount;

@override
List<Object> get props => [id, title];

Movie(this.id, this.porterPath, this.title, this.overview, this.releaseDate, this.voteAverage);

Movie.empty();

static Movie formJson(Map<String, dynamic> json) {
return Movie()
return Movie.empty()
..id = json["id"]
..backdropPath = json["backdrop_path"]
..title = json["title"]
Expand All @@ -44,4 +67,14 @@ class Movie extends Equatable {
? json["credits"]["cast"]?.map((e) => Actor.fromJson(e))?.toList()?.cast<Actor>()
: [];
}

Map<String, dynamic> toMap() {
return Map<String, dynamic>()
..["id"] = id
..["poster_path"] = porterPath
..["title"] = title
..["overview"] = overview
..["release_date"] = releaseDate
..["vote_average"] = voteAverage;
}
}
7 changes: 4 additions & 3 deletions lib/src/locator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ import 'repositories/repositories.dart';

GetIt locator = GetIt.instance;

void setupLocator() {
void setupLocator() async {
locator.registerLazySingleton(() => Network());
locator.registerLazySingleton<MoviesRepositories>(() => MoviesRepositories());
locator.registerLazySingleton<SettingRepositories>(() => SettingRepositories());
locator.registerLazySingleton<MoviesRepository>(() => MoviesRepository());
locator.registerLazySingleton<SettingRepository>(() => SettingRepository());
locator.registerLazySingleton<FavoriteRepository>(() => FavoriteRepository());
}

void setupLocatorWithContext(BuildContext context) {
Expand Down
36 changes: 36 additions & 0 deletions lib/src/repositories/favorite_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:moviesdb/src/data/dao/movie_dao.dart';
import 'package:moviesdb/src/data/models/models.dart';
import 'package:moviesdb/src/services/database.dart';

class FavoriteRepository {
MovieDao _movieDao;

Future<MovieDao> get movieDao async {
if (_movieDao == null) {
_movieDao = (await DatabaseProvider.databaseProvider).movieDao;
}
return _movieDao;
}

Future<int> addFavorite(Movie movie) async{
final dao = await movieDao;
return dao.addMovie(movie);
}

Future<bool> isFavorite(Movie movie) async {
final dao = await movieDao;
final result = await dao.findMovieById(movie.id) != null;
return result;
}

Future<List<Movie>> getFavorites() async{
final dao = await movieDao;
return dao.getMovies();
}

Future<bool> deleteFavorite(Movie movie) async {
final dao = await movieDao;
final result = await dao.deleteMovie(movie);
return result > 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:moviesdb/src/services/services.dart';
import 'package:moviesdb/src/utils/utils.dart';
import 'package:moviesdb/src/extension.dart';

class MoviesRepositories {
class MoviesRepository {
Network _network = locator<Network>();

Future<Movie> getDetailMovie(int movieId) async {
Expand Down
5 changes: 3 additions & 2 deletions lib/src/repositories/repositories.dart
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export 'movies_repositories.dart';
export 'setting_repositories.dart';
export 'movies_repository.dart';
export 'setting_repository.dart';
export 'favorite_repository.dart';
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:package_info/package_info.dart';

class SettingRepositories{
class SettingRepository{
Future<PackageInfo> getAppInfo() async{
return await PackageInfo.fromPlatform();
}
Expand Down
24 changes: 24 additions & 0 deletions lib/src/services/database.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'dart:async';

import 'package:floor/floor.dart';
import 'package:moviesdb/src/data/dao/movie_dao.dart';
import 'package:moviesdb/src/data/models/models.dart';
import 'package:sqflite/sqflite.dart' as sqflite;

part 'database.g.dart';

const String DB_NAME = "movies_database.db";

@Database(version: 1, entities: [Movie])
abstract class DatabaseProvider extends FloorDatabase {
static DatabaseProvider _database;

static Future<DatabaseProvider> get databaseProvider async {
if (_database == null) {
_database = await $FloorDatabaseProvider.databaseBuilder(DB_NAME).build();
}
return _database;
}

MovieDao get movieDao;
}
Loading