diff --git a/assets/images/electro.png b/assets/images/electro.png new file mode 100644 index 0000000..d497717 Binary files /dev/null and b/assets/images/electro.png differ diff --git a/assets/images/union.png b/assets/images/union.png new file mode 100644 index 0000000..7893b6d Binary files /dev/null and b/assets/images/union.png differ diff --git a/assets/images/vs.png b/assets/images/vs.png new file mode 100644 index 0000000..0be3d5c Binary files /dev/null and b/assets/images/vs.png differ diff --git a/assets/svg/icon_iran.svg b/assets/svg/icon_iran.svg new file mode 100644 index 0000000..70d7ea0 --- /dev/null +++ b/assets/svg/icon_iran.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart index 8c30640..7e76912 100644 --- a/lib/common_ui/resources/my_assets.dart +++ b/lib/common_ui/resources/my_assets.dart @@ -31,6 +31,9 @@ class MyAssets { static const String member4 = 'assets/images/member_4.png'; static const String done = 'assets/images/done.png'; static const String worldMap = 'assets/images/world_map.png'; + static const String union = 'assets/images/union.png'; + static const String vs = 'assets/images/vs.png'; + static const String electro = 'assets/images/electro.png'; /// ----- Svg ----- static const String iconHome = 'assets/svg/icon_home.svg'; @@ -66,6 +69,7 @@ class MyAssets { static const String iconArt = 'assets/svg/icon_art.svg'; static const String iconRandom = 'assets/svg/icon_random.svg'; static const String magnifier = 'assets/svg/magnifier.svg'; + static const String iconIran = 'assets/svg/icon_iran.svg'; /// ----- Audios ----- static const String sampleAudio = 'assets/audios/sample.mp3'; diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index 528cf69..3116ea5 100644 --- a/lib/core/routers/my_routes.dart +++ b/lib/core/routers/my_routes.dart @@ -1,5 +1,7 @@ import 'package:shia_game_flutter/features/awards/presentation/binding/awards_binding.dart'; import 'package:shia_game_flutter/features/awards/presentation/ui/awards_page.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_league_finding_page.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_league_founded_page.dart'; import 'package:shia_game_flutter/features/home/presentation/binding/home_binding.dart'; import 'package:shia_game_flutter/features/home/presentation/pages/home_page.dart'; import 'package:shia_game_flutter/features/intro/presentation/binding/intro_binding.dart'; @@ -15,8 +17,7 @@ import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_ 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'; -import 'package:shia_game_flutter/features/topic/presentation/binding/topic_binding.dart'; -import 'package:shia_game_flutter/features/topic/presentation/ui/topic_page.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_league_topic_page.dart'; class Routes { static const Routes _i = Routes._internal(); @@ -30,8 +31,12 @@ class Routes { static const String shopPage = '/shop_page'; static const String awardsPage = '/awards_page'; static const String profilePage = '/profile_page'; + + /// Battle league static const String battleLeaguePage = '/battle_league_page'; - static const String topicPage = '/topic_page'; + static const String battleLeagueTopicPage = '/battle_league_topic_page'; + static const String battleLeagueFindingPage = '/battle_league_finding_page'; + static const String battleLeagueFoundedPage = '/battle_league_founded_page'; } final List appPages = [ @@ -78,8 +83,18 @@ final List appPages = [ binding: BattleLeagueBinding(), ), GetPage( - name: Routes.topicPage, - page: () => const TopicPage(), - binding: TopicBinding(), + name: Routes.battleLeagueTopicPage, + page: () => const BattleLeagueTopicPage(), + binding: BattleLeagueBinding(), + ), + GetPage( + name: Routes.battleLeagueFindingPage, + page: () => const BattleLeagueFindingPage(), + binding: BattleLeagueBinding(), + ), + GetPage( + name: Routes.battleLeagueFoundedPage, + page: () => const BattleLeagueFoundedPage(), + binding: BattleLeagueBinding(), ), ]; diff --git a/lib/core/widgets/loading/my_linear_loading.dart b/lib/core/widgets/loading/my_linear_loading.dart new file mode 100644 index 0000000..514b177 --- /dev/null +++ b/lib/core/widgets/loading/my_linear_loading.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart'; +import 'package:shia_game_flutter/core/utils/my_localization.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; + +class MyLinearLoading extends StatelessWidget { + const MyLinearLoading({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Column( + spacing: 10.h, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translate.loading, + style: Lexend.regular.copyWith(fontSize: 12.sp), + ), + Container( + width: 188.w, + height: 16.h, + padding: const EdgeInsetsDirectional.only( + start: 2, + top: 2, + bottom: 2, + end: 20, + ), + decoration: const ShapeDecoration( + shape: StadiumBorder( + side: BorderSide( + width: 1, + color: Color(0XFFA579EA), + ), + ), + ), + child: Container( + height: 14.h, + decoration: ShapeDecoration( + shape: StadiumBorder( + side: BorderSide( + width: 1, + color: Colors.white.withValues(alpha: 0.5), + ), + ), + gradient: const LinearGradient( + begin: AlignmentDirectional.centerStart, + end: AlignmentDirectional.centerEnd, + colors: [ + Color(0XFF9C7EEC), + Color(0XFF3BBDFF), + ], + ), + ), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/features/battle_league/presentation/controller/battle_league_controller.dart b/lib/features/battle_league/presentation/controller/battle_league_controller.dart index 55786f4..fd49a0f 100644 --- a/lib/features/battle_league/presentation/controller/battle_league_controller.dart +++ b/lib/features/battle_league/presentation/controller/battle_league_controller.dart @@ -40,7 +40,14 @@ class BattleLeagueController extends GetxController /// ------ Functions ------ void goToTopicPage(){ - Get.toNamed(Routes.topicPage); + Get.toNamed(Routes.battleLeagueTopicPage); + } + + void goToFindingPage(){ + Get.toNamed(Routes.battleLeagueFindingPage); + } + void goToFoundedPage(){ + Get.toNamed(Routes.battleLeagueFoundedPage); } /// ------ Api Calls ------ diff --git a/lib/features/battle_league/presentation/ui/battle_find_page.dart b/lib/features/battle_league/presentation/ui/battle_find_page.dart deleted file mode 100644 index 6a4f3a9..0000000 --- a/lib/features/battle_league/presentation/ui/battle_find_page.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:flutter/material.dart'; -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_colors.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/utils/my_localization.dart'; -import 'package:shia_game_flutter/core/utils/screen_size.dart'; -import 'package:shia_game_flutter/core/widgets/container/my_container.dart'; -import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; -import 'package:shia_game_flutter/core/widgets/text/gradient_text.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; - -class BattleFindPage extends GetView { - const BattleFindPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: MyColors.battleLeagueBackgroundColor, - body: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 30), - child: Column( - children: [ - 20.h.gapHeight, - _rankTitle(context), - const Spacer(), - _findingImage(context), - const Spacer(), - _description(context), - 37.h.gapHeight, - const BattlePurpleButton(), - ], - ), - ), - ), - ); - } - - Container _rankTitle(BuildContext context) { - return Container( - height: 42.h, - width: context.widthScreen, - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 17), - decoration: const ShapeDecoration( - shape: StadiumBorder(), - color: Color(0XFF2E0869), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: FittedBox( - child: Text( - '${context.translate.quiz_league} (june) | ${context.translate.your_place} (1,569)', - textAlign: TextAlign.center, - maxLines: 1, - style: Lexend.semiBold.copyWith(fontSize: 12.sp), - ), - ), - ), - 15.w.gapWidth, - const MyImage(asset: MyAssets.iconRank), - 4.w.gapWidth, - Text('265', style: Lexend.bold.copyWith(fontSize: 12.sp)), - ], - ), - ); - } - - Widget _findingImage(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - const MyImage(asset: MyAssets.worldMap), - const MyImage(asset: MyAssets.magnifier), - Positioned( - bottom: 0, - child: Text( - context.translate.finding_player, - style: Lexend.semiBold.copyWith(fontSize: 20.sp), - ), - ), - ], - ); - } - - Column _description(BuildContext context) { - return Column( - children: [ - Text('،،', style: Lexend.black.copyWith(fontSize: 84.sp, height: 1)), - Text( - context.translate.find_hint, - textAlign: TextAlign.center, - style: Lexend.regular.copyWith( - fontSize: 14.sp, - color: const Color(0XFFC9B7E8), - ), - ), - ], - ); - } -} - -class BattlePurpleButton extends StatelessWidget { - const BattlePurpleButton({super.key}); - - @override - Widget build(BuildContext context) { - return MyContainer( - onTap: () {}, - width: context.widthScreen, - height: 64.h, - borderRadius: const BorderRadius.all(Radius.circular(20)), - borderGradient: LinearGradient( - begin: AlignmentDirectional.topStart, - end: AlignmentDirectional.bottomEnd, - colors: [ - const Color(0XFF7F4CD4), - const Color(0XFF7F4CD4).withValues(alpha: 0), - ], - ), - gradient: const RadialGradient( - radius: 5, - center: Alignment(-0.5, 0), - colors: [Color(0xFF6A36BF), Color(0xFF562A9E)], - ), - child: GradientText( - text: context.translate.stop_finding, - fontSize: 22.sp, - color: const Color(0xFFE1E1E1), - offset: const Offset(0, 1.04), - blurRadius: 1.9, - shadowColor: const Color(0xFF898989), - ), - ); - } -} diff --git a/lib/features/battle_league/presentation/ui/battle_league_finding_page.dart b/lib/features/battle_league/presentation/ui/battle_league_finding_page.dart new file mode 100644 index 0000000..47fbe38 --- /dev/null +++ b/lib/features/battle_league/presentation/ui/battle_league_finding_page.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +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_colors.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/utils/my_localization.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/button/battle_purple_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/rank_title.dart'; + +class BattleLeagueFindingPage extends GetView { + const BattleLeagueFindingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyColors.battleLeagueBackgroundColor, + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Column( + children: [ + 20.h.gapHeight, + const RankTitle(), + const Spacer(), + _findingImage(context), + const Spacer(), + _description(context), + 37.h.gapHeight, + _startFindingButton(context), + ], + ), + ), + ), + ); + } + + Widget _findingImage(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + const MyImage(asset: MyAssets.worldMap), + const MyImage(asset: MyAssets.magnifier), + Positioned( + bottom: 0, + child: Text( + context.translate.finding_player, + style: Lexend.semiBold.copyWith(fontSize: 20.sp), + ), + ), + ], + ); + } + + Column _description(BuildContext context) { + return Column( + children: [ + Text('،،', style: Lexend.black.copyWith(fontSize: 84.sp, height: 1)), + Text( + context.translate.find_hint, + textAlign: TextAlign.center, + style: Lexend.regular.copyWith( + fontSize: 14.sp, + color: const Color(0XFFC9B7E8), + ), + ), + ], + ); + } + + Widget _startFindingButton(BuildContext context) { + return BattlePurpleButton( + label: context.translate.stop_finding, + onTap: controller.goToFoundedPage, + ); + } +} diff --git a/lib/features/battle_league/presentation/ui/battle_league_founded_page.dart b/lib/features/battle_league/presentation/ui/battle_league_founded_page.dart new file mode 100644 index 0000000..c809007 --- /dev/null +++ b/lib/features/battle_league/presentation/ui/battle_league_founded_page.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +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_colors.dart'; +import 'package:shia_game_flutter/core/utils/gap.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; +import 'package:shia_game_flutter/core/widgets/loading/my_linear_loading.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/founded_page/founded_avatar.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/rank_title.dart'; + +class BattleLeagueFoundedPage extends GetView { + const BattleLeagueFoundedPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyColors.battleLeagueBackgroundColor, + body: DecoratedBox( + decoration: const BoxDecoration( + image: DecorationImage(image: AssetImage(MyAssets.union)), + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Column( + children: [ + 20.h.gapHeight, + const RankTitle(), + 50.h.gapHeight, + const FoundedAvatar(), + _image(), + const FoundedAvatar(), + 50.h.gapHeight, + const MyLinearLoading(), + ], + ), + ), + ), + ), + ); + } + + Flexible _image() { + return Flexible( + child: Stack( + alignment: Alignment.center, + children: [ + Transform.scale( + scale: 2, + child: const MyImage(asset: MyAssets.electro, fit: BoxFit.cover), + ), + const MyImage(asset: MyAssets.vs), + ], + ), + ); + } +} diff --git a/lib/features/battle_league/presentation/ui/battle_league_page.dart b/lib/features/battle_league/presentation/ui/battle_league_page.dart index 0b335dc..caa64f2 100644 --- a/lib/features/battle_league/presentation/ui/battle_league_page.dart +++ b/lib/features/battle_league/presentation/ui/battle_league_page.dart @@ -7,10 +7,10 @@ import 'package:shia_game_flutter/core/utils/screen_size.dart'; import 'package:shia_game_flutter/core/widgets/app_bar/enums/app_bar_type.dart'; import 'package:shia_game_flutter/core/widgets/app_bar/my_app_bar.dart'; import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/battle_league_tab_bar.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/regional_ranking.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/time_ranking.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/button/battle_golden_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/battle_league_tab_bar.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/regional_ranking.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/time_ranking.dart'; class BattleLeaguePage extends GetView { const BattleLeaguePage({super.key}); @@ -75,7 +75,7 @@ class BattleLeaguePage extends GetView { Padding _startButton(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 30), - child: BattleLeagueStartButton( + child: BattleGoldenButton( title: context.translate.play_now, onTap: controller.goToTopicPage, ), diff --git a/lib/features/topic/presentation/ui/topic_page.dart b/lib/features/battle_league/presentation/ui/battle_league_topic_page.dart similarity index 82% rename from lib/features/topic/presentation/ui/topic_page.dart rename to lib/features/battle_league/presentation/ui/battle_league_topic_page.dart index e934dd7..cb76ea9 100644 --- a/lib/features/topic/presentation/ui/topic_page.dart +++ b/lib/features/battle_league/presentation/ui/battle_league_topic_page.dart @@ -8,13 +8,13 @@ import 'package:shia_game_flutter/core/utils/my_localization.dart'; import 'package:shia_game_flutter/core/utils/screen_size.dart'; import 'package:shia_game_flutter/core/widgets/app_bar/enums/app_bar_type.dart'; import 'package:shia_game_flutter/core/widgets/app_bar/my_app_bar.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart'; -import 'package:shia_game_flutter/features/topic/presentation/controller/topic_controller.dart'; -import 'package:shia_game_flutter/features/topic/presentation/ui/widgets/battle_grey_button.dart'; -import 'package:shia_game_flutter/features/topic/presentation/ui/widgets/topic_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/controller/battle_league_controller.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/button/battle_golden_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/button/battle_grey_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/topic_page/topic_widget.dart'; -class TopicPage extends GetView { - const TopicPage({super.key}); +class BattleLeagueTopicPage extends GetView { + const BattleLeagueTopicPage({super.key}); @override Widget build(BuildContext context) { @@ -104,7 +104,10 @@ class TopicPage extends GetView { Widget _startButton(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 30), - child: BattleLeagueStartButton(title: context.translate.start_finding), + child: BattleGoldenButton( + onTap: controller.goToFindingPage, + title: context.translate.start_finding, + ), ); } } diff --git a/lib/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart b/lib/features/battle_league/presentation/ui/widgets/button/battle_golden_button.dart similarity index 93% rename from lib/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart rename to lib/features/battle_league/presentation/ui/widgets/button/battle_golden_button.dart index 49e09a7..cbdd417 100644 --- a/lib/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart +++ b/lib/features/battle_league/presentation/ui/widgets/button/battle_golden_button.dart @@ -3,8 +3,8 @@ import 'package:shia_game_flutter/core/utils/screen_size.dart'; import 'package:shia_game_flutter/core/widgets/container/my_container.dart'; import 'package:shia_game_flutter/core/widgets/text/gradient_text.dart'; -class BattleLeagueStartButton extends StatelessWidget { - const BattleLeagueStartButton({ +class BattleGoldenButton extends StatelessWidget { + const BattleGoldenButton({ super.key, this.onTap, this.title, diff --git a/lib/features/topic/presentation/ui/widgets/battle_grey_button.dart b/lib/features/battle_league/presentation/ui/widgets/button/battle_grey_button.dart similarity index 100% rename from lib/features/topic/presentation/ui/widgets/battle_grey_button.dart rename to lib/features/battle_league/presentation/ui/widgets/button/battle_grey_button.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/button/battle_purple_button.dart b/lib/features/battle_league/presentation/ui/widgets/button/battle_purple_button.dart new file mode 100644 index 0000000..1b71eca --- /dev/null +++ b/lib/features/battle_league/presentation/ui/widgets/button/battle_purple_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/container/my_container.dart'; +import 'package:shia_game_flutter/core/widgets/text/gradient_text.dart'; + +class BattlePurpleButton extends StatelessWidget { + const BattlePurpleButton({super.key, this.onTap, this.label}); + + final VoidCallback? onTap; + final String? label; + + @override + Widget build(BuildContext context) { + return MyContainer( + onTap: onTap, + width: context.widthScreen, + height: 64.h, + borderRadius: const BorderRadius.all(Radius.circular(20)), + borderGradient: LinearGradient( + begin: AlignmentDirectional.topStart, + end: AlignmentDirectional.bottomEnd, + colors: [ + const Color(0XFF7F4CD4), + const Color(0XFF7F4CD4).withValues(alpha: 0), + ], + ), + gradient: const RadialGradient( + radius: 5, + center: Alignment(-0.5, 0), + colors: [Color(0xFF6A36BF), Color(0xFF562A9E)], + ), + child: GradientText( + text: label, + fontSize: 22.sp, + color: const Color(0xFFE1E1E1), + offset: const Offset(0, 1.04), + blurRadius: 1.9, + shadowColor: const Color(0xFF898989), + ), + ); + } +} diff --git a/lib/features/battle_league/presentation/ui/widgets/founded_page/founded_avatar.dart b/lib/features/battle_league/presentation/ui/widgets/founded_page/founded_avatar.dart new file mode 100644 index 0000000..f08115e --- /dev/null +++ b/lib/features/battle_league/presentation/ui/widgets/founded_page/founded_avatar.dart @@ -0,0 +1,63 @@ +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_colors.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/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; + +class FoundedAvatar extends StatelessWidget { + const FoundedAvatar({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Stack( + alignment: Alignment.center, + clipBehavior: Clip.none, + children: [ + Container( + width: 106, + height: 106, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(width: 1, color: MyColors.white), + ), + child: const CircleAvatar( + foregroundImage: AssetImage(MyAssets.character1), + ), + ), + Positioned( + top: -10, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 4), + decoration: const ShapeDecoration( + shape: StadiumBorder(), + color: MyColors.white, + ), + child: Text( + '2,567', + style: Lexend.semiBold.copyWith( + fontSize: 12.sp, + color: const Color(0XFF784AC0), + ), + ), + ), + ), + ], + ), + 16.h.gapHeight, + Text('Jack William', style: Lexend.bold.copyWith(fontSize: 16.sp)), + Row( + mainAxisSize: MainAxisSize.min, + spacing: 10, + children: [ + const MyImage(asset: MyAssets.iconIran), + Text('Iran', style: Lexend.medium.copyWith(fontSize: 14.sp)), + ], + ), + ], + ); + } +} diff --git a/lib/features/battle_league/presentation/ui/widgets/battle_league_tab_bar.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/battle_league_tab_bar.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/battle_league_tab_bar.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/battle_league_tab_bar.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/filter_ranking_button.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/filter_ranking_button.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/filter_ranking_button.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/filter_ranking_button.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/my_ranking_widget.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/my_ranking_widget.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/my_ranking_widget.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/my_ranking_widget.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/ranking_region.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/ranking_region.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/ranking_region.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/ranking_region.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/ranking_scrollbar.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/ranking_scrollbar.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/ranking_scrollbar.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/ranking_scrollbar.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/ranking_time.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/ranking_time.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/ranking_time.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/ranking_time.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/ranking_widget.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/ranking_widget.dart similarity index 100% rename from lib/features/battle_league/presentation/ui/widgets/ranking_widget.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/ranking_widget.dart diff --git a/lib/features/battle_league/presentation/ui/widgets/regional_ranking.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/regional_ranking.dart similarity index 91% rename from lib/features/battle_league/presentation/ui/widgets/regional_ranking.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/regional_ranking.dart index 6ec324a..39b9954 100644 --- a/lib/features/battle_league/presentation/ui/widgets/regional_ranking.dart +++ b/lib/features/battle_league/presentation/ui/widgets/main_page/regional_ranking.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:shia_game_flutter/core/utils/gap.dart'; import 'package:shia_game_flutter/core/utils/my_localization.dart'; import 'package:shia_game_flutter/core/utils/screen_size.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/filter_ranking_button.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/my_ranking_widget.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_region.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_scrollbar.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/filter_ranking_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/my_ranking_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_region.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_scrollbar.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_widget.dart'; class RegionalRanking extends StatefulWidget { const RegionalRanking({super.key}); diff --git a/lib/features/battle_league/presentation/ui/widgets/time_ranking.dart b/lib/features/battle_league/presentation/ui/widgets/main_page/time_ranking.dart similarity index 91% rename from lib/features/battle_league/presentation/ui/widgets/time_ranking.dart rename to lib/features/battle_league/presentation/ui/widgets/main_page/time_ranking.dart index 953bdd3..fae3447 100644 --- a/lib/features/battle_league/presentation/ui/widgets/time_ranking.dart +++ b/lib/features/battle_league/presentation/ui/widgets/main_page/time_ranking.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:shia_game_flutter/core/utils/gap.dart'; import 'package:shia_game_flutter/core/utils/my_localization.dart'; import 'package:shia_game_flutter/core/utils/screen_size.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/filter_ranking_button.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/my_ranking_widget.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_scrollbar.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_time.dart'; -import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/ranking_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/filter_ranking_button.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/my_ranking_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_scrollbar.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_widget.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/main_page/ranking_time.dart'; class TimeRanking extends StatefulWidget { const TimeRanking({super.key}); diff --git a/lib/features/battle_league/presentation/ui/widgets/rank_title.dart b/lib/features/battle_league/presentation/ui/widgets/rank_title.dart new file mode 100644 index 0000000..6f8feb7 --- /dev/null +++ b/lib/features/battle_league/presentation/ui/widgets/rank_title.dart @@ -0,0 +1,44 @@ +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_text_style.dart'; +import 'package:shia_game_flutter/core/utils/gap.dart'; +import 'package:shia_game_flutter/core/utils/my_localization.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; + +class RankTitle extends StatelessWidget { + const RankTitle({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + height: 42.h, + width: context.widthScreen, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 17), + decoration: const ShapeDecoration( + shape: StadiumBorder(), + color: Color(0XFF2E0869), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: FittedBox( + child: Text( + '${context.translate.quiz_league} (june) | ${context.translate.your_place} (1,569)', + textAlign: TextAlign.center, + maxLines: 1, + style: Lexend.semiBold.copyWith(fontSize: 12.sp), + ), + ), + ), + 15.w.gapWidth, + const MyImage(asset: MyAssets.iconRank), + 4.w.gapWidth, + Text('265', style: Lexend.bold.copyWith(fontSize: 12.sp)), + ], + ), + ); + } +} diff --git a/lib/features/topic/presentation/ui/widgets/topic_widget.dart b/lib/features/battle_league/presentation/ui/widgets/topic_page/topic_widget.dart similarity index 100% rename from lib/features/topic/presentation/ui/widgets/topic_widget.dart rename to lib/features/battle_league/presentation/ui/widgets/topic_page/topic_widget.dart diff --git a/lib/features/intro/presentation/ui/intro_page.dart b/lib/features/intro/presentation/ui/intro_page.dart index 7830db4..93c67c3 100644 --- a/lib/features/intro/presentation/ui/intro_page.dart +++ b/lib/features/intro/presentation/ui/intro_page.dart @@ -1,13 +1,11 @@ import 'package:flutter/material.dart'; 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_text_style.dart'; import 'package:shia_game_flutter/common_ui/theme/my_theme.dart'; -import 'package:shia_game_flutter/core/utils/my_localization.dart'; import 'package:shia_game_flutter/core/utils/screen_size.dart'; import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; +import 'package:shia_game_flutter/core/widgets/loading/my_linear_loading.dart'; import 'package:shia_game_flutter/features/intro/presentation/controller/intro_controller.dart'; -import 'package:shia_game_flutter/features/intro/presentation/ui/widgets/intro_loading.dart'; class IntroPage extends GetView { const IntroPage({super.key}); @@ -82,17 +80,7 @@ class IntroPage extends GetView { Positioned _bottomLoading(BuildContext context) { return Positioned( bottom: 16.h, - child: Column( - spacing: 10.h, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.translate.loading, - style: Lexend.regular.copyWith(fontSize: 12.sp), - ), - const IntroLoading(), - ], - ), + child: const MyLinearLoading() ); } } diff --git a/lib/features/intro/presentation/ui/widgets/intro_loading.dart b/lib/features/intro/presentation/ui/widgets/intro_loading.dart index ca3836f..8b13789 100644 --- a/lib/features/intro/presentation/ui/widgets/intro_loading.dart +++ b/lib/features/intro/presentation/ui/widgets/intro_loading.dart @@ -1,49 +1 @@ -import 'package:flutter/material.dart'; -import 'package:shia_game_flutter/core/utils/screen_size.dart'; -class IntroLoading extends StatelessWidget { - const IntroLoading({ - super.key, - }); - - @override - Widget build(BuildContext context) { - return Container( - width: 188.w, - height: 16.h, - padding: const EdgeInsetsDirectional.only( - start: 2, - top: 2, - bottom: 2, - end: 20, - ), - decoration: const ShapeDecoration( - shape: StadiumBorder( - side: BorderSide( - width: 1, - color: Color(0XFFA579EA), - ), - ), - ), - child: Container( - height: 14.h, - decoration: ShapeDecoration( - shape: StadiumBorder( - side: BorderSide( - width: 1, - color: Colors.white.withValues(alpha: 0.5), - ), - ), - gradient: const LinearGradient( - begin: AlignmentDirectional.centerStart, - end: AlignmentDirectional.centerEnd, - colors: [ - Color(0XFF9C7EEC), - Color(0XFF3BBDFF), - ], - ), - ), - ), - ); - } -} diff --git a/lib/features/topic/data/datasource/topic_datasource.dart b/lib/features/topic/data/datasource/topic_datasource.dart deleted file mode 100644 index 6f94800..0000000 --- a/lib/features/topic/data/datasource/topic_datasource.dart +++ /dev/null @@ -1,28 +0,0 @@ -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/topic_params.dart'; -import 'package:shia_game_flutter/core/response/base_response.dart'; -import 'package:shia_game_flutter/features/topic/data/model/topic_model.dart'; -import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; - -abstract class ITopicDatasource { - Future getData({required TopicParams params}); -} - -class TopicDatasourceImpl implements ITopicDatasource { - final IHttpRequest httpRequest; - - const TopicDatasourceImpl(this.httpRequest); - - @override - Future getData({required TopicParams params}) async { - final response = await httpRequest.get( - path: MyApi.baseUrl, - ); - - return BaseResponse.getData( - response?['data'], - (json) => TopicModel.fromJson(json), - ); - } -} diff --git a/lib/features/topic/data/model/topic_model.dart b/lib/features/topic/data/model/topic_model.dart deleted file mode 100644 index e7d152c..0000000 --- a/lib/features/topic/data/model/topic_model.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; - -class TopicModel extends TopicEntity { - const TopicModel({ - super.id, - }); - - factory TopicModel.fromJson(Map json) { - return TopicModel( - id: json['id'], - ); - } -} diff --git a/lib/features/topic/data/repository_impl/topic_repository_impl.dart b/lib/features/topic/data/repository_impl/topic_repository_impl.dart deleted file mode 100644 index 46870f7..0000000 --- a/lib/features/topic/data/repository_impl/topic_repository_impl.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; -import 'package:shia_game_flutter/core/params/topic_params.dart'; -import 'package:shia_game_flutter/core/utils/data_state.dart'; -import 'package:shia_game_flutter/features/topic/data/datasource/topic_datasource.dart'; -import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; -import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; - -class TopicRepositoryImpl implements ITopicRepository { - final ITopicDatasource datasource; - - const TopicRepositoryImpl(this.datasource); - - @override - Future> getData({required TopicParams params}) async { - try { - final TopicEntity 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/topic/domain/entity/topic_entity.dart b/lib/features/topic/domain/entity/topic_entity.dart deleted file mode 100644 index d6e6e85..0000000 --- a/lib/features/topic/domain/entity/topic_entity.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class TopicEntity extends Equatable { - final int? id; - - const TopicEntity({ - this.id, - }); - - @override - List get props => [ - id, - ]; -} diff --git a/lib/features/topic/domain/repository/topic_repository.dart b/lib/features/topic/domain/repository/topic_repository.dart deleted file mode 100644 index 0b591dd..0000000 --- a/lib/features/topic/domain/repository/topic_repository.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; -import 'package:shia_game_flutter/core/params/topic_params.dart'; -import 'package:shia_game_flutter/core/utils/data_state.dart'; -import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; - -abstract class ITopicRepository { - Future> getData({required TopicParams params}); -} diff --git a/lib/features/topic/domain/usecases/get_topic_usecase.dart b/lib/features/topic/domain/usecases/get_topic_usecase.dart deleted file mode 100644 index 3c16333..0000000 --- a/lib/features/topic/domain/usecases/get_topic_usecase.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; -import 'package:shia_game_flutter/core/params/topic_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/topic/domain/entity/topic_entity.dart'; -import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; - -class GetTopicUseCase implements UseCase { - final ITopicRepository repository; - - const GetTopicUseCase(this.repository); - - @override - Future> call(TopicParams params) { - return repository.getData(params: params); - } -} - - diff --git a/lib/features/topic/presentation/binding/topic_binding.dart b/lib/features/topic/presentation/binding/topic_binding.dart deleted file mode 100644 index 9b1b6da..0000000 --- a/lib/features/topic/presentation/binding/topic_binding.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:shia_game_flutter/features/topic/presentation/controller/topic_controller.dart'; -import 'package:get/get.dart'; - -class TopicBinding extends Bindings { - @override - void dependencies() { - Get.put(TopicController(Get.find())); - } - - Future deleteBindings() async { - await Future.wait([ - Get.delete(), - ]); - } - - Future refreshBinding() async { - await deleteBindings(); - dependencies(); - } -} diff --git a/lib/features/topic/presentation/controller/topic_controller.dart b/lib/features/topic/presentation/controller/topic_controller.dart deleted file mode 100644 index cb1fd82..0000000 --- a/lib/features/topic/presentation/controller/topic_controller.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:shia_game_flutter/core/params/topic_params.dart'; -import 'package:shia_game_flutter/core/status/base_status.dart'; -import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; -import 'package:shia_game_flutter/features/topic/domain/usecases/get_topic_usecase.dart'; -import 'package:get/get.dart'; - -class TopicController extends GetxController with StateMixin { - /// ----- Constructor ----- - TopicController(this.getTopicUseCase); - - @override - void onInit() { - super.onInit(); - change('', status: RxStatus.success()); - } - - @override - void onClose() { - textEditingController.dispose(); - super.onClose(); - } - - /// ----- UseCases ----- - final GetTopicUseCase getTopicUseCase; - - /// ----- Variables ----- - final Rx topicParams = Rx(TopicParams()); - final Rx topicEntity = Rx(const TopicEntity()); - - /// ------ Controllers ------ - final TextEditingController textEditingController = TextEditingController(); - - /// ------ Statuses ------ - final Rx getTopicStatus = Rx(const BaseInit()); - - /// ------ Functions ------ - - /// ------ Api Calls ------ - Future getTopic() async { - change('', status: RxStatus.loading()); - await getTopicUseCase(topicParams.value).then( - (value) => value.fold( - (data) { - topicEntity.value = data; - change('', status: RxStatus.success()); - }, - (error) { - change('', status: RxStatus.error(error.errorMessage)); - }, - ), - ); - } -} diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index 2401e9f..fc3a664 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -33,10 +33,6 @@ import 'package:shia_game_flutter/features/shop/data/datasource/shop_datasource. 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'; -import 'package:shia_game_flutter/features/topic/data/datasource/topic_datasource.dart'; -import 'package:shia_game_flutter/features/topic/data/repository_impl/topic_repository_impl.dart'; -import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; -import 'package:shia_game_flutter/features/topic/domain/usecases/get_topic_usecase.dart'; void initBindings() { /// ----- Classes ----- @@ -81,9 +77,4 @@ void initBindings() { Get.lazyPut(() => BattleLeagueDatasourceImpl(Get.find()), fenix: true); Get.lazyPut(() => BattleLeagueRepositoryImpl(Get.find()), fenix: true); Get.lazyPut(() => GetBattleLeagueUseCase(Get.find()), fenix: true); - - /// ----- Topic Feature ----- - Get.lazyPut(() => TopicDatasourceImpl(Get.find()), fenix: true); - Get.lazyPut(() => TopicRepositoryImpl(Get.find()), fenix: true); - Get.lazyPut(() => GetTopicUseCase(Get.find()), fenix: true); }