diff --git a/assets/svg/close.svg b/assets/svg/close.svg
new file mode 100644
index 0000000..6d8fa28
--- /dev/null
+++ b/assets/svg/close.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/svg/done.svg b/assets/svg/done.svg
new file mode 100644
index 0000000..dcf1527
--- /dev/null
+++ b/assets/svg/done.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/svg/polygon.svg b/assets/svg/polygon.svg
new file mode 100644
index 0000000..a5ad9f3
--- /dev/null
+++ b/assets/svg/polygon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/svg/timer.svg b/assets/svg/timer.svg
new file mode 100644
index 0000000..2c3297d
--- /dev/null
+++ b/assets/svg/timer.svg
@@ -0,0 +1,38 @@
+
diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart
index 7e76912..5bd452a 100644
--- a/lib/common_ui/resources/my_assets.dart
+++ b/lib/common_ui/resources/my_assets.dart
@@ -70,6 +70,10 @@ class MyAssets {
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';
+ static const String polygon = 'assets/svg/polygon.svg';
+ static const String close = 'assets/svg/close.svg';
+ static const String doneWhite = 'assets/svg/done.svg';
+ static const String timer = 'assets/svg/timer.svg';
/// ----- Audios -----
static const String sampleAudio = 'assets/audios/sample.mp3';
diff --git a/lib/core/params/bl_question_params.dart b/lib/core/params/bl_question_params.dart
new file mode 100644
index 0000000..aea905b
--- /dev/null
+++ b/lib/core/params/bl_question_params.dart
@@ -0,0 +1,13 @@
+class BLQuestionParams {
+ int? id;
+
+ BLQuestionParams({this.id});
+
+ BLQuestionParams copyWith({
+ int? id,
+ }) {
+ return BLQuestionParams(
+ id: id ?? this.id,
+ );
+ }
+}
diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart
index 76ac69b..e3dfcf1 100644
--- a/lib/core/routers/my_routes.dart
+++ b/lib/core/routers/my_routes.dart
@@ -5,6 +5,8 @@ import 'package:shia_game_flutter/features/battle_league/first_part/presentation
import 'package:shia_game_flutter/features/battle_league/first_part/presentation/ui/battle_league_founded_page.dart';
import 'package:shia_game_flutter/features/battle_league/first_part/presentation/ui/battle_league_page.dart';
import 'package:shia_game_flutter/features/battle_league/first_part/presentation/ui/battle_league_topic_page.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/presentation/binding/bl_question_binding.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/presentation/ui/bl_question_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';
@@ -37,6 +39,7 @@ class Routes {
static const String battleLeagueTopicPage = '/battle_league_topic_page';
static const String battleLeagueFindingPage = '/battle_league_finding_page';
static const String battleLeagueFoundedPage = '/battle_league_founded_page';
+ static const String battleLeagueQuestionPage = '/battle_league_question_page';
}
final List appPages = [
@@ -97,4 +100,9 @@ final List appPages = [
page: () => const BattleLeagueFoundedPage(),
binding: BattleLeagueBinding(),
),
+ GetPage(
+ name: Routes.battleLeagueQuestionPage,
+ page: () => const BLQuestionPage(),
+ binding: BLQuestionBinding(),
+ ),
];
diff --git a/lib/core/widgets/stepper/my_stepper.dart b/lib/core/widgets/stepper/my_stepper.dart
new file mode 100644
index 0000000..7564628
--- /dev/null
+++ b/lib/core/widgets/stepper/my_stepper.dart
@@ -0,0 +1,41 @@
+import 'package:flutter/material.dart';
+import 'package:shia_game_flutter/core/utils/screen_size.dart';
+import 'package:shia_game_flutter/core/widgets/stepper/styles/my_step_default_item.dart';
+
+class MyStepper extends StatelessWidget {
+ const MyStepper({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ height: 30.h,
+ width: context.widthScreen,
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(horizontal: 16.w),
+ decoration: const ShapeDecoration(
+ shape: StadiumBorder(),
+ color: Color(0XFF3A1570),
+ ),
+ child: Stack(
+ alignment: Alignment.center,
+ children: [
+ Container(
+ height: 3.h,
+ width: context.widthScreen,
+ decoration: const ShapeDecoration(
+ shape: StadiumBorder(),
+ color: Color(0XFF2B0D57),
+ ),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: List.generate(
+ 10,
+ (index) => const MyStepDefaultItem(),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/core/widgets/stepper/styles/my_step_correct_item.dart b/lib/core/widgets/stepper/styles/my_step_correct_item.dart
new file mode 100644
index 0000000..61ee6d1
--- /dev/null
+++ b/lib/core/widgets/stepper/styles/my_step_correct_item.dart
@@ -0,0 +1,27 @@
+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/core/widgets/image/my_image.dart';
+
+class MyStepCorrectItem extends StatelessWidget {
+ const MyStepCorrectItem({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ height: 16,
+ width: 16,
+ padding: const EdgeInsets.all(3),
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ color: const Color(0XFF0BA310),
+ border: Border.all(
+ width: 1,
+ color: const Color(0XFF3DE543),
+ strokeAlign: BorderSide.strokeAlignInside,
+ ),
+ ),
+ child: const MyImage(asset: MyAssets.done, color: MyColors.white),
+ );
+ }
+}
diff --git a/lib/core/widgets/stepper/styles/my_step_current_item.dart b/lib/core/widgets/stepper/styles/my_step_current_item.dart
new file mode 100644
index 0000000..cd6d12a
--- /dev/null
+++ b/lib/core/widgets/stepper/styles/my_step_current_item.dart
@@ -0,0 +1,34 @@
+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/core/widgets/image/my_image.dart';
+
+class MyStepCurrentItem extends StatelessWidget {
+ const MyStepCurrentItem({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Stack(
+ clipBehavior: Clip.none,
+ alignment: Alignment.center,
+ children: [
+ Container(
+ width: 16,
+ height: 16,
+ padding: const EdgeInsets.all(4),
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ color: Color(0XFF2B0D57),
+ ),
+ child: Container(
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ color: MyColors.white,
+ ),
+ ),
+ ),
+ const Positioned(top: -12, child: MyImage(asset: MyAssets.polygon)),
+ ],
+ );
+ }
+}
diff --git a/lib/core/widgets/stepper/styles/my_step_default_item.dart b/lib/core/widgets/stepper/styles/my_step_default_item.dart
new file mode 100644
index 0000000..9d8b49c
--- /dev/null
+++ b/lib/core/widgets/stepper/styles/my_step_default_item.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+
+class MyStepDefaultItem extends StatelessWidget {
+ const MyStepDefaultItem({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: 8,
+ height: 8,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ color: Color(0XFFA86CFF),
+ ),
+ );
+ }
+}
diff --git a/lib/core/widgets/stepper/styles/my_step_wrong_item.dart b/lib/core/widgets/stepper/styles/my_step_wrong_item.dart
new file mode 100644
index 0000000..b4ed4aa
--- /dev/null
+++ b/lib/core/widgets/stepper/styles/my_step_wrong_item.dart
@@ -0,0 +1,27 @@
+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/core/widgets/image/my_image.dart';
+
+class MyStepWrongItem extends StatelessWidget {
+ const MyStepWrongItem({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ height: 16,
+ width: 16,
+ padding: const EdgeInsets.all(4),
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ color: const Color(0XFFA30B0B),
+ border: Border.all(
+ width: 1,
+ color: const Color(0XFFE53D3D),
+ strokeAlign: BorderSide.strokeAlignInside,
+ ),
+ ),
+ child: const MyImage(asset: MyAssets.close, color: MyColors.white),
+ );
+ }
+}
diff --git a/lib/core/widgets/text/gradient_text.dart b/lib/core/widgets/text/gradient_text.dart
index 8d8b2f6..f8cc5fc 100644
--- a/lib/core/widgets/text/gradient_text.dart
+++ b/lib/core/widgets/text/gradient_text.dart
@@ -16,6 +16,8 @@ class GradientText extends StatelessWidget {
this.offset = Offset.zero,
this.textAlign,
this.textStyle,
+ this.begin,
+ this.end,
});
final String? text;
@@ -28,20 +30,22 @@ class GradientText extends StatelessWidget {
final Offset offset;
final TextAlign? textAlign;
final TextStyle? textStyle;
+ final AlignmentGeometry? begin;
+ final AlignmentGeometry? end;
@override
Widget build(BuildContext context) {
return ShaderMask(
blendMode: BlendMode.modulate,
shaderCallback: (bounds) => LinearGradient(
- begin: Alignment.topCenter,
- end: Alignment.bottomCenter,
+ begin: begin ?? Alignment.topCenter,
+ end: end ?? Alignment.bottomCenter,
colors: gradientColor ?? [
context.primaryColor,
context.primaryColor,
color,
],
- ).createShader(bounds),
+ ).createShader(bounds, textDirection: Directionality.of(context)),
child: Text(
text ?? '',
textAlign: textAlign,
diff --git a/lib/features/battle_league/question_part/bl_question/data/datasource/bl_question_datasource.dart b/lib/features/battle_league/question_part/bl_question/data/datasource/bl_question_datasource.dart
new file mode 100644
index 0000000..bd224d8
--- /dev/null
+++ b/lib/features/battle_league/question_part/bl_question/data/datasource/bl_question_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/bl_question_params.dart';
+import 'package:shia_game_flutter/core/response/base_response.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/data/model/bl_question_model.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/domain/entity/bl_question_entity.dart';
+
+abstract class IBLQuestionDatasource {
+ Future getData({required BLQuestionParams params});
+}
+
+class BLQuestionDatasourceImpl implements IBLQuestionDatasource {
+ final IHttpRequest httpRequest;
+
+ const BLQuestionDatasourceImpl(this.httpRequest);
+
+ @override
+ Future getData({required BLQuestionParams params}) async {
+ final response = await httpRequest.get(
+ path: MyApi.baseUrl,
+ );
+
+ return BaseResponse.getData(
+ response?['data'],
+ (json) => BLQuestionModel.fromJson(json),
+ );
+ }
+}
diff --git a/lib/features/battle_league/question_part/bl_question/data/model/bl_question_model.dart b/lib/features/battle_league/question_part/bl_question/data/model/bl_question_model.dart
new file mode 100644
index 0000000..99ffc46
--- /dev/null
+++ b/lib/features/battle_league/question_part/bl_question/data/model/bl_question_model.dart
@@ -0,0 +1,13 @@
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/domain/entity/bl_question_entity.dart';
+
+class BLQuestionModel extends BLQuestionEntity {
+ const BLQuestionModel({
+ super.id,
+ });
+
+ factory BLQuestionModel.fromJson(Map json) {
+ return BLQuestionModel(
+ id: json['id'],
+ );
+ }
+}
diff --git a/lib/features/battle_league/question_part/bl_question/data/repository_impl/bl_question_repository_impl.dart b/lib/features/battle_league/question_part/bl_question/data/repository_impl/bl_question_repository_impl.dart
new file mode 100644
index 0000000..d3291f9
--- /dev/null
+++ b/lib/features/battle_league/question_part/bl_question/data/repository_impl/bl_question_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/bl_question_params.dart';
+import 'package:shia_game_flutter/core/utils/data_state.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/data/datasource/bl_question_datasource.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/domain/entity/bl_question_entity.dart';
+import 'package:shia_game_flutter/features/battle_league/question_part/bl_question/domain/repository/bl_question_repository.dart';
+
+class BLQuestionRepositoryImpl implements IBLQuestionRepository {
+ final IBLQuestionDatasource datasource;
+
+ const BLQuestionRepositoryImpl(this.datasource);
+
+ @override
+ Future> getData({required BLQuestionParams params}) async {
+ try {
+ final BLQuestionEntity 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/question_part/bl_question/domain/entity/bl_question_entity.dart b/lib/features/battle_league/question_part/bl_question/domain/entity/bl_question_entity.dart
new file mode 100644
index 0000000..7818664
--- /dev/null
+++ b/lib/features/battle_league/question_part/bl_question/domain/entity/bl_question_entity.dart
@@ -0,0 +1,14 @@
+import 'package:equatable/equatable.dart';
+
+class BLQuestionEntity extends Equatable {
+ final int? id;
+
+ const BLQuestionEntity({
+ this.id,
+ });
+
+ @override
+ List