From 9431d18d2ea899ae6534dafb16835273aa2d7139 Mon Sep 17 00:00:00 2001 From: AmirrezaChegini Date: Thu, 2 Oct 2025 12:16:15 +0330 Subject: [PATCH] add: get question from database in question page --- lib/core/routers/my_routes.dart | 6 ++-- .../intro/presentation/bloc/intro_bloc.dart | 4 +-- .../ui/widgets/intro_loading_widget.dart | 1 - ...l_usecase.dart => get_levels_usecase.dart} | 4 +-- .../level/presentation/bloc/level_bloc.dart | 8 ++--- .../data/datasource/question_datasource.dart | 30 ++++++++++--------- .../question_repository_impl.dart | 6 ++-- .../repository/question_repository.dart | 4 +-- ...on_usecase.dart => get_level_usecase.dart} | 10 +++---- .../presentation/bloc/question_bloc.dart | 20 ++++++++----- .../presentation/bloc/question_event.dart | 6 +++- .../presentation/bloc/question_state.dart | 9 +++++- lib/init_bindings.dart | 8 ++--- 13 files changed, 66 insertions(+), 50 deletions(-) rename lib/features/level/domain/usecases/{get_level_usecase.dart => get_levels_usecase.dart} (83%) rename lib/features/question/domain/usecases/{get_question_usecase.dart => get_level_usecase.dart} (55%) diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index 9c1a3bb..7028c6d 100644 --- a/lib/core/routers/my_routes.dart +++ b/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/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_event.dart'; import 'package:hadi_hoda_flutter/features/question/presentation/ui/question_page.dart'; import 'package:hadi_hoda_flutter/init_bindings.dart'; @@ -52,11 +53,12 @@ GoRouter get appPages => GoRouter( ), ), GoRoute( - name: Routes.questionPage, path: '${Routes.questionPage}/:id', builder: (context, state) => BlocProvider( - create: (context) => QuestionBloc(locator()), + create: (context) => + QuestionBloc(locator()) + ..add(GetLevelEvent(state.pathParameters['id'])), child: const QuestionPage(), ), ), diff --git a/lib/features/intro/presentation/bloc/intro_bloc.dart b/lib/features/intro/presentation/bloc/intro_bloc.dart index 5a64c25..71db678 100644 --- a/lib/features/intro/presentation/bloc/intro_bloc.dart +++ b/lib/features/intro/presentation/bloc/intro_bloc.dart @@ -62,9 +62,7 @@ class IntroBloc extends Bloc { }, ); }, - (error) { - print(error.errorMessage); - }, + (error) {}, ); }, ); diff --git a/lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart b/lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart index 42cf086..fdd2223 100644 --- a/lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart +++ b/lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart @@ -38,7 +38,6 @@ class IntroLoadingWidget extends StatelessWidget { initialData: 0, stream: loadingStream, builder: (context, snapshot) { - print(snapshot.data); return Row( children: [ Expanded( diff --git a/lib/features/level/domain/usecases/get_level_usecase.dart b/lib/features/level/domain/usecases/get_levels_usecase.dart similarity index 83% rename from lib/features/level/domain/usecases/get_level_usecase.dart rename to lib/features/level/domain/usecases/get_levels_usecase.dart index f141d4c..3f12106 100644 --- a/lib/features/level/domain/usecases/get_level_usecase.dart +++ b/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/repository/level_repository.dart'; -class GetLevelUseCase implements UseCase, LevelParams> { +class GetLevelsUseCase implements UseCase, LevelParams> { final ILevelRepository repository; - const GetLevelUseCase(this.repository); + const GetLevelsUseCase(this.repository); @override Future, MyException>> call(LevelParams params) { diff --git a/lib/features/level/presentation/bloc/level_bloc.dart b/lib/features/level/presentation/bloc/level_bloc.dart index 20f9617..56f7da1 100644 --- a/lib/features/level/presentation/bloc/level_bloc.dart +++ b/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/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/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_state.dart'; class LevelBloc extends Bloc { /// ------------constructor------------ LevelBloc( - this._getLevelUseCase, + this._getLeveslUseCase, ) : super(const LevelState()) { on(_getLevelListEvent); on(_chooseLevelEvent); } /// ------------UseCases------------ - final GetLevelUseCase _getLevelUseCase; + final GetLevelsUseCase _getLeveslUseCase; /// ------------Variables------------ final List bottomLocationList = [ @@ -74,7 +74,7 @@ class LevelBloc extends Bloc { /// ------------Api Calls------------ FutureOr _getLevelListEvent(GetLevelListEvent event, Emitter emit) async { - await _getLevelUseCase(LevelParams()).then((value) { + await _getLeveslUseCase(LevelParams()).then((value) { value.fold( (data) { bottom8LevelList.addAll(data.take(8)); diff --git a/lib/features/question/data/datasource/question_datasource.dart b/lib/features/question/data/datasource/question_datasource.dart index 2142b93..cd05fe3 100644 --- a/lib/features/question/data/datasource/question_datasource.dart +++ b/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/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 { - Future getData({required QuestionParams params}); + Future getLevel({required QuestionParams params}); } class QuestionDatasourceImpl implements IQuestionDatasource { @@ -15,14 +15,16 @@ class QuestionDatasourceImpl implements IQuestionDatasource { const QuestionDatasourceImpl(this.httpRequest); @override - Future getData({required QuestionParams params}) async { - final response = await httpRequest.get( - path: MyApi.baseUrl, - ); - - return BaseResponse.getData( - response?['data'], - (json) => QuestionModel.fromJson(json), - ); + Future getLevel({required QuestionParams params}) async { + try { + final Box 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'); + } } } diff --git a/lib/features/question/data/repository_impl/question_repository_impl.dart b/lib/features/question/data/repository_impl/question_repository_impl.dart index af5a1c6..ffdf456 100644 --- a/lib/features/question/data/repository_impl/question_repository_impl.dart +++ b/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: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/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/domain/entity/question_entity.dart'; import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart'; class QuestionRepositoryImpl implements IQuestionRepository { @@ -12,9 +12,9 @@ class QuestionRepositoryImpl implements IQuestionRepository { const QuestionRepositoryImpl(this.datasource); @override - Future> getData({required QuestionParams params}) async { + Future> getLevel({required QuestionParams params}) async { try { - final QuestionEntity response = await datasource.getData(params: params); + final LevelEntity response = await datasource.getLevel(params: params); return DataState.success(response); } on MyException catch (e) { return DataState.error(e); diff --git a/lib/features/question/domain/repository/question_repository.dart b/lib/features/question/domain/repository/question_repository.dart index 3c9e008..9c2fd60 100644 --- a/lib/features/question/domain/repository/question_repository.dart +++ b/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/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'; +import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; abstract class IQuestionRepository { - Future> getData({required QuestionParams params}); + Future> getLevel({required QuestionParams params}); } diff --git a/lib/features/question/domain/usecases/get_question_usecase.dart b/lib/features/question/domain/usecases/get_level_usecase.dart similarity index 55% rename from lib/features/question/domain/usecases/get_question_usecase.dart rename to lib/features/question/domain/usecases/get_level_usecase.dart index 697534b..4310bdf 100644 --- a/lib/features/question/domain/usecases/get_question_usecase.dart +++ b/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/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/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart'; -class GetQuestionUseCase implements UseCase { +class GetLevelUseCase implements UseCase { final IQuestionRepository repository; - const GetQuestionUseCase(this.repository); + const GetLevelUseCase(this.repository); @override - Future> call(QuestionParams params) { - return repository.getData(params: params); + Future> call(QuestionParams params) { + return repository.getLevel(params: params); } } diff --git a/lib/features/question/presentation/bloc/question_bloc.dart b/lib/features/question/presentation/bloc/question_bloc.dart index 92706ac..ad63918 100644 --- a/lib/features/question/presentation/bloc/question_bloc.dart +++ b/lib/features/question/presentation/bloc/question_bloc.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:bloc/bloc.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/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_state.dart'; import 'package:showcaseview/showcaseview.dart'; @@ -11,13 +11,13 @@ import 'package:showcaseview/showcaseview.dart'; class QuestionBloc extends Bloc { /// ------------constructor------------ QuestionBloc( - this._getQuestionUseCase, + this._getLevelUseCase, ) : super(const QuestionState()) { - on(_getQuestionEvent); + on(_getLevelEvent); } /// ------------UseCases------------ - final GetQuestionUseCase _getQuestionUseCase; + final GetLevelUseCase _getLevelUseCase; /// ------------Variables------------ final List keys = [ @@ -27,6 +27,7 @@ class QuestionBloc extends Bloc { GlobalKey(), ]; + /// ------------Controllers------------ /// ------------Functions------------ @@ -35,12 +36,15 @@ class QuestionBloc extends Bloc { } /// ------------Api Calls------------ - FutureOr _getQuestionEvent(event, emit) async { - await _getQuestionUseCase(event.questionParams).then( + FutureOr _getLevelEvent(GetLevelEvent event, Emitter emit) async { + await _getLevelUseCase(QuestionParams(id: int.parse(event.id ?? '0'))).then( (value) { value.fold( (data) { - emit(state.copyWith(getQuestionStatus: BaseComplete(data))); + emit(state.copyWith( + getQuestionStatus: BaseComplete(''), + levelEntity: data, + )); }, (error) { emit(state.copyWith(getQuestionStatus: BaseError(error.errorMessage))); diff --git a/lib/features/question/presentation/bloc/question_event.dart b/lib/features/question/presentation/bloc/question_event.dart index b4c4b21..f82b6f9 100644 --- a/lib/features/question/presentation/bloc/question_event.dart +++ b/lib/features/question/presentation/bloc/question_event.dart @@ -2,4 +2,8 @@ sealed class QuestionEvent { const QuestionEvent(); } -class GetQuestionEvent extends QuestionEvent {} +class GetLevelEvent extends QuestionEvent { + final String? id; + + const GetLevelEvent(this.id); +} diff --git a/lib/features/question/presentation/bloc/question_state.dart b/lib/features/question/presentation/bloc/question_state.dart index 3c1b18f..f44e642 100644 --- a/lib/features/question/presentation/bloc/question_state.dart +++ b/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/features/level/domain/entity/level_entity.dart'; class QuestionState { final BaseStatus getQuestionStatus; + final LevelEntity? levelEntity; - const QuestionState({this.getQuestionStatus = const BaseInit()}); + const QuestionState({ + this.getQuestionStatus = const BaseInit(), + this.levelEntity, + }); QuestionState copyWith({ BaseStatus? getQuestionStatus, + LevelEntity? levelEntity, }) { return QuestionState( getQuestionStatus: getQuestionStatus ?? this.getQuestionStatus, + levelEntity: levelEntity ?? this.levelEntity, ); } } diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index a51866f..11a4ef3 100644 --- a/lib/init_bindings.dart +++ b/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/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/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/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/file_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/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/repository_impl/sample_repository_impl.dart'; import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart'; @@ -59,12 +59,12 @@ void initBindings() { /// Question Feature locator.registerLazySingleton(() => QuestionDatasourceImpl(locator())); locator.registerLazySingleton(() => QuestionRepositoryImpl(locator())); - locator.registerLazySingleton(() => GetQuestionUseCase(locator())); + locator.registerLazySingleton(() => GetLevelUseCase(locator())); /// Level Feature locator.registerLazySingleton(() => LocalLevelDatasourceImpl()); locator.registerLazySingleton(() => LevelRepositoryImpl(locator())); - locator.registerLazySingleton(() => GetLevelUseCase(locator())); + locator.registerLazySingleton(() => GetLevelsUseCase(locator())); } Future initDataBase() async {