diff --git a/assets/fonts/dinokids.ttf b/assets/fonts/dinokids.ttf
new file mode 100644
index 0000000..968f36d
Binary files /dev/null and b/assets/fonts/dinokids.ttf differ
diff --git a/assets/images/current_level.png b/assets/images/current_level.png
new file mode 100644
index 0000000..ac3cbcd
Binary files /dev/null and b/assets/images/current_level.png differ
diff --git a/assets/images/done_rounded.svg b/assets/images/done_rounded.svg
new file mode 100644
index 0000000..941246e
--- /dev/null
+++ b/assets/images/done_rounded.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/finished_level.png b/assets/images/finished_level.png
new file mode 100644
index 0000000..89cb246
Binary files /dev/null and b/assets/images/finished_level.png differ
diff --git a/assets/images/home_button.png b/assets/images/home_button.png
new file mode 100644
index 0000000..6044958
Binary files /dev/null and b/assets/images/home_button.png differ
diff --git a/assets/images/level.png b/assets/images/level.png
new file mode 100644
index 0000000..f6a88ec
Binary files /dev/null and b/assets/images/level.png differ
diff --git a/assets/images/location.svg b/assets/images/location.svg
new file mode 100644
index 0000000..09f09b4
--- /dev/null
+++ b/assets/images/location.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/images/map_background.png b/assets/images/map_background.png
new file mode 100644
index 0000000..e033ac9
Binary files /dev/null and b/assets/images/map_background.png differ
diff --git a/assets/images/play.svg b/assets/images/play.svg
new file mode 100644
index 0000000..3b5b9da
--- /dev/null
+++ b/assets/images/play.svg
@@ -0,0 +1,62 @@
+
diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart
index aafeaa3..862e6a3 100644
--- a/lib/common_ui/resources/my_assets.dart
+++ b/lib/common_ui/resources/my_assets.dart
@@ -17,7 +17,7 @@ class MyAssets {
static const String language = 'assets/images/language.svg';
static const String newHorizon = 'assets/images/new_horizon.svg';
static const String khadijeLogo = 'assets/images/khadije_logo.png';
- static const String home = 'assets/images/home.svg';
+ static const String home = 'assets/images/level.svg';
static const String music = 'assets/images/music.svg';
static const String pattern = 'assets/images/pattern.png';
static const String persons = 'assets/images/persons.png';
@@ -28,4 +28,12 @@ class MyAssets {
static const String correct = 'assets/images/correct.svg';
static const String wrong = 'assets/images/wrong.svg';
static const String handPoint = 'assets/images/hand_point.svg';
+ static const String mapBackground = 'assets/images/map_background.png';
+ static const String level = 'assets/images/level.png';
+ static const String finishedLevel = 'assets/images/finished_level.png';
+ static const String currentLevel = 'assets/images/current_level.png';
+ static const String location = 'assets/images/location.svg';
+ static const String play = 'assets/images/play.svg';
+ static const String homeButton = 'assets/images/home_button.png';
+ static const String doneRounded = 'assets/images/done_rounded.svg';
}
\ No newline at end of file
diff --git a/lib/common_ui/resources/my_text_style.dart b/lib/common_ui/resources/my_text_style.dart
index 4ce69d5..34c9b7a 100644
--- a/lib/common_ui/resources/my_text_style.dart
+++ b/lib/common_ui/resources/my_text_style.dart
@@ -5,11 +5,18 @@ class MyTextStyle {
const MyTextStyle._internal();
factory MyTextStyle() => _i;
- static const String fontFamily = '';
+ static const String fontFamily = 'dinokids';
- static const TextStyle lightXS = TextStyle(
- fontFamily: fontFamily,
- fontSize: 10,
- fontWeight: FontWeight.w400,
+ static const TextStyle normal = TextStyle(
+ fontFamily: fontFamily,
+ fontSize: 26,
+ fontWeight: FontWeight.w400,
+ shadows: [
+ Shadow(
+ color: Color(0XFF5B5B5B),
+ blurRadius: 2.86,
+ offset: Offset(0, 2),
+ ),
+ ]
);
}
diff --git a/lib/core/params/level_params.dart b/lib/core/params/level_params.dart
new file mode 100644
index 0000000..1e885f8
--- /dev/null
+++ b/lib/core/params/level_params.dart
@@ -0,0 +1,13 @@
+class LevelParams {
+ int? id;
+
+ LevelParams({this.id});
+
+ LevelParams copyWith({
+ int? id,
+ }) {
+ return LevelParams(
+ id: id ?? this.id,
+ );
+ }
+}
diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart
index 55f4ca7..b69981b 100644
--- a/lib/core/routers/my_routes.dart
+++ b/lib/core/routers/my_routes.dart
@@ -3,6 +3,8 @@ import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/intro_page.dart';
+import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.dart';
+import 'package:hadi_hoda_flutter/features/level/presentation/ui/level_page.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_bloc.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/ui/question_page.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart';
@@ -14,10 +16,11 @@ class Routes {
static const String introPage = '/intro_page';
static const String questionPage = '/question_page';
+ static const String levelPage = '/level_page';
}
GoRouter get appPages => GoRouter(
- initialLocation: Routes.introPage,
+ initialLocation: Routes.levelPage,
navigatorKey: ContextProvider.navigatorKey,
routes: [
GoRoute(
@@ -28,6 +31,14 @@ GoRouter get appPages => GoRouter(
child: const IntroPage(),
),
),
+ GoRoute(
+ name: Routes.levelPage,
+ path: Routes.levelPage,
+ builder: (context, state) => BlocProvider(
+ create: (context) => LevelBloc(locator()),
+ child: const LevelPage(),
+ ),
+ ),
GoRoute(
name: Routes.questionPage,
path: Routes.questionPage,
diff --git a/lib/core/widgets/answer_box/styles/text_box.dart b/lib/core/widgets/answer_box/styles/text_box.dart
index c636cfa..85c7aa8 100644
--- a/lib/core/widgets/answer_box/styles/text_box.dart
+++ b/lib/core/widgets/answer_box/styles/text_box.dart
@@ -8,7 +8,7 @@ class AnswerTextBox extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ClipPath(
- clipper: _WavyBannerClipper(),
+ clipper: WavyBannerClipper(),
child: Container(
padding: EdgeInsets.all(MySpaces.s10),
decoration: BoxDecoration(
@@ -35,7 +35,7 @@ class AnswerTextBox extends StatelessWidget {
}
}
-class _WavyBannerClipper extends CustomClipper {
+class WavyBannerClipper extends CustomClipper {
@override
Path getClip(Size size) {
final sx = size.width / 480.0;
diff --git a/lib/features/level/data/datasource/level_datasource.dart b/lib/features/level/data/datasource/level_datasource.dart
new file mode 100644
index 0000000..ec1f645
--- /dev/null
+++ b/lib/features/level/data/datasource/level_datasource.dart
@@ -0,0 +1,28 @@
+import 'package:hadi_hoda_flutter/core/constants/my_api.dart';
+import 'package:hadi_hoda_flutter/core/network/http_request.dart';
+import 'package:hadi_hoda_flutter/core/params/level_params.dart';
+import 'package:hadi_hoda_flutter/core/response/base_response.dart';
+import 'package:hadi_hoda_flutter/features/level/data/model/level_model.dart';
+import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
+
+abstract class ILevelDatasource {
+ Future getData({required LevelParams params});
+}
+
+class LevelDatasourceImpl implements ILevelDatasource {
+ final IHttpRequest httpRequest;
+
+ const LevelDatasourceImpl(this.httpRequest);
+
+ @override
+ Future getData({required LevelParams params}) async {
+ final response = await httpRequest.get(
+ path: MyApi.baseUrl,
+ );
+
+ return BaseResponse.getData(
+ response?['data'],
+ (json) => LevelModel.fromJson(json),
+ );
+ }
+}
diff --git a/lib/features/level/data/model/level_model.dart b/lib/features/level/data/model/level_model.dart
new file mode 100644
index 0000000..1d3fb5f
--- /dev/null
+++ b/lib/features/level/data/model/level_model.dart
@@ -0,0 +1,13 @@
+import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
+
+class LevelModel extends LevelEntity {
+ const LevelModel({
+ super.id,
+ });
+
+ factory LevelModel.fromJson(Map json) {
+ return LevelModel(
+ id: json['id'],
+ );
+ }
+}
diff --git a/lib/features/level/data/repository_impl/level_repository_impl.dart b/lib/features/level/data/repository_impl/level_repository_impl.dart
new file mode 100644
index 0000000..6673644
--- /dev/null
+++ b/lib/features/level/data/repository_impl/level_repository_impl.dart
@@ -0,0 +1,29 @@
+import 'package:hadi_hoda_flutter/core/params/level_params.dart';
+import 'package:flutter/foundation.dart';
+import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
+import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
+import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasource.dart';
+import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
+import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
+
+class LevelRepositoryImpl implements ILevelRepository {
+ final ILevelDatasource datasource;
+
+ const LevelRepositoryImpl(this.datasource);
+
+ @override
+ Future> getData({required LevelParams params}) async {
+ try {
+ final LevelEntity 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/level/domain/entity/level_entity.dart b/lib/features/level/domain/entity/level_entity.dart
new file mode 100644
index 0000000..4b4616b
--- /dev/null
+++ b/lib/features/level/domain/entity/level_entity.dart
@@ -0,0 +1,14 @@
+import 'package:equatable/equatable.dart';
+
+class LevelEntity extends Equatable {
+ final int? id;
+
+ const LevelEntity({
+ this.id,
+ });
+
+ @override
+ List