diff --git a/assets/svg/icon_rank.svg b/assets/svg/icon_rank.svg
new file mode 100644
index 0000000..7f2bd98
--- /dev/null
+++ b/assets/svg/icon_rank.svg
@@ -0,0 +1,9 @@
+
diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart
index 98c589f..bf6a215 100644
--- a/lib/common_ui/resources/my_assets.dart
+++ b/lib/common_ui/resources/my_assets.dart
@@ -63,6 +63,7 @@ class MyAssets {
static const String castAwardGold = 'assets/svg/cast_award_gold.svg';
static const String castAwardSilver = 'assets/svg/cast_award_silver.svg';
static const String castAwardBronze = 'assets/svg/cast_award_bronze.svg';
+ static const String iconRank = 'assets/svg/icon_rank.svg';
/// ----- Audios -----
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/core/widgets/app_bar/enums/app_bar_type.dart b/lib/core/widgets/app_bar/enums/app_bar_type.dart
new file mode 100644
index 0000000..5ab6666
--- /dev/null
+++ b/lib/core/widgets/app_bar/enums/app_bar_type.dart
@@ -0,0 +1,36 @@
+import 'package:flutter/cupertino.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/styles/battle_league_app_bar.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/styles/master_app_bar.dart';
+
+enum AppBarType {
+ master,
+ battleLeague;
+
+ static Map title({
+ void Function()? onDiamondTap,
+ void Function()? onFlashTap,
+ void Function()? onShareTap,
+ void Function()? onSettingTap,
+ void Function()? onInfoTap,
+ int? diamondNumber,
+ int? flashNumber,
+ String? title,
+ bool? hasInfo
+ }) {
+ return {
+ AppBarType.master: MasterAppBar(
+ onDiamondTap: onDiamondTap,
+ onFlashTap: onFlashTap,
+ onShareTap: onShareTap,
+ onSettingTap: onSettingTap,
+ diamondNumber: diamondNumber,
+ flashNumber: flashNumber,
+ ),
+ AppBarType.battleLeague: BattleLeagueAppBar(
+ title: title,
+ hasInfo: hasInfo,
+ onInfoTap: onInfoTap,
+ ),
+ };
+ }
+}
\ No newline at end of file
diff --git a/lib/core/widgets/app_bar/master_app_bar.dart b/lib/core/widgets/app_bar/master_app_bar.dart
deleted file mode 100644
index 5e4ba7f..0000000
--- a/lib/core/widgets/app_bar/master_app_bar.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-import 'package:flutter/material.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/styles/app_bar_action.dart';
-import 'package:shia_game_flutter/core/widgets/app_bar/styles/app_bar_add_widget.dart';
-
-class MasterAppBar extends StatelessWidget implements PreferredSizeWidget {
- const MasterAppBar({
- super.key,
- });
-
- @override
- Widget build(BuildContext context) {
- return AppBar(
- backgroundColor: context.backgroundColor,
- titleSpacing: MySpaces.s30,
- title: Row(
- children: [
- AppBarAddWidget(
- onTap: () {},
- icon: MyAssets.iconDiamond,
- number: 999,
- gradientColors: [
- const Color(0XFF52C3ED),
- const Color(0XFF4F16A0),
- ],
- ),
- MySpaces.s6.gapWidth,
- AppBarAddWidget(
- onTap: () {},
- icon: MyAssets.iconFlash,
- number: 54,
- gradientColors: [
- const Color(0XFFEFB345),
- const Color(0XFF4F16A0),
- ],
- ),
- const Spacer(),
- AppBarAction(
- icon: MyAssets.iconShare,
- onTap: () {},
- ),
- MySpaces.s12.gapWidth,
- AppBarAction(
- icon: MyAssets.iconSetting,
- onTap: () {},
- ),
- ],
- ),
- );
- }
-
- @override
- Size get preferredSize => const Size.fromHeight(kToolbarHeight);
-}
diff --git a/lib/core/widgets/app_bar/my_app_bar.dart b/lib/core/widgets/app_bar/my_app_bar.dart
new file mode 100644
index 0000000..e4760de
--- /dev/null
+++ b/lib/core/widgets/app_bar/my_app_bar.dart
@@ -0,0 +1,56 @@
+import 'package:flutter/material.dart';
+import 'package:shia_game_flutter/common_ui/resources/my_spaces.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/enums/app_bar_type.dart';
+
+class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
+ const MyAppBar({
+ super.key,
+ this.backgroundColor,
+ this.type = AppBarType.master,
+ this.onDiamondTap,
+ this.onFlashTap,
+ this.onInfoTap,
+ this.onSettingTap,
+ this.onShareTap,
+ this.diamondNumber,
+ this.flashNumber,
+ this.title,
+ this.hasInfo,
+ });
+
+ final AppBarType type;
+ final Color? backgroundColor;
+ final VoidCallback? onDiamondTap;
+ final VoidCallback? onFlashTap;
+ final VoidCallback? onInfoTap;
+ final VoidCallback? onSettingTap;
+ final VoidCallback? onShareTap;
+ final int? diamondNumber;
+ final int? flashNumber;
+ final String? title;
+ final bool? hasInfo;
+
+ @override
+ Widget build(BuildContext context) {
+ return AppBar(
+ backgroundColor: backgroundColor,
+ centerTitle: true,
+ titleSpacing: MySpaces.s30,
+ title: AppBarType.title(
+ title: title,
+ diamondNumber: diamondNumber,
+ flashNumber: flashNumber,
+ hasInfo: hasInfo,
+ onDiamondTap: onDiamondTap,
+ onFlashTap: onFlashTap,
+ onInfoTap: onInfoTap,
+ onSettingTap: onSettingTap,
+ onShareTap: onShareTap,
+ )[type],
+ automaticallyImplyLeading: false,
+ );
+ }
+
+ @override
+ Size get preferredSize => const Size.fromHeight(kToolbarHeight);
+}
diff --git a/lib/core/widgets/app_bar/styles/battle_league_app_bar.dart b/lib/core/widgets/app_bar/styles/battle_league_app_bar.dart
new file mode 100644
index 0000000..9684a4b
--- /dev/null
+++ b/lib/core/widgets/app_bar/styles/battle_league_app_bar.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/widgets/app_bar_back_button.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/widgets/app_bar_gradient_title.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/widgets/app_bar_info.dart';
+
+class BattleLeagueAppBar extends StatelessWidget implements PreferredSizeWidget {
+ const BattleLeagueAppBar({
+ super.key,
+ this.title,
+ this.hasInfo,
+ this.onInfoTap,
+ });
+
+ final String? title;
+ final bool? hasInfo;
+ final VoidCallback? onInfoTap;
+
+ @override
+ Widget build(BuildContext context) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ const AppBarBackButton(),
+ AppBarGradientTitle(title: title ?? ''),
+ Builder(
+ builder: (context) {
+ if(hasInfo ?? false){
+ return AppBarInfo(onTap: onInfoTap);
+ } else {
+ return const SizedBox.shrink();
+ }
+ },
+ ),
+ ],
+ );
+ }
+
+ @override
+ Size get preferredSize => const Size.fromHeight(kToolbarHeight);
+}
\ No newline at end of file
diff --git a/lib/core/widgets/app_bar/styles/master_app_bar.dart b/lib/core/widgets/app_bar/styles/master_app_bar.dart
new file mode 100644
index 0000000..f8c22c3
--- /dev/null
+++ b/lib/core/widgets/app_bar/styles/master_app_bar.dart
@@ -0,0 +1,66 @@
+import 'package:flutter/material.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/core/utils/gap.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/widgets/app_bar_action.dart';
+import 'package:shia_game_flutter/core/widgets/app_bar/widgets/app_bar_add_widget.dart';
+
+class MasterAppBar extends StatelessWidget implements PreferredSizeWidget {
+ const MasterAppBar({
+ super.key,
+ this.onDiamondTap,
+ this.onFlashTap,
+ this.onShareTap,
+ this.onSettingTap,
+ this.diamondNumber,
+ this.flashNumber,
+ });
+
+ final VoidCallback? onDiamondTap;
+ final VoidCallback? onFlashTap;
+ final VoidCallback? onShareTap;
+ final VoidCallback? onSettingTap;
+ final int? diamondNumber;
+ final int? flashNumber;
+
+
+ @override
+ Widget build(BuildContext context) {
+ return Row(
+ children: [
+ AppBarAddWidget(
+ onTap: onDiamondTap,
+ icon: MyAssets.iconDiamond,
+ number: diamondNumber ?? 0,
+ gradientColors: [
+ const Color(0XFF52C3ED),
+ const Color(0XFF4F16A0),
+ ],
+ ),
+ MySpaces.s6.gapWidth,
+ AppBarAddWidget(
+ onTap: onFlashTap,
+ icon: MyAssets.iconFlash,
+ number: flashNumber ?? 0,
+ gradientColors: [
+ const Color(0XFFEFB345),
+ const Color(0XFF4F16A0),
+ ],
+ ),
+ const Spacer(),
+ AppBarAction(
+ icon: MyAssets.iconShare,
+ onTap: onShareTap,
+ ),
+ MySpaces.s12.gapWidth,
+ AppBarAction(
+ icon: MyAssets.iconSetting,
+ onTap: onSettingTap,
+ ),
+ ],
+ );
+ }
+
+ @override
+ Size get preferredSize => const Size.fromHeight(kToolbarHeight);
+}
diff --git a/lib/core/widgets/app_bar/styles/app_bar_action.dart b/lib/core/widgets/app_bar/widgets/app_bar_action.dart
similarity index 86%
rename from lib/core/widgets/app_bar/styles/app_bar_action.dart
rename to lib/core/widgets/app_bar/widgets/app_bar_action.dart
index a8af150..493e601 100644
--- a/lib/core/widgets/app_bar/styles/app_bar_action.dart
+++ b/lib/core/widgets/app_bar/widgets/app_bar_action.dart
@@ -4,9 +4,9 @@ import 'package:shia_game_flutter/core/widgets/container/my_container.dart';
import 'package:shia_game_flutter/core/widgets/image/my_image.dart';
class AppBarAction extends StatelessWidget {
- const AppBarAction({super.key, this.icon, this.onTap});
+ const AppBarAction({super.key, required this.icon, this.onTap});
- final String? icon;
+ final String icon;
final VoidCallback? onTap;
@override
@@ -23,7 +23,7 @@ class AppBarAction extends StatelessWidget {
end: AlignmentDirectional.bottomEnd,
colors: [Color(0XFF823FEB), Color(0XFF4F09BF)],
),
- child: MyImage(asset: icon ?? ''),
+ child: MyImage(asset: icon),
);
}
}
\ No newline at end of file
diff --git a/lib/core/widgets/app_bar/styles/app_bar_add_widget.dart b/lib/core/widgets/app_bar/widgets/app_bar_add_widget.dart
similarity index 88%
rename from lib/core/widgets/app_bar/styles/app_bar_add_widget.dart
rename to lib/core/widgets/app_bar/widgets/app_bar_add_widget.dart
index 584b98e..a7392de 100644
--- a/lib/core/widgets/app_bar/styles/app_bar_add_widget.dart
+++ b/lib/core/widgets/app_bar/widgets/app_bar_add_widget.dart
@@ -10,16 +10,16 @@ import 'package:shia_game_flutter/core/widgets/image/my_image.dart';
class AppBarAddWidget extends StatelessWidget {
const AppBarAddWidget({
super.key,
- this.icon,
- this.number,
+ required this.icon,
+ required this.number,
this.onTap,
- this.gradientColors,
+ required this.gradientColors,
});
- final String? icon;
- final int? number;
+ final String icon;
+ final int number;
final VoidCallback? onTap;
- final List? gradientColors;
+ final List gradientColors;
@override
Widget build(BuildContext context) {
@@ -31,7 +31,7 @@ class AppBarAddWidget extends StatelessWidget {
borderGradient: LinearGradient(
begin: AlignmentDirectional.topStart,
end: AlignmentDirectional.bottomEnd,
- colors: gradientColors ?? [],
+ colors: gradientColors,
),
padding: const EdgeInsetsDirectional.only(
start: MySpaces.s8,
@@ -40,7 +40,7 @@ class AppBarAddWidget extends StatelessWidget {
color: context.backgroundColor,
child: Row(
children: [
- MyImage(asset: icon ?? ''),
+ MyImage(asset: icon),
Expanded(
child: Text(
'$number',
diff --git a/lib/core/widgets/app_bar/widgets/app_bar_back_button.dart b/lib/core/widgets/app_bar/widgets/app_bar_back_button.dart
new file mode 100644
index 0000000..939a50e
--- /dev/null
+++ b/lib/core/widgets/app_bar/widgets/app_bar_back_button.dart
@@ -0,0 +1,27 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.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/widgets/container/my_container.dart';
+
+class AppBarBackButton extends StatelessWidget {
+ const AppBarBackButton({
+ super.key,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return MyContainer(
+ onTap: () => Get.back(),
+ height: MySpaces.s32,
+ width: MySpaces.s32,
+ borderRadius: const BorderRadius.all(Radius.circular(12)),
+ color: context.primaryColor.withValues(alpha: 0.1),
+ child: Icon(
+ Icons.arrow_back_ios_new_rounded,
+ color: context.primaryColor,
+ size: MySpaces.s18,
+ ),
+ );
+ }
+}
diff --git a/lib/core/widgets/app_bar/widgets/app_bar_gradient_title.dart b/lib/core/widgets/app_bar/widgets/app_bar_gradient_title.dart
new file mode 100644
index 0000000..0588b94
--- /dev/null
+++ b/lib/core/widgets/app_bar/widgets/app_bar_gradient_title.dart
@@ -0,0 +1,23 @@
+import 'package:flutter/material.dart';
+import 'package:shia_game_flutter/core/widgets/text/gradient_text.dart';
+
+class AppBarGradientTitle extends StatelessWidget {
+ const AppBarGradientTitle({
+ super.key,
+ required this.title,
+ });
+
+ final String title;
+
+ @override
+ Widget build(BuildContext context) {
+ return GradientText(
+ text: title,
+ color: const Color(0XFFCAA8FF),
+ fontSize: 22,
+ shadowColor: const Color(0XFF3E1381),
+ offset: const Offset(0, 1.69),
+ blurRadius: 0.84,
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/core/widgets/app_bar/widgets/app_bar_info.dart b/lib/core/widgets/app_bar/widgets/app_bar_info.dart
new file mode 100644
index 0000000..893f4ec
--- /dev/null
+++ b/lib/core/widgets/app_bar/widgets/app_bar_info.dart
@@ -0,0 +1,29 @@
+import 'package:flutter/material.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/widgets/container/my_container.dart';
+
+class AppBarInfo extends StatelessWidget {
+ const AppBarInfo({
+ super.key,
+ this.onTap,
+ });
+
+ final VoidCallback? onTap;
+
+ @override
+ Widget build(BuildContext context) {
+ return MyContainer(
+ onTap: onTap,
+ height: MySpaces.s32,
+ width: MySpaces.s32,
+ borderRadius: const BorderRadius.all(Radius.circular(12)),
+ color: context.primaryColor.withValues(alpha: 0.1),
+ child: Icon(
+ Icons.info_outline_rounded,
+ color: context.primaryColor,
+ size: MySpaces.s20,
+ ),
+ );
+ }
+}
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