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

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added assets/images/img_placeholder.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework",
"${PODS_ROOT}/../Flutter/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/device_info/device_info.framework",
"${BUILT_PRODUCTS_DIR}/flutter_stetho/flutter_stetho.framework",
"${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
"${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework",
Expand All @@ -238,6 +239,7 @@
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_stetho.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework",
Expand Down
1 change: 1 addition & 0 deletions lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'News App',
home: HomePage(),
);
Expand Down
32 changes: 22 additions & 10 deletions lib/feature/data/datasource/news/news_remote_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlin
import 'package:meta/meta.dart';

abstract class NewsRemoteDataSource {
/// Calls the baseUrl:/v2/top-headlines?country=:country&apiKey=:apiKey endpoint
/// Calls the baseUrl:/v2/top-headlines?category=:category&country=:country&apiKey=:apiKey endpoint
///
/// Throws a [DioError] for all error codes.
Future<TopHeadlinesNewsResponseModel> getTopHeadlinesNews();
Future<TopHeadlinesNewsResponseModel> getTopHeadlinesNews(String category);
}

class NewsRemoteDataSourceImpl implements NewsRemoteDataSource {
Expand All @@ -20,14 +20,26 @@ class NewsRemoteDataSourceImpl implements NewsRemoteDataSource {
});

@override
Future<TopHeadlinesNewsResponseModel> getTopHeadlinesNews() async {
var response = await dio.get(
'/v2/top-headlines',
queryParameters: {
'country': 'id',
'apiKey': constantConfig.apiKeyNewsApi,
},
);
Future<TopHeadlinesNewsResponseModel> getTopHeadlinesNews(String category) async {
var response;
if (category == 'all') {
response = await dio.get(
'/v2/top-headlines',
queryParameters: {
'country': 'id',
'apiKey': constantConfig.apiKeyNewsApi,
},
);
} else {
response = await dio.get(
'/v2/top-headlines',
queryParameters: {
'country': 'id',
'apiKey': constantConfig.apiKeyNewsApi,
'category': category,
},
);
}
if (response.statusCode == 200) {
return TopHeadlinesNewsResponseModel.fromJson(response.data);
} else {
Expand Down
4 changes: 2 additions & 2 deletions lib/feature/data/repository/news/news_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ class NewsRepositoryImpl implements NewsRepository {
});

@override
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews() async {
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews(String category) async {
var isConnected = await networkInfo.isConnected;
if (isConnected) {
try {
var response = await newsRemoteDataSource.getTopHeadlinesNews();
var response = await newsRemoteDataSource.getTopHeadlinesNews(category);
return Right(response);
} on DioError catch (error) {
return Left(ServerFailure(error.message));
Expand Down
2 changes: 1 addition & 1 deletion lib/feature/domain/repository/news/news_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlin

abstract class NewsRepository {

Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews();
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews(String category);

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,32 @@
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_news_app/core/error/failure.dart';
import 'package:flutter_news_app/core/usecase/usecase.dart';
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
import 'package:flutter_news_app/feature/domain/repository/news/news_repository.dart';
import 'package:meta/meta.dart';

class GetTopHeadlinesNews implements UseCase<TopHeadlinesNewsResponseModel, NoParams> {
class GetTopHeadlinesNews implements UseCase<TopHeadlinesNewsResponseModel, ParamsGetTopHeadlinesNews> {
final NewsRepository newsRepository;

GetTopHeadlinesNews({@required this.newsRepository});

@override
Future<Either<Failure, TopHeadlinesNewsResponseModel>> call(NoParams params) async {
return await newsRepository.getTopHeadlinesNews();
Future<Either<Failure, TopHeadlinesNewsResponseModel>> call(ParamsGetTopHeadlinesNews params) async {
return await newsRepository.getTopHeadlinesNews(params.category);
}
}

class ParamsGetTopHeadlinesNews extends Equatable {
final String category;

ParamsGetTopHeadlinesNews({@required this.category});

@override
List<Object> get props => [category];

@override
String toString() {
return 'ParamsGetTopHeadlinesNews{category: $category}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:flutter_news_app/core/error/failure.dart';
import 'package:flutter_news_app/core/usecase/usecase.dart';
import 'package:flutter_news_app/feature/domain/usecase/gettopheadlinesnews/get_top_headlines_news.dart';
import 'package:meta/meta.dart';

Expand All @@ -21,13 +20,13 @@ class TopHeadlinesNewsBloc extends Bloc<TopHeadlinesNewsEvent, TopHeadlinesNewsS
TopHeadlinesNewsEvent event,
) async* {
if (event is LoadTopHeadlinesNewsEvent) {
yield* _mapLoadTopHeadlinesNewsEventToState();
yield* _mapLoadTopHeadlinesNewsEventToState(event);
}
}

Stream<TopHeadlinesNewsState> _mapLoadTopHeadlinesNewsEventToState() async* {
Stream<TopHeadlinesNewsState> _mapLoadTopHeadlinesNewsEventToState(LoadTopHeadlinesNewsEvent event) async* {
yield LoadingTopHeadlinesNewsState();
var response = await getTopHeadlinesNews(NoParams());
var response = await getTopHeadlinesNews(ParamsGetTopHeadlinesNews(category: event.category));
yield response.fold(
// ignore: missing_return
(failure) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

abstract class TopHeadlinesNewsEvent extends Equatable {
const TopHeadlinesNewsEvent();
}

class LoadTopHeadlinesNewsEvent extends TopHeadlinesNewsEvent {
final String category;

LoadTopHeadlinesNewsEvent({@required this.category});

@override
List<Object> get props => [];
}
List<Object> get props => [category];

class LoadTopHeadlinesNewsEvent extends TopHeadlinesNewsEvent {}
@override
String toString() {
return 'LoadTopHeadlinesNewsEvent{category: $category}';
}
}
Loading