Browse Source

add: get question from database in question page

pull/10/head
AmirrezaChegini 7 days ago
parent
commit
9431d18d2e
  1. 6
      lib/core/routers/my_routes.dart
  2. 4
      lib/features/intro/presentation/bloc/intro_bloc.dart
  3. 1
      lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart
  4. 4
      lib/features/level/domain/usecases/get_levels_usecase.dart
  5. 8
      lib/features/level/presentation/bloc/level_bloc.dart
  6. 30
      lib/features/question/data/datasource/question_datasource.dart
  7. 6
      lib/features/question/data/repository_impl/question_repository_impl.dart
  8. 4
      lib/features/question/domain/repository/question_repository.dart
  9. 10
      lib/features/question/domain/usecases/get_level_usecase.dart
  10. 20
      lib/features/question/presentation/bloc/question_bloc.dart
  11. 6
      lib/features/question/presentation/bloc/question_event.dart
  12. 9
      lib/features/question/presentation/bloc/question_state.dart
  13. 8
      lib/init_bindings.dart

6
lib/core/routers/my_routes.dart

@ -9,6 +9,7 @@ import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.da
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/ui/level_page.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/ui/level_page.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_bloc.dart'; import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_bloc.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_event.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/ui/question_page.dart'; import 'package:hadi_hoda_flutter/features/question/presentation/ui/question_page.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart'; import 'package:hadi_hoda_flutter/init_bindings.dart';
@ -52,11 +53,12 @@ GoRouter get appPages => GoRouter(
), ),
), ),
GoRoute( GoRoute(
name: Routes.questionPage, name: Routes.questionPage,
path: '${Routes.questionPage}/:id', path: '${Routes.questionPage}/:id',
builder: (context, state) => BlocProvider( builder: (context, state) => BlocProvider(
create: (context) => QuestionBloc(locator()),
create: (context) =>
QuestionBloc(locator())
..add(GetLevelEvent(state.pathParameters['id'])),
child: const QuestionPage(), child: const QuestionPage(),
), ),
), ),

4
lib/features/intro/presentation/bloc/intro_bloc.dart

@ -62,9 +62,7 @@ class IntroBloc extends Bloc<IntroEvent, IntroState> {
}, },
); );
}, },
(error) {
print(error.errorMessage);
},
(error) {},
); );
}, },
); );

1
lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart

@ -38,7 +38,6 @@ class IntroLoadingWidget extends StatelessWidget {
initialData: 0, initialData: 0,
stream: loadingStream, stream: loadingStream,
builder: (context, snapshot) { builder: (context, snapshot) {
print(snapshot.data);
return Row( return Row(
children: [ children: [
Expanded( Expanded(

4
lib/features/level/domain/usecases/get_level_usecase.dart → lib/features/level/domain/usecases/get_levels_usecase.dart

@ -5,10 +5,10 @@ import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart'; import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
class GetLevelUseCase implements UseCase<List<LevelEntity>, LevelParams> {
class GetLevelsUseCase implements UseCase<List<LevelEntity>, LevelParams> {
final ILevelRepository repository; final ILevelRepository repository;
const GetLevelUseCase(this.repository);
const GetLevelsUseCase(this.repository);
@override @override
Future<DataState<List<LevelEntity>, MyException>> call(LevelParams params) { Future<DataState<List<LevelEntity>, MyException>> call(LevelParams params) {

8
lib/features/level/presentation/bloc/level_bloc.dart

@ -7,21 +7,21 @@ import 'package:hadi_hoda_flutter/core/routers/my_routes.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart'; import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_location.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_location.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_levels_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_state.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_state.dart';
class LevelBloc extends Bloc<LevelEvent, LevelState> { class LevelBloc extends Bloc<LevelEvent, LevelState> {
/// ------------constructor------------ /// ------------constructor------------
LevelBloc( LevelBloc(
this._getLevelUseCase,
this._getLeveslUseCase,
) : super(const LevelState()) { ) : super(const LevelState()) {
on<GetLevelListEvent>(_getLevelListEvent); on<GetLevelListEvent>(_getLevelListEvent);
on<ChooseLevelEvent>(_chooseLevelEvent); on<ChooseLevelEvent>(_chooseLevelEvent);
} }
/// ------------UseCases------------ /// ------------UseCases------------
final GetLevelUseCase _getLevelUseCase;
final GetLevelsUseCase _getLeveslUseCase;
/// ------------Variables------------ /// ------------Variables------------
final List<LevelLocation> bottomLocationList = [ final List<LevelLocation> bottomLocationList = [
@ -74,7 +74,7 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
/// ------------Api Calls------------ /// ------------Api Calls------------
FutureOr<void> _getLevelListEvent(GetLevelListEvent event, FutureOr<void> _getLevelListEvent(GetLevelListEvent event,
Emitter<LevelState> emit) async { Emitter<LevelState> emit) async {
await _getLevelUseCase(LevelParams()).then((value) {
await _getLeveslUseCase(LevelParams()).then((value) {
value.fold( value.fold(
(data) { (data) {
bottom8LevelList.addAll(data.take(8)); bottom8LevelList.addAll(data.take(8));

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

@ -1,12 +1,12 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/network/http_request.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/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';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hive/hive.dart';
abstract class IQuestionDatasource { abstract class IQuestionDatasource {
Future<QuestionEntity> getData({required QuestionParams params});
Future<LevelEntity> getLevel({required QuestionParams params});
} }
class QuestionDatasourceImpl implements IQuestionDatasource { class QuestionDatasourceImpl implements IQuestionDatasource {
@ -15,14 +15,16 @@ class QuestionDatasourceImpl implements IQuestionDatasource {
const QuestionDatasourceImpl(this.httpRequest); const QuestionDatasourceImpl(this.httpRequest);
@override @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),
);
Future<LevelEntity> getLevel({required QuestionParams params}) async {
try {
final Box<LevelEntity> levelBox = Hive.box(MyConstants.levelBox);
final LevelEntity findLevel = levelBox.values.singleWhere(
(e) => e.id == params.id,
orElse: () => LevelEntity(),
);
return findLevel;
} catch (e) {
throw MyException(errorMessage: '$e');
}
} }
} }

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

@ -2,8 +2,8 @@ import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.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/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.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'; import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class QuestionRepositoryImpl implements IQuestionRepository { class QuestionRepositoryImpl implements IQuestionRepository {
@ -12,9 +12,9 @@ class QuestionRepositoryImpl implements IQuestionRepository {
const QuestionRepositoryImpl(this.datasource); const QuestionRepositoryImpl(this.datasource);
@override @override
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params}) async {
Future<DataState<LevelEntity, MyException>> getLevel({required QuestionParams params}) async {
try { try {
final QuestionEntity response = await datasource.getData(params: params);
final LevelEntity response = await datasource.getLevel(params: params);
return DataState.success(response); return DataState.success(response);
} on MyException catch (e) { } on MyException catch (e) {
return DataState.error(e); return DataState.error(e);

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

@ -1,8 +1,8 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; 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/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.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/level/domain/entity/level_entity.dart';
abstract class IQuestionRepository { abstract class IQuestionRepository {
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params});
Future<DataState<LevelEntity, MyException>> getLevel({required QuestionParams params});
} }

10
lib/features/question/domain/usecases/get_question_usecase.dart → lib/features/question/domain/usecases/get_level_usecase.dart

@ -2,16 +2,16 @@ 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/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/usecase/usecase.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/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart'; import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class GetQuestionUseCase implements UseCase<QuestionEntity, QuestionParams> {
class GetLevelUseCase implements UseCase<LevelEntity, QuestionParams> {
final IQuestionRepository repository; final IQuestionRepository repository;
const GetQuestionUseCase(this.repository);
const GetLevelUseCase(this.repository);
@override @override
Future<DataState<QuestionEntity, MyException>> call(QuestionParams params) {
return repository.getData(params: params);
Future<DataState<LevelEntity, MyException>> call(QuestionParams params) {
return repository.getLevel(params: params);
} }
} }

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

@ -1,9 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.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/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_event.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'; import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_state.dart';
import 'package:showcaseview/showcaseview.dart'; import 'package:showcaseview/showcaseview.dart';
@ -11,13 +11,13 @@ import 'package:showcaseview/showcaseview.dart';
class QuestionBloc extends Bloc<QuestionEvent, QuestionState> { class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
/// ------------constructor------------ /// ------------constructor------------
QuestionBloc( QuestionBloc(
this._getQuestionUseCase,
this._getLevelUseCase,
) : super(const QuestionState()) { ) : super(const QuestionState()) {
on<GetQuestionEvent>(_getQuestionEvent);
on<GetLevelEvent>(_getLevelEvent);
} }
/// ------------UseCases------------ /// ------------UseCases------------
final GetQuestionUseCase _getQuestionUseCase;
final GetLevelUseCase _getLevelUseCase;
/// ------------Variables------------ /// ------------Variables------------
final List<GlobalKey> keys = [ final List<GlobalKey> keys = [
@ -27,6 +27,7 @@ class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
GlobalKey(), GlobalKey(),
]; ];
/// ------------Controllers------------ /// ------------Controllers------------
/// ------------Functions------------ /// ------------Functions------------
@ -35,12 +36,15 @@ class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
} }
/// ------------Api Calls------------ /// ------------Api Calls------------
FutureOr<void> _getQuestionEvent(event, emit) async {
await _getQuestionUseCase(event.questionParams).then(
FutureOr<void> _getLevelEvent(GetLevelEvent event, Emitter<QuestionState> emit) async {
await _getLevelUseCase(QuestionParams(id: int.parse(event.id ?? '0'))).then(
(value) { (value) {
value.fold( value.fold(
(data) { (data) {
emit(state.copyWith(getQuestionStatus: BaseComplete<QuestionEntity>(data)));
emit(state.copyWith(
getQuestionStatus: BaseComplete(''),
levelEntity: data,
));
}, },
(error) { (error) {
emit(state.copyWith(getQuestionStatus: BaseError(error.errorMessage))); emit(state.copyWith(getQuestionStatus: BaseError(error.errorMessage)));

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

@ -2,4 +2,8 @@ sealed class QuestionEvent {
const QuestionEvent(); const QuestionEvent();
} }
class GetQuestionEvent extends QuestionEvent {}
class GetLevelEvent extends QuestionEvent {
final String? id;
const GetLevelEvent(this.id);
}

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

@ -1,15 +1,22 @@
import 'package:hadi_hoda_flutter/core/status/base_status.dart'; import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
class QuestionState { class QuestionState {
final BaseStatus getQuestionStatus; final BaseStatus getQuestionStatus;
final LevelEntity? levelEntity;
const QuestionState({this.getQuestionStatus = const BaseInit()});
const QuestionState({
this.getQuestionStatus = const BaseInit(),
this.levelEntity,
});
QuestionState copyWith({ QuestionState copyWith({
BaseStatus? getQuestionStatus, BaseStatus? getQuestionStatus,
LevelEntity? levelEntity,
}) { }) {
return QuestionState( return QuestionState(
getQuestionStatus: getQuestionStatus ?? this.getQuestionStatus, getQuestionStatus: getQuestionStatus ?? this.getQuestionStatus,
levelEntity: levelEntity ?? this.levelEntity,
); );
} }
} }

8
lib/init_bindings.dart

@ -17,14 +17,14 @@ import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasourc
import 'package:hadi_hoda_flutter/features/level/data/repository_impl/level_repository_impl.dart'; import 'package:hadi_hoda_flutter/features/level/data/repository_impl/level_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart'; import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_levels_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.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/data/repository_impl/question_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/answer_entity.dart'; import 'package:hadi_hoda_flutter/features/question/domain/entity/answer_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/file_entity.dart'; import 'package:hadi_hoda_flutter/features/question/domain/entity/file_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.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'; 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/question/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/sample/data/datasource/sample_datasource.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/data/repository_impl/sample_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart'; import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart';
@ -59,12 +59,12 @@ void initBindings() {
/// Question Feature /// Question Feature
locator.registerLazySingleton<IQuestionDatasource>(() => QuestionDatasourceImpl(locator())); locator.registerLazySingleton<IQuestionDatasource>(() => QuestionDatasourceImpl(locator()));
locator.registerLazySingleton<IQuestionRepository>(() => QuestionRepositoryImpl(locator())); locator.registerLazySingleton<IQuestionRepository>(() => QuestionRepositoryImpl(locator()));
locator.registerLazySingleton<GetQuestionUseCase>(() => GetQuestionUseCase(locator()));
locator.registerLazySingleton<GetLevelUseCase>(() => GetLevelUseCase(locator()));
/// Level Feature /// Level Feature
locator.registerLazySingleton<ILevelDatasource>(() => LocalLevelDatasourceImpl()); locator.registerLazySingleton<ILevelDatasource>(() => LocalLevelDatasourceImpl());
locator.registerLazySingleton<ILevelRepository>(() => LevelRepositoryImpl(locator())); locator.registerLazySingleton<ILevelRepository>(() => LevelRepositoryImpl(locator()));
locator.registerLazySingleton<GetLevelUseCase>(() => GetLevelUseCase(locator()));
locator.registerLazySingleton<GetLevelsUseCase>(() => GetLevelsUseCase(locator()));
} }
Future<void> initDataBase() async { Future<void> initDataBase() async {

Loading…
Cancel
Save