diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index dd600e2..3665101 100644 --- a/lib/core/routers/my_routes.dart +++ b/lib/core/routers/my_routes.dart @@ -10,6 +10,8 @@ import 'package:shia_game_flutter/features/profile/presentation/binding/profile_ import 'package:shia_game_flutter/features/profile/presentation/ui/profile_page.dart'; import 'package:shia_game_flutter/features/sample/presentation/binding/sample_binding.dart'; import 'package:shia_game_flutter/features/sample/presentation/ui/sample_page.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/binding/battle_league_binding.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_league_page.dart'; import 'package:get/get.dart'; import 'package:shia_game_flutter/features/shop/presentation/binding/shop_binding.dart'; import 'package:shia_game_flutter/features/shop/presentation/ui/shop_page.dart'; @@ -26,6 +28,7 @@ class Routes { static const String shopPage = '/shop_page'; static const String awardsPage = '/awards_page'; static const String profilePage = '/profile_page'; + static const String battleLeaguePage = '/battle_league_page'; } List get appPages => [ @@ -66,4 +69,9 @@ List get appPages => [ ), ], ), + GetPage( + name: Routes.battleLeaguePage, + page: () => const BattleLeaguePage(), + binding: BattleLeagueBinding(), + ), ]; diff --git a/lib/features/battle_league/data/datasource/battle_league_datasource.dart b/lib/features/battle_league/data/datasource/battle_league_datasource.dart new file mode 100644 index 0000000..dce5a9c --- /dev/null +++ b/lib/features/battle_league/data/datasource/battle_league_datasource.dart @@ -0,0 +1,29 @@ +import 'package:shia_game_flutter/core/constants/my_api.dart'; +import 'package:shia_game_flutter/core/network/http_request.dart'; +import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/response/base_response.dart'; +import 'package:shia_game_flutter/features/battle_league/data/model/battle_league_model.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; + +abstract class IBattleLeagueDatasource { + Future getData({required SampleParams params}); +} + +class BattleLeagueDatasourceImpl implements IBattleLeagueDatasource { + final IHttpRequest httpRequest; + + const BattleLeagueDatasourceImpl(this.httpRequest); + + @override + Future getData({required SampleParams params}) async { + final response = await httpRequest.get( + path: MyApi.baseUrl, + ); + + return BaseResponse.getData( + response?['data'], + (json) => BattleLeagueModel.fromJson(json), + ); + } +} + diff --git a/lib/features/battle_league/data/model/battle_league_model.dart b/lib/features/battle_league/data/model/battle_league_model.dart new file mode 100644 index 0000000..ad9329c --- /dev/null +++ b/lib/features/battle_league/data/model/battle_league_model.dart @@ -0,0 +1,14 @@ +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; + +class BattleLeagueModel extends BattleLeagueEntity { + const BattleLeagueModel({ + super.id, + }); + + factory BattleLeagueModel.fromJson(Map json) { + return BattleLeagueModel( + id: json['id'], + ); + } +} + diff --git a/lib/features/battle_league/data/repository_impl/battle_league_repository_impl.dart b/lib/features/battle_league/data/repository_impl/battle_league_repository_impl.dart new file mode 100644 index 0000000..20d6668 --- /dev/null +++ b/lib/features/battle_league/data/repository_impl/battle_league_repository_impl.dart @@ -0,0 +1,30 @@ +import 'package:flutter/foundation.dart'; +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/battle_league/data/datasource/battle_league_datasource.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/repository/battle_league_repository.dart'; + +class BattleLeagueRepositoryImpl implements IBattleLeagueRepository { + final IBattleLeagueDatasource datasource; + + const BattleLeagueRepositoryImpl(this.datasource); + + @override + Future> getData({required SampleParams params}) async { + try { + final BattleLeagueEntity 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/battle_league/domain/entity/battle_league_entity.dart b/lib/features/battle_league/domain/entity/battle_league_entity.dart new file mode 100644 index 0000000..d532d4b --- /dev/null +++ b/lib/features/battle_league/domain/entity/battle_league_entity.dart @@ -0,0 +1,15 @@ +import 'package:equatable/equatable.dart'; + +class BattleLeagueEntity extends Equatable { + final int? id; + + const BattleLeagueEntity({ + this.id, + }); + + @override + List get props => [ + id, + ]; +} + diff --git a/lib/features/battle_league/domain/repository/battle_league_repository.dart b/lib/features/battle_league/domain/repository/battle_league_repository.dart new file mode 100644 index 0000000..9d7cc47 --- /dev/null +++ b/lib/features/battle_league/domain/repository/battle_league_repository.dart @@ -0,0 +1,9 @@ +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; + +abstract class IBattleLeagueRepository { + Future> getData({required SampleParams params}); +} + diff --git a/lib/features/battle_league/domain/usecases/get_battle_league_usecase.dart b/lib/features/battle_league/domain/usecases/get_battle_league_usecase.dart new file mode 100644 index 0000000..f69f6e7 --- /dev/null +++ b/lib/features/battle_league/domain/usecases/get_battle_league_usecase.dart @@ -0,0 +1,18 @@ +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/usecase/usecase.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/repository/battle_league_repository.dart'; + +class GetBattleLeagueUseCase implements UseCase { + final IBattleLeagueRepository repository; + + const GetBattleLeagueUseCase(this.repository); + + @override + Future> call(SampleParams params) { + return repository.getData(params: params); + } +} + diff --git a/lib/features/battle_league/presentation/binding/battle_league_binding.dart b/lib/features/battle_league/presentation/binding/battle_league_binding.dart new file mode 100644 index 0000000..7ab12a7 --- /dev/null +++ b/lib/features/battle_league/presentation/binding/battle_league_binding.dart @@ -0,0 +1,21 @@ +import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; +import 'package:get/get.dart'; + +class BattleLeagueBinding extends Bindings { + @override + void dependencies() { + Get.put(BattleLeagueController(Get.find())); + } + + Future deleteBindings() async { + await Future.wait([ + Get.delete(), + ]); + } + + Future refreshBinding() async { + await deleteBindings(); + dependencies(); + } +} + diff --git a/lib/features/battle_league/presentation/controller/battle_league_controller.dart b/lib/features/battle_league/presentation/controller/battle_league_controller.dart new file mode 100644 index 0000000..fd0db52 --- /dev/null +++ b/lib/features/battle_league/presentation/controller/battle_league_controller.dart @@ -0,0 +1,55 @@ +import 'package:flutter/cupertino.dart'; +import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/status/base_status.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/usecases/get_battle_league_usecase.dart'; +import 'package:get/get.dart'; + +class BattleLeagueController extends GetxController with StateMixin { + /// ----- Constructor ----- + BattleLeagueController(this.getBattleLeagueUseCase); + + @override + void onInit() { + super.onInit(); + change('', status: RxStatus.success()); + } + + @override + void onClose() { + textEditingController.dispose(); + super.onClose(); + } + + /// ----- UseCases ----- + final GetBattleLeagueUseCase getBattleLeagueUseCase; + + /// ----- Variables ----- + final Rx battleLeagueParams = Rx(SampleParams()); + final Rx battleLeagueEntity = Rx(const BattleLeagueEntity()); + + /// ------ Controllers ------ + final TextEditingController textEditingController = TextEditingController(); + + /// ------ Statuses ------ + final Rx getBattleLeagueStatus = Rx(const BaseInit()); + + /// ------ Functions ------ + + /// ------ Api Calls ------ + Future getBattleLeague() async { + change('', status: RxStatus.loading()); + await getBattleLeagueUseCase(battleLeagueParams.value).then( + (value) => value.fold( + (data) { + battleLeagueEntity.value = data; + change('', status: RxStatus.success()); + }, + (error) { + change('', status: RxStatus.error(error.errorMessage)); + }, + ), + ); + } +} + diff --git a/lib/features/battle_league/presentation/ui/battle_league_page.dart b/lib/features/battle_league/presentation/ui/battle_league_page.dart new file mode 100644 index 0000000..5f13dca --- /dev/null +++ b/lib/features/battle_league/presentation/ui/battle_league_page.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; +import 'package:get/get.dart'; + +class BattleLeaguePage extends GetView { + const BattleLeaguePage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold(); + } +} + diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index 0d703b9..213f6b3 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -25,6 +25,10 @@ import 'package:shia_game_flutter/features/sample/data/datasource/sample_datasou import 'package:shia_game_flutter/features/sample/data/repository_impl/sample_repository_impl.dart'; import 'package:shia_game_flutter/features/sample/domain/repository/sample_repository.dart'; import 'package:shia_game_flutter/features/sample/domain/usecases/get_sample_usecase.dart'; +import 'package:shia_game_flutter/features/battle_league/data/datasource/battle_league_datasource.dart'; +import 'package:shia_game_flutter/features/battle_league/data/repository_impl/battle_league_repository_impl.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/repository/battle_league_repository.dart'; +import 'package:shia_game_flutter/features/battle_league/domain/usecases/get_battle_league_usecase.dart'; import 'package:shia_game_flutter/features/shop/data/datasource/shop_datasource.dart'; import 'package:shia_game_flutter/features/shop/data/repository_impl/shop_repository_impl.dart'; import 'package:shia_game_flutter/features/shop/domain/repository/shop_repository.dart'; @@ -68,4 +72,9 @@ void initBindings() { Get.lazyPut(() => ProfileDatasourceImpl(Get.find()), fenix: true); Get.lazyPut(() => ProfileRepositoryImpl(Get.find()), fenix: true); Get.lazyPut(() => GetProfileUseCase(Get.find()), fenix: true); + + /// ----- BattleLeague Feature ----- + Get.lazyPut(() => BattleLeagueDatasourceImpl(Get.find())); + Get.lazyPut(() => BattleLeagueRepositoryImpl(Get.find())); + Get.lazyPut(() => GetBattleLeagueUseCase(Get.find())); }