diff --git a/lib/core/params/language_params.dart b/lib/core/params/language_params.dart new file mode 100644 index 0000000..d44664b --- /dev/null +++ b/lib/core/params/language_params.dart @@ -0,0 +1,13 @@ +class LanguageParams { + int? id; + + LanguageParams({this.id}); + + LanguageParams copyWith({ + int? id, + }) { + return LanguageParams( + id: id ?? this.id, + ); + } +} diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index e7781c5..38b8191 100644 --- a/lib/core/routers/my_routes.dart +++ b/lib/core/routers/my_routes.dart @@ -5,6 +5,8 @@ import 'package:hadi_hoda_flutter/features/home/presentation/bloc/home_bloc.dart import 'package:hadi_hoda_flutter/features/home/presentation/ui/home_page.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/intro_page.dart'; +import 'package:hadi_hoda_flutter/features/language/presentation/bloc/language_bloc.dart'; +import 'package:hadi_hoda_flutter/features/language/presentation/ui/language_page.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.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'; @@ -19,13 +21,14 @@ class Routes { factory Routes() => _i; static const String introPage = '/intro_page'; + static const String languagePage = '/language_page'; static const String homePage = '/home_page'; static const String questionPage = '/question_page'; static const String levelPage = '/level_page'; } GoRouter get appPages => GoRouter( - initialLocation: Routes.introPage, + initialLocation: Routes.languagePage, navigatorKey: ContextProvider.navigatorKey, routes: [ GoRoute( @@ -36,6 +39,14 @@ GoRouter get appPages => GoRouter( child: const IntroPage(), ), ), + GoRoute( + name: Routes.languagePage, + path: Routes.languagePage, + builder: (context, state) => BlocProvider( + create: (context) => LanguageBloc(locator()), + child: const LanguagePage(), + ), + ), GoRoute( name: Routes.homePage, path: Routes.homePage, diff --git a/lib/features/language/data/datasource/language_datasource.dart b/lib/features/language/data/datasource/language_datasource.dart new file mode 100644 index 0000000..86a6e51 --- /dev/null +++ b/lib/features/language/data/datasource/language_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/language_params.dart'; +import 'package:hadi_hoda_flutter/core/response/base_response.dart'; +import 'package:hadi_hoda_flutter/features/language/data/model/language_model.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart'; + +abstract class ILanguageDatasource { + Future getData({required LanguageParams params}); +} + +class LanguageDatasourceImpl implements ILanguageDatasource { + final IHttpRequest httpRequest; + + const LanguageDatasourceImpl(this.httpRequest); + + @override + Future getData({required LanguageParams params}) async { + final response = await httpRequest.get( + path: MyApi.baseUrl, + ); + + return BaseResponse.getData( + response?['data'], + (json) => LanguageModel.fromJson(json), + ); + } +} diff --git a/lib/features/language/data/model/language_model.dart b/lib/features/language/data/model/language_model.dart new file mode 100644 index 0000000..17b73e0 --- /dev/null +++ b/lib/features/language/data/model/language_model.dart @@ -0,0 +1,13 @@ +import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart'; + +class LanguageModel extends LanguageEntity { + const LanguageModel({ + super.id, + }); + + factory LanguageModel.fromJson(Map json) { + return LanguageModel( + id: json['id'], + ); + } +} diff --git a/lib/features/language/data/repository_impl/language_repository_impl.dart b/lib/features/language/data/repository_impl/language_repository_impl.dart new file mode 100644 index 0000000..64165a1 --- /dev/null +++ b/lib/features/language/data/repository_impl/language_repository_impl.dart @@ -0,0 +1,29 @@ +import 'package:hadi_hoda_flutter/core/params/language_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/language/data/datasource/language_datasource.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart'; + +class LanguageRepositoryImpl implements ILanguageRepository { + final ILanguageDatasource datasource; + + const LanguageRepositoryImpl(this.datasource); + + @override + Future> getData({required LanguageParams params}) async { + try { + final LanguageEntity 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')); + } + } + } +} diff --git a/lib/features/language/domain/entity/language_entity.dart b/lib/features/language/domain/entity/language_entity.dart new file mode 100644 index 0000000..12fdd5a --- /dev/null +++ b/lib/features/language/domain/entity/language_entity.dart @@ -0,0 +1,14 @@ +import 'package:equatable/equatable.dart'; + +class LanguageEntity extends Equatable { + final int? id; + + const LanguageEntity({ + this.id, + }); + + @override + List get props => [ + id, + ]; +} diff --git a/lib/features/language/domain/repository/language_repository.dart b/lib/features/language/domain/repository/language_repository.dart new file mode 100644 index 0000000..286e8cd --- /dev/null +++ b/lib/features/language/domain/repository/language_repository.dart @@ -0,0 +1,8 @@ +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; +import 'package:hadi_hoda_flutter/core/params/language_params.dart'; +import 'package:hadi_hoda_flutter/core/utils/data_state.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart'; + +abstract class ILanguageRepository { + Future> getData({required LanguageParams params}); +} diff --git a/lib/features/language/domain/usecases/get_language_usecase.dart b/lib/features/language/domain/usecases/get_language_usecase.dart new file mode 100644 index 0000000..ca3141e --- /dev/null +++ b/lib/features/language/domain/usecases/get_language_usecase.dart @@ -0,0 +1,17 @@ +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; +import 'package:hadi_hoda_flutter/core/params/language_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/language/domain/entity/language_entity.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart'; + +class GetLanguageUseCase implements UseCase { + final ILanguageRepository repository; + + const GetLanguageUseCase(this.repository); + + @override + Future> call(LanguageParams params) { + return repository.getData(params: params); + } +} diff --git a/lib/features/language/presentation/bloc/language_bloc.dart b/lib/features/language/presentation/bloc/language_bloc.dart new file mode 100644 index 0000000..4810ce8 --- /dev/null +++ b/lib/features/language/presentation/bloc/language_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/language/domain/entity/language_entity.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/usecases/get_language_usecase.dart'; +import 'package:hadi_hoda_flutter/features/language/presentation/bloc/language_event.dart'; +import 'package:hadi_hoda_flutter/features/language/presentation/bloc/language_state.dart'; + +class LanguageBloc extends Bloc { + /// ------------constructor------------ + LanguageBloc( + this._getLanguageUseCase, + ) : super(const LanguageState()) { + on(_getLanguageEvent); + } + + /// ------------UseCases------------ + final GetLanguageUseCase _getLanguageUseCase; + + /// ------------Variables------------ + + /// ------------Controllers------------ + + /// ------------Functions------------ + + /// ------------Api Calls------------ + FutureOr _getLanguageEvent(event, emit) async { + await _getLanguageUseCase(event.languageParams).then( + (value) { + value.fold( + (data) { + emit(state.copyWith(getLanguageStatus: BaseComplete(data))); + }, + (error) { + emit(state.copyWith(getLanguageStatus: BaseError(error.errorMessage))); + }, + ); + }, + ); + } +} diff --git a/lib/features/language/presentation/bloc/language_event.dart b/lib/features/language/presentation/bloc/language_event.dart new file mode 100644 index 0000000..418d6c0 --- /dev/null +++ b/lib/features/language/presentation/bloc/language_event.dart @@ -0,0 +1,5 @@ +sealed class LanguageEvent { + const LanguageEvent(); +} + +class GetLanguageEvent extends LanguageEvent {} diff --git a/lib/features/language/presentation/bloc/language_state.dart b/lib/features/language/presentation/bloc/language_state.dart new file mode 100644 index 0000000..033d817 --- /dev/null +++ b/lib/features/language/presentation/bloc/language_state.dart @@ -0,0 +1,15 @@ +import 'package:hadi_hoda_flutter/core/status/base_status.dart'; + +class LanguageState { + final BaseStatus getLanguageStatus; + + const LanguageState({this.getLanguageStatus = const BaseInit()}); + + LanguageState copyWith({ + BaseStatus? getLanguageStatus, + }) { + return LanguageState( + getLanguageStatus: getLanguageStatus ?? this.getLanguageStatus, + ); + } +} diff --git a/lib/features/language/presentation/ui/language_page.dart b/lib/features/language/presentation/ui/language_page.dart new file mode 100644 index 0000000..1d4abd1 --- /dev/null +++ b/lib/features/language/presentation/ui/language_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class LanguagePage extends StatelessWidget { + const LanguagePage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold(); + } +} diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index c8c7a8c..8186a38 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -12,6 +12,10 @@ import 'package:hadi_hoda_flutter/features/intro/data/repository_impl/intro_repo import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart'; import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_files_usecase.dart'; import 'package:hadi_hoda_flutter/features/intro/domain/usecases/loading_stream_usecase.dart'; +import 'package:hadi_hoda_flutter/features/language/data/datasource/language_datasource.dart'; +import 'package:hadi_hoda_flutter/features/language/data/repository_impl/language_repository_impl.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart'; +import 'package:hadi_hoda_flutter/features/language/domain/usecases/get_language_usecase.dart'; import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasource.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'; @@ -49,6 +53,11 @@ void initBindings() { locator.registerLazySingleton(() => GetFilesUseCase(locator())); locator.registerLazySingleton(() => LoadingStreamUseCase(locator())); + /// Language Feature + locator.registerLazySingleton(() => LanguageDatasourceImpl(locator())); + locator.registerLazySingleton(() => LanguageRepositoryImpl(locator())); + locator.registerLazySingleton(() => GetLanguageUseCase(locator())); + /// Home Feature locator.registerLazySingleton(() => HomeDatasourceImpl(locator())); locator.registerLazySingleton(() => HomeRepositoryImpl(locator()));