Browse Source

add: master & home feature

pull/2/head
AmirrezaChegini 1 month ago
parent
commit
baf6309d4e
  1. 13
      lib/core/params/master_params.dart
  2. 4
      lib/core/routers/my_routes.dart
  3. 4
      lib/core/widgets/app_bar/master_app_bar.dart
  4. 4
      lib/core/widgets/bottom_nav_bar/bottom_nav_bar.dart
  5. 2
      lib/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_item.dart
  6. 2
      lib/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_profile_item.dart
  7. 2
      lib/features/awards/presentation/binding/awards_binding.dart
  8. 2
      lib/features/home/presentation/binding/home_binding.dart
  9. 27
      lib/features/home/presentation/controller/home_controller.dart
  10. 36
      lib/features/home/presentation/pages/home_page.dart
  11. 28
      lib/features/master/data/datasource/master_datasource.dart
  12. 13
      lib/features/master/data/model/master_model.dart
  13. 29
      lib/features/master/data/repository_impl/master_repository_impl.dart
  14. 5
      lib/features/master/domain/entity/bottom_nav_entity.dart
  15. 14
      lib/features/master/domain/entity/master_entity.dart
  16. 8
      lib/features/master/domain/repository/master_repository.dart
  17. 20
      lib/features/master/presentation/binding/master_binding.dart
  18. 85
      lib/features/master/presentation/controller/master_controller.dart
  19. 25
      lib/features/master/presentation/ui/master_page.dart
  20. 2
      lib/features/profile/presentation/binding/profile_binding.dart
  21. 2
      lib/features/shop/presentation/binding/shop_binding.dart
  22. 42
      lib/init_bindings.dart
  23. 2
      lib/main.dart

13
lib/core/params/master_params.dart

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

4
lib/core/routers/my_routes.dart

@ -48,21 +48,25 @@ List<GetPage> get appPages => [
name: Routes.homePage,
page: () => const HomePage(),
binding: HomeBinding(),
transition: Transition.fadeIn,
),
GetPage(
name: Routes.shopPage,
page: () => const ShopPage(),
binding: ShopBinding(),
transition: Transition.fadeIn,
),
GetPage(
name: Routes.awardsPage,
page: () => const AwardsPage(),
binding: AwardsBinding(),
transition: Transition.fadeIn,
),
GetPage(
name: Routes.profilePage,
page: () => const ProfilePage(),
binding: ProfileBinding(),
transition: Transition.fadeIn,
),
],
),

4
lib/core/widgets/app_bar/home_app_bar.dart → lib/core/widgets/app_bar/master_app_bar.dart

@ -6,8 +6,8 @@ import 'package:shia_game_flutter/core/utils/gap.dart';
import 'package:shia_game_flutter/core/widgets/app_bar/styles/app_bar_action.dart';
import 'package:shia_game_flutter/core/widgets/app_bar/styles/app_bar_add_widget.dart';
class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
const HomeAppBar({
class MasterAppBar extends StatelessWidget implements PreferredSizeWidget {
const MasterAppBar({
super.key,
});

4
lib/core/widgets/bottom_nav_bar/bottom_nav_bar.dart

@ -5,9 +5,9 @@ import 'package:shia_game_flutter/common_ui/resources/my_spaces.dart';
import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart';
import 'package:shia_game_flutter/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_item.dart';
import 'package:shia_game_flutter/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_profile_item.dart';
import 'package:shia_game_flutter/features/home/presentation/controller/home_controller.dart';
import 'package:shia_game_flutter/features/master/presentation/controller/master_controller.dart';
class BottomNavBar extends GetView<HomeController> {
class BottomNavBar extends GetView<MasterController> {
const BottomNavBar({super.key});
@override

2
lib/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_item.dart

@ -3,7 +3,7 @@ import 'package:shia_game_flutter/common_ui/resources/my_spaces.dart';
import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart';
import 'package:shia_game_flutter/core/utils/gap.dart';
import 'package:shia_game_flutter/core/widgets/image/my_image.dart';
import 'package:shia_game_flutter/features/home/domain/entity/bottom_nav_entity.dart';
import 'package:shia_game_flutter/features/master/domain/entity/bottom_nav_entity.dart';
class BottomNavBarItem extends StatelessWidget {
const BottomNavBarItem({super.key, required this.bottomNavEntity});

2
lib/core/widgets/bottom_nav_bar/styles/bottom_nav_bar_profile_item.dart

@ -3,7 +3,7 @@ import 'package:shia_game_flutter/common_ui/resources/my_spaces.dart';
import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart';
import 'package:shia_game_flutter/core/utils/gap.dart';
import 'package:shia_game_flutter/core/widgets/image/my_image.dart';
import 'package:shia_game_flutter/features/home/domain/entity/bottom_nav_entity.dart';
import 'package:shia_game_flutter/features/master/domain/entity/bottom_nav_entity.dart';
class BottomNavBarProfileItem extends StatelessWidget {
const BottomNavBarProfileItem({super.key, required this.bottomNavEntity});

2
lib/features/awards/presentation/binding/awards_binding.dart

@ -4,7 +4,7 @@ import 'package:get/get.dart';
class AwardsBinding extends Bindings {
@override
void dependencies() {
Get.put<AwardsController>(AwardsController(Get.find()));
Get.put<AwardsController>(AwardsController(Get.find()), permanent: true);
}
Future<void> deleteBindings() async {

2
lib/features/home/presentation/binding/home_binding.dart

@ -4,6 +4,6 @@ import 'package:get/get.dart';
class HomeBinding extends Bindings {
@override
void dependencies() {
Get.put<HomeController>(HomeController(Get.find()));
Get.put<HomeController>(HomeController(Get.find()), permanent: true);
}
}

27
lib/features/home/presentation/controller/home_controller.dart

@ -1,10 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:shia_game_flutter/common_ui/resources/my_assets.dart';
import 'package:shia_game_flutter/core/params/home_params.dart';
import 'package:shia_game_flutter/core/status/base_status.dart';
import 'package:shia_game_flutter/core/utils/my_localization.dart';
import 'package:shia_game_flutter/features/home/domain/entity/bottom_nav_entity.dart';
import 'package:shia_game_flutter/features/home/domain/entity/home_entity.dart';
import 'package:shia_game_flutter/features/home/domain/usecases/get_home_usecase.dart';
@ -30,27 +27,6 @@ class HomeController extends GetxController with StateMixin {
/// ----- Variables -----
final Rx<HomeParams> homeParams = Rx(HomeParams());
final Rx<HomeEntity> homeEntity = Rx(const HomeEntity());
final List<BottomNavEntity> bottomNavList = [
BottomNavEntity(
icon: MyAssets.iconHome,
title: Get.context?.translate.home,
),
BottomNavEntity(
icon: MyAssets.iconShop,
title: Get.context?.translate.shop,
),
BottomNavEntity(
icon: MyAssets.iconAwards,
title: Get.context?.translate.awards,
),
BottomNavEntity(
icon: MyAssets.iconProfile,
title: Get.context?.translate.profile,
),
];
final Rx<int> selectedIndex = Rx(0);
/// ------ Controllers ------
final TextEditingController textEditingController = TextEditingController();
@ -59,9 +35,6 @@ class HomeController extends GetxController with StateMixin {
final Rx<BaseStatus> getHomeStatus = Rx(const BaseInit());
/// ------ Functions ------
void onChangeBottomNavBar(int index) {
selectedIndex.value = index;
}
/// ------ Api Calls ------
Future<void> getHome() async {

36
lib/features/home/presentation/pages/home_page.dart

@ -2,10 +2,7 @@ import 'package:flutter/material.dart' hide BoxShadow, BoxDecoration;
import 'package:get/get.dart';
import 'package:shia_game_flutter/common_ui/resources/my_assets.dart';
import 'package:shia_game_flutter/common_ui/resources/my_spaces.dart';
import 'package:shia_game_flutter/common_ui/theme/my_theme.dart';
import 'package:shia_game_flutter/core/utils/gap.dart';
import 'package:shia_game_flutter/core/widgets/app_bar/home_app_bar.dart';
import 'package:shia_game_flutter/core/widgets/bottom_nav_bar/bottom_nav_bar.dart';
import 'package:shia_game_flutter/core/widgets/image/my_image.dart';
import 'package:shia_game_flutter/features/home/presentation/controller/home_controller.dart';
import 'package:shia_game_flutter/features/home/presentation/pages/widgets/home_battle_cast.dart';
@ -18,25 +15,20 @@ class HomePage extends GetView<HomeController> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: context.backgroundColor,
bottomNavigationBar: BottomNavBar(),
appBar: HomeAppBar(),
body: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: MySpaces.s32),
child: Column(
children: [
MySpaces.s28.gapHeight,
MyImage(asset: MyAssets.shiaMindGroup),
MySpaces.s40.gapHeight,
HomeMembership(),
HomeBattleLeague(),
MySpaces.s20.gapHeight,
_customWidgets(),
MySpaces.s20.gapHeight,
HomeBattleCast(),
],
),
return SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: MySpaces.s32),
child: Column(
children: [
MySpaces.s28.gapHeight,
MyImage(asset: MyAssets.shiaMindGroup),
MySpaces.s40.gapHeight,
HomeMembership(),
HomeBattleLeague(),
MySpaces.s20.gapHeight,
_customWidgets(),
MySpaces.s20.gapHeight,
HomeBattleCast(),
],
),
);
}

28
lib/features/master/data/datasource/master_datasource.dart

@ -0,0 +1,28 @@
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/master_params.dart';
import 'package:shia_game_flutter/core/response/base_response.dart';
import 'package:shia_game_flutter/features/master/data/model/master_model.dart';
import 'package:shia_game_flutter/features/master/domain/entity/master_entity.dart';
abstract class IMasterDatasource {
Future<MasterEntity> getData({required MasterParams params});
}
class MasterDatasourceImpl implements IMasterDatasource {
final IHttpRequest httpRequest;
const MasterDatasourceImpl(this.httpRequest);
@override
Future<MasterEntity> getData({required MasterParams params}) async {
final response = await httpRequest.get(
path: MyApi.baseUrl,
);
return BaseResponse.getData<MasterEntity>(
response?['data'],
(json) => MasterModel.fromJson(json),
);
}
}

13
lib/features/master/data/model/master_model.dart

@ -0,0 +1,13 @@
import 'package:shia_game_flutter/features/master/domain/entity/master_entity.dart';
class MasterModel extends MasterEntity {
const MasterModel({
super.id,
});
factory MasterModel.fromJson(Map<String, dynamic> json) {
return MasterModel(
id: json['id'],
);
}
}

29
lib/features/master/data/repository_impl/master_repository_impl.dart

@ -0,0 +1,29 @@
import 'package:flutter/foundation.dart';
import 'package:shia_game_flutter/core/error_handler/my_exception.dart';
import 'package:shia_game_flutter/core/params/master_params.dart';
import 'package:shia_game_flutter/core/utils/data_state.dart';
import 'package:shia_game_flutter/features/master/data/datasource/master_datasource.dart';
import 'package:shia_game_flutter/features/master/domain/entity/master_entity.dart';
import 'package:shia_game_flutter/features/master/domain/repository/master_repository.dart';
class MasterRepositoryImpl implements IMasterRepository {
final IMasterDatasource datasource;
const MasterRepositoryImpl(this.datasource);
@override
Future<DataState<MasterEntity, MyException>> getData({required MasterParams params}) async {
try {
final MasterEntity 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'));
}
}
}
}

5
lib/features/home/domain/entity/bottom_nav_entity.dart → lib/features/master/domain/entity/bottom_nav_entity.dart

@ -3,9 +3,10 @@ import 'package:equatable/equatable.dart';
class BottomNavEntity extends Equatable {
final String? icon;
final String? title;
final String? route;
const BottomNavEntity({this.icon, this.title});
const BottomNavEntity({this.icon, this.title, this.route});
@override
List<Object?> get props => [icon, title];
List<Object?> get props => [icon, title, route];
}

14
lib/features/master/domain/entity/master_entity.dart

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

8
lib/features/master/domain/repository/master_repository.dart

@ -0,0 +1,8 @@
import 'package:shia_game_flutter/core/error_handler/my_exception.dart';
import 'package:shia_game_flutter/core/params/master_params.dart';
import 'package:shia_game_flutter/core/utils/data_state.dart';
import 'package:shia_game_flutter/features/master/domain/entity/master_entity.dart';
abstract class IMasterRepository {
Future<DataState<MasterEntity, MyException>> getData({required MasterParams params});
}

20
lib/features/master/presentation/binding/master_binding.dart

@ -0,0 +1,20 @@
import 'package:shia_game_flutter/features/master/presentation/controller/master_controller.dart';
import 'package:get/get.dart';
class MasterBinding extends Bindings {
@override
void dependencies() {
Get.put<MasterController>(MasterController(Get.find()));
}
Future<void> deleteBindings() async {
await Future.wait([
Get.delete<MasterController>(),
]);
}
Future<void> refreshBinding() async {
await deleteBindings();
dependencies();
}
}

85
lib/features/master/presentation/controller/master_controller.dart

@ -0,0 +1,85 @@
import 'package:flutter/cupertino.dart';
import 'package:shia_game_flutter/common_ui/resources/my_assets.dart';
import 'package:shia_game_flutter/core/params/master_params.dart';
import 'package:shia_game_flutter/core/routers/my_routes.dart';
import 'package:shia_game_flutter/core/status/base_status.dart';
import 'package:shia_game_flutter/core/utils/my_localization.dart';
import 'package:shia_game_flutter/features/master/domain/entity/bottom_nav_entity.dart';
import 'package:shia_game_flutter/features/master/domain/entity/master_entity.dart';
import 'package:shia_game_flutter/features/master/domain/usecases/get_master_usecase.dart';
import 'package:get/get.dart';
class MasterController extends GetxController with StateMixin {
/// ----- Constructor -----
MasterController(this.getMasterUseCase);
@override
void onInit() {
super.onInit();
change('', status: RxStatus.success());
}
@override
void onClose() {
textEditingController.dispose();
super.onClose();
}
/// ----- UseCases -----
final GetMasterUseCase getMasterUseCase;
/// ----- Variables -----
final Rx<MasterParams> masterParams = Rx(MasterParams());
final Rx<MasterEntity> masterEntity = Rx(const MasterEntity());
final List<BottomNavEntity> bottomNavList = [
BottomNavEntity(
icon: MyAssets.iconHome,
title: Get.context?.translate.home,
route: Routes.homePage,
),
BottomNavEntity(
icon: MyAssets.iconShop,
title: Get.context?.translate.shop,
route: Routes.shopPage,
),
BottomNavEntity(
icon: MyAssets.iconAwards,
title: Get.context?.translate.awards,
route: Routes.awardsPage,
),
BottomNavEntity(
icon: MyAssets.iconProfile,
title: Get.context?.translate.profile,
route: Routes.profilePage,
),
];
final Rx<int> selectedIndex = Rx(0);
/// ------ Controllers ------
final TextEditingController textEditingController = TextEditingController();
/// ------ Statuses ------
final Rx<BaseStatus> getMasterStatus = Rx(const BaseInit());
/// ------ Functions ------
void onChangeBottomNavBar(int index) {
selectedIndex.value = index;
Get.rootDelegate.toNamed(bottomNavList[index].route ?? '');
}
/// ------ Api Calls ------
Future<void> getMaster() async {
change('', status: RxStatus.loading());
await getMasterUseCase(masterParams.value).then(
(value) => value.fold(
(data) {
masterEntity.value = data;
change('', status: RxStatus.success());
},
(error) {
change('', status: RxStatus.error(error.errorMessage));
},
),
);
}
}

25
lib/features/master/presentation/ui/master_page.dart

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:shia_game_flutter/common_ui/theme/my_theme.dart';
import 'package:shia_game_flutter/core/routers/my_routes.dart';
import 'package:shia_game_flutter/core/widgets/app_bar/master_app_bar.dart';
import 'package:shia_game_flutter/core/widgets/bottom_nav_bar/bottom_nav_bar.dart';
import 'package:shia_game_flutter/features/master/presentation/controller/master_controller.dart';
import 'package:get/get.dart';
class MasterPage extends GetView<MasterController> {
const MasterPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: context.backgroundColor,
appBar: MasterAppBar(),
bottomNavigationBar: BottomNavBar(),
body: GetRouterOutlet(
initialRoute: Routes.homePage,
anchorRoute: Routes.masterPage,
delegate: Get.rootDelegate,
),
);
}
}

2
lib/features/profile/presentation/binding/profile_binding.dart

@ -4,7 +4,7 @@ import 'package:get/get.dart';
class ProfileBinding extends Bindings {
@override
void dependencies() {
Get.put<ProfileController>(ProfileController(Get.find()));
Get.put<ProfileController>(ProfileController(Get.find()), permanent: true);
}
Future<void> deleteBindings() async {

2
lib/features/shop/presentation/binding/shop_binding.dart

@ -4,7 +4,7 @@ import 'package:get/get.dart';
class ShopBinding extends Bindings {
@override
void dependencies() {
Get.put<ShopController>(ShopController(Get.find()));
Get.put<ShopController>(ShopController(Get.find()), permanent: true);
}
Future<void> deleteBindings() async {

42
lib/init_bindings.dart

@ -1,6 +1,10 @@
import 'package:get/get.dart';
import 'package:shia_game_flutter/core/network/http_request.dart';
import 'package:shia_game_flutter/core/network/http_request_impl.dart';
import 'package:shia_game_flutter/features/awards/data/datasource/awards_datasource.dart';
import 'package:shia_game_flutter/features/awards/data/repository_impl/awards_repository_impl.dart';
import 'package:shia_game_flutter/features/awards/domain/repository/awards_repository.dart';
import 'package:shia_game_flutter/features/awards/domain/usecases/get_awards_usecase.dart';
import 'package:shia_game_flutter/features/home/data/datasource/home_datasource.dart';
import 'package:shia_game_flutter/features/home/data/repository_impl/home_repository_impl.dart';
import 'package:shia_game_flutter/features/home/domain/repository/home_repository.dart';
@ -9,10 +13,22 @@ import 'package:shia_game_flutter/features/intro/data/datasource/intro_datasourc
import 'package:shia_game_flutter/features/intro/data/repository_impl/intro_repository_impl.dart';
import 'package:shia_game_flutter/features/intro/domain/repository/intro_repository.dart';
import 'package:shia_game_flutter/features/intro/domain/usecases/get_intro_usecase.dart';
import 'package:shia_game_flutter/features/master/data/datasource/master_datasource.dart';
import 'package:shia_game_flutter/features/master/data/repository_impl/master_repository_impl.dart';
import 'package:shia_game_flutter/features/master/domain/repository/master_repository.dart';
import 'package:shia_game_flutter/features/master/domain/usecases/get_master_usecase.dart';
import 'package:shia_game_flutter/features/profile/data/datasource/profile_datasource.dart';
import 'package:shia_game_flutter/features/profile/data/repository_impl/profile_repository_impl.dart';
import 'package:shia_game_flutter/features/profile/domain/repository/profile_repository.dart';
import 'package:shia_game_flutter/features/profile/domain/usecases/get_profile_usecase.dart';
import 'package:shia_game_flutter/features/sample/data/datasource/sample_datasource.dart';
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/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';
import 'package:shia_game_flutter/features/shop/domain/usecases/get_shop_usecase.dart';
void initBindings() {
/// ----- Classes -----
@ -28,8 +44,28 @@ void initBindings() {
Get.lazyPut<IIntroRepository>(() => IntroRepositoryImpl(Get.find()));
Get.lazyPut<GetIntroUseCase>(() => GetIntroUseCase(Get.find()));
/// ----- Master Feature -----
Get.lazyPut<IMasterDatasource>(() => MasterDatasourceImpl(Get.find()));
Get.lazyPut<IMasterRepository>(() => MasterRepositoryImpl(Get.find()));
Get.lazyPut<GetMasterUseCase>(() => GetMasterUseCase(Get.find()));
/// ----- Home Feature -----
Get.lazyPut<IHomeDatasource>(() => HomeDatasourceImpl(Get.find()));
Get.lazyPut<IHomeRepository>(() => HomeRepositoryImpl(Get.find()));
Get.lazyPut<GetHomeUseCase>(() => GetHomeUseCase(Get.find()));
Get.lazyPut<IHomeDatasource>(() => HomeDatasourceImpl(Get.find()), fenix: true);
Get.lazyPut<IHomeRepository>(() => HomeRepositoryImpl(Get.find()), fenix: true);
Get.lazyPut<GetHomeUseCase>(() => GetHomeUseCase(Get.find()), fenix: true);
/// ----- Shop Feature -----
Get.lazyPut<IShopDatasource>(() => ShopDatasourceImpl(Get.find()), fenix: true);
Get.lazyPut<IShopRepository>(() => ShopRepositoryImpl(Get.find()), fenix: true);
Get.lazyPut<GetShopUseCase>(() => GetShopUseCase(Get.find()), fenix: true);
/// ----- Awards Feature -----
Get.lazyPut<IAwardsDatasource>(() => AwardsDatasourceImpl(Get.find()), fenix: true);
Get.lazyPut<IAwardsRepository>(() => AwardsRepositoryImpl(Get.find()), fenix: true);
Get.lazyPut<GetAwardsUseCase>(() => GetAwardsUseCase(Get.find()), fenix: true);
/// ----- Profile Feature -----
Get.lazyPut<IProfileDatasource>(() => ProfileDatasourceImpl(Get.find()), fenix: true);
Get.lazyPut<IProfileRepository>(() => ProfileRepositoryImpl(Get.find()), fenix: true);
Get.lazyPut<GetProfileUseCase>(() => GetProfileUseCase(Get.find()), fenix: true);
}

2
lib/main.dart

@ -31,7 +31,7 @@ class MainApp extends StatelessWidget {
fallbackLocale: const Locale('en', 'US'),
supportedLocales: const [Locale('en', 'US')],
getPages: appPages,
initialRoute: Routes.homePage,
initialRoute: Routes.masterPage,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,

Loading…
Cancel
Save