Browse Source

add: question base feature

pull/7/head
AmirrezaChegini 2 weeks ago
parent
commit
471232acc5
  1. 13
      lib/core/params/question_params.dart
  2. 28
      lib/features/question/data/datasource/question_datasource.dart
  3. 13
      lib/features/question/data/model/question_model.dart
  4. 29
      lib/features/question/data/repository_impl/question_repository_impl.dart
  5. 14
      lib/features/question/domain/entity/question_entity.dart
  6. 8
      lib/features/question/domain/repository/question_repository.dart
  7. 17
      lib/features/question/domain/usecases/get_question_usecase.dart
  8. 41
      lib/features/question/presentation/bloc/question_bloc.dart
  9. 5
      lib/features/question/presentation/bloc/question_event.dart
  10. 15
      lib/features/question/presentation/bloc/question_state.dart
  11. 10
      lib/features/question/presentation/ui/question_page.dart
  12. 9
      lib/init_bindings.dart

13
lib/core/params/question_params.dart

@ -0,0 +1,13 @@
class QuestionParams {
int? id;
QuestionParams({this.id});
QuestionParams copyWith({
int? id,
}) {
return QuestionParams(
id: id ?? this.id,
);
}
}

28
lib/features/question/data/datasource/question_datasource.dart

@ -0,0 +1,28 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.dart';
import 'package:hadi_hoda_flutter/core/network/http_request.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/response/base_response.dart';
import 'package:hadi_hoda_flutter/features/question/data/model/question_model.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
abstract class IQuestionDatasource {
Future<QuestionEntity> getData({required QuestionParams params});
}
class QuestionDatasourceImpl implements IQuestionDatasource {
final IHttpRequest httpRequest;
const QuestionDatasourceImpl(this.httpRequest);
@override
Future<QuestionEntity> getData({required QuestionParams params}) async {
final response = await httpRequest.get(
path: MyApi.baseUrl,
);
return BaseResponse.getData<QuestionEntity>(
response?['data'],
(json) => QuestionModel.fromJson(json),
);
}
}

13
lib/features/question/data/model/question_model.dart

@ -0,0 +1,13 @@
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
class QuestionModel extends QuestionEntity {
const QuestionModel({
super.id,
});
factory QuestionModel.fromJson(Map<String, dynamic> json) {
return QuestionModel(
id: json['id'],
);
}
}

29
lib/features/question/data/repository_impl/question_repository_impl.dart

@ -0,0 +1,29 @@
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:flutter/foundation.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class QuestionRepositoryImpl implements IQuestionRepository {
final IQuestionDatasource datasource;
const QuestionRepositoryImpl(this.datasource);
@override
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params}) async {
try {
final QuestionEntity response = await datasource.getData(params: params);
return DataState.success(response);
} on MyException catch (e) {
return DataState.error(e);
} catch (e) {
if (kDebugMode) {
rethrow;
} else {
return DataState.error(MyException(errorMessage: '$e'));
}
}
}
}

14
lib/features/question/domain/entity/question_entity.dart

@ -0,0 +1,14 @@
import 'package:equatable/equatable.dart';
class QuestionEntity extends Equatable {
final int? id;
const QuestionEntity({
this.id,
});
@override
List<Object?> get props => [
id,
];
}

8
lib/features/question/domain/repository/question_repository.dart

@ -0,0 +1,8 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
abstract class IQuestionRepository {
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params});
}

17
lib/features/question/domain/usecases/get_question_usecase.dart

@ -0,0 +1,17 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/usecase/usecase.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class GetQuestionUseCase implements UseCase<QuestionEntity, QuestionParams> {
final IQuestionRepository repository;
const GetQuestionUseCase(this.repository);
@override
Future<DataState<QuestionEntity, MyException>> call(QuestionParams params) {
return repository.getData(params: params);
}
}

41
lib/features/question/presentation/bloc/question_bloc.dart

@ -0,0 +1,41 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_question_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_event.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_state.dart';
class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
/// ------------constructor------------
QuestionBloc(
this._getQuestionUseCase,
) : super(const QuestionState()) {
on<GetQuestionEvent>(_getQuestionEvent);
}
/// ------------UseCases------------
final GetQuestionUseCase _getQuestionUseCase;
/// ------------Variables------------
/// ------------Controllers------------
/// ------------Functions------------
/// ------------Api Calls------------
FutureOr<void> _getQuestionEvent(event, emit) async {
await _getQuestionUseCase(event.questionParams).then(
(value) {
value.fold(
(data) {
emit(state.copyWith(getQuestionStatus: BaseComplete<QuestionEntity>(data)));
},
(error) {
emit(state.copyWith(getQuestionStatus: BaseError(error.errorMessage)));
},
);
},
);
}
}

5
lib/features/question/presentation/bloc/question_event.dart

@ -0,0 +1,5 @@
sealed class QuestionEvent {
const QuestionEvent();
}
class GetQuestionEvent extends QuestionEvent {}

15
lib/features/question/presentation/bloc/question_state.dart

@ -0,0 +1,15 @@
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
class QuestionState {
final BaseStatus getQuestionStatus;
const QuestionState({this.getQuestionStatus = const BaseInit()});
QuestionState copyWith({
BaseStatus? getQuestionStatus,
}) {
return QuestionState(
getQuestionStatus: getQuestionStatus ?? this.getQuestionStatus,
);
}
}

10
lib/features/question/presentation/ui/question_page.dart

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class QuestionPage extends StatelessWidget {
const QuestionPage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold();
}
}

9
lib/init_bindings.dart

@ -4,6 +4,10 @@ import 'package:hadi_hoda_flutter/features/intro/data/datasource/intro_datasourc
import 'package:hadi_hoda_flutter/features/intro/data/repository_impl/intro_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_intro_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.dart';
import 'package:hadi_hoda_flutter/features/question/data/repository_impl/question_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_question_usecase.dart';
import 'package:hadi_hoda_flutter/features/sample/data/datasource/sample_datasource.dart';
import 'package:hadi_hoda_flutter/features/sample/data/repository_impl/sample_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart';
@ -25,4 +29,9 @@ void initBindings() {
locator.registerLazySingleton<IIntroDatasource>(() => IntroDatasourceImpl(locator()));
locator.registerLazySingleton<IIntroRepository>(() => IntroRepositoryImpl(locator()));
locator.registerLazySingleton<GetIntroUseCase>(() => GetIntroUseCase(locator()));
/// Question Feature
locator.registerLazySingleton<IQuestionDatasource>(() => QuestionDatasourceImpl(locator()));
locator.registerLazySingleton<IQuestionRepository>(() => QuestionRepositoryImpl(locator()));
locator.registerLazySingleton<GetQuestionUseCase>(() => GetQuestionUseCase(locator()));
}
Loading…
Cancel
Save