diff --git a/assets/images/background_intro.png b/assets/images/background_intro.png
new file mode 100644
index 0000000..2905983
Binary files /dev/null and b/assets/images/background_intro.png differ
diff --git a/assets/images/hadi_hoda.png b/assets/images/hadi_hoda.png
new file mode 100644
index 0000000..8d05776
Binary files /dev/null and b/assets/images/hadi_hoda.png differ
diff --git a/assets/images/music_off.svg b/assets/images/music_off.svg
new file mode 100644
index 0000000..6c8ad5e
--- /dev/null
+++ b/assets/images/music_off.svg
@@ -0,0 +1,73 @@
+
diff --git a/assets/images/music_on.svg b/assets/images/music_on.svg
new file mode 100644
index 0000000..c53351d
--- /dev/null
+++ b/assets/images/music_on.svg
@@ -0,0 +1,60 @@
+
diff --git a/assets/images/start.svg b/assets/images/start.svg
new file mode 100644
index 0000000..8151c85
--- /dev/null
+++ b/assets/images/start.svg
@@ -0,0 +1,77 @@
+
diff --git a/assets/images/theme.svg b/assets/images/theme.svg
new file mode 100644
index 0000000..93f83cf
--- /dev/null
+++ b/assets/images/theme.svg
@@ -0,0 +1,60 @@
+
diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart
index b9e70da..4efdc1f 100644
--- a/lib/common_ui/resources/my_assets.dart
+++ b/lib/common_ui/resources/my_assets.dart
@@ -3,5 +3,10 @@ class MyAssets {
const MyAssets._internal();
factory MyAssets() => _i;
- static const String sample = 'assets/image/sample.png';
+ static const String backgroundIntro = 'assets/images/background_intro.png';
+ static const String hadiHoda = 'assets/images/hadi_hoda.png';
+ static const String musicOff = 'assets/images/music_off.svg';
+ static const String musicOn = 'assets/images/music_on.svg';
+ static const String start = 'assets/images/start.svg';
+ static const String theme = 'assets/images/theme.svg';
}
\ No newline at end of file
diff --git a/lib/common_ui/theme/my_theme.dart b/lib/common_ui/theme/my_theme.dart
index 1d8dd96..43e6ba9 100644
--- a/lib/common_ui/theme/my_theme.dart
+++ b/lib/common_ui/theme/my_theme.dart
@@ -2,7 +2,7 @@ import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
-enum ColorsName { primaryColor }
+enum ColorsName { primaryColor, noColor }
class MyTheme {
static const MyTheme _i = MyTheme._internal();
@@ -14,10 +14,12 @@ class MyTheme {
static final ThemeData dark = ThemeData(brightness: Brightness.dark);
static Map get lightColors => {
+ ColorsName.noColor: MyColors.transparent,
ColorsName.primaryColor: MyColors.white,
};
static Map get darkColors => {
+ ColorsName.noColor: MyColors.transparent,
ColorsName.primaryColor: MyColors.black,
};
}
@@ -29,4 +31,5 @@ extension ThemeExtension on BuildContext {
: MyTheme.lightColors;
Color get primaryColor => customColors[ColorsName.primaryColor]!;
+ Color get noColor => customColors[ColorsName.noColor]!;
}
diff --git a/lib/core/middleware/auth_middleware.dart b/lib/core/middleware/auth_middleware.dart
index b03c337..16064ec 100644
--- a/lib/core/middleware/auth_middleware.dart
+++ b/lib/core/middleware/auth_middleware.dart
@@ -12,7 +12,7 @@ class AuthMiddleware {
static FutureOr redirect(BuildContext context, GoRouterState state) async {
if (AuthStorage.isLogin()) {
- return Routes.samplePage;
+ return Routes.introPage;
} else {
return null;
}
diff --git a/lib/core/params/intro_params.dart b/lib/core/params/intro_params.dart
new file mode 100644
index 0000000..e03d91f
--- /dev/null
+++ b/lib/core/params/intro_params.dart
@@ -0,0 +1,13 @@
+class IntroParams {
+ int? id;
+
+ IntroParams({this.id});
+
+ IntroParams copyWith({
+ int? id,
+ }) {
+ return IntroParams(
+ id: id ?? this.id,
+ );
+ }
+}
diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart
index 6a31ae9..63a185b 100644
--- a/lib/core/routers/my_routes.dart
+++ b/lib/core/routers/my_routes.dart
@@ -1,28 +1,30 @@
-import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
-import 'package:hadi_hoda_flutter/features/sample/presentation/bloc/sample_bloc.dart';
-import 'package:hadi_hoda_flutter/features/sample/presentation/ui/sample_page.dart';
-import 'package:hadi_hoda_flutter/init_bindings.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
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/init_bindings.dart';
class Routes {
static const Routes _i = Routes._internal();
+
const Routes._internal();
+
factory Routes() => _i;
- static const String samplePage = '/sample_page';
+ static const String introPage = '/intro_page';
}
GoRouter get appPages => GoRouter(
- initialLocation: Routes.samplePage,
+ initialLocation: Routes.introPage,
navigatorKey: ContextProvider.navigatorKey,
routes: [
GoRoute(
- name: Routes.samplePage,
- path: Routes.samplePage,
+ name: Routes.introPage,
+ path: Routes.introPage,
builder: (context, state) => BlocProvider(
- create: (context) => SampleBloc(locator()),
- child: const SamplePage(),
+ create: (context) => IntroBloc(locator()),
+ child: const IntroPage(),
),
),
],
diff --git a/lib/core/utils/my_image.dart b/lib/core/utils/my_image.dart
new file mode 100644
index 0000000..9408284
--- /dev/null
+++ b/lib/core/utils/my_image.dart
@@ -0,0 +1,42 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:hadi_hoda_flutter/common_ui/theme/my_theme.dart';
+
+class MyImage extends StatelessWidget {
+ const MyImage({
+ super.key,
+ required this.image,
+ this.fit,
+ this.width,
+ this.height,
+ this.color,
+ });
+
+ final String image;
+ final BoxFit? fit;
+ final double? width;
+ final double? height;
+ final Color? color;
+
+ @override
+ Widget build(BuildContext context) {
+ if (image.endsWith('.png') || image.endsWith('.jpg')) {
+ return Image(
+ image: AssetImage(image),
+ fit: fit,
+ width: width,
+ height: height,
+ );
+ } else {
+ return SvgPicture.asset(
+ image,
+ fit: fit ?? BoxFit.contain,
+ width: width,
+ height: height,
+ colorFilter: color != null
+ ? ColorFilter.mode(color ?? context.primaryColor, BlendMode.srcIn)
+ : null,
+ );
+ }
+ }
+}
diff --git a/lib/features/intro/data/datasource/intro_datasource.dart b/lib/features/intro/data/datasource/intro_datasource.dart
new file mode 100644
index 0000000..996c916
--- /dev/null
+++ b/lib/features/intro/data/datasource/intro_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/intro_params.dart';
+import 'package:hadi_hoda_flutter/core/response/base_response.dart';
+import 'package:hadi_hoda_flutter/features/intro/data/model/intro_model.dart';
+import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
+
+abstract class IIntroDatasource {
+ Future getData({required IntroParams params});
+}
+
+class IntroDatasourceImpl implements IIntroDatasource {
+ final IHttpRequest httpRequest;
+
+ const IntroDatasourceImpl(this.httpRequest);
+
+ @override
+ Future getData({required IntroParams params}) async {
+ final response = await httpRequest.get(
+ path: MyApi.baseUrl,
+ );
+
+ return BaseResponse.getData(
+ response?['data'],
+ (json) => IntroModel.fromJson(json),
+ );
+ }
+}
diff --git a/lib/features/intro/data/model/intro_model.dart b/lib/features/intro/data/model/intro_model.dart
new file mode 100644
index 0000000..548de3d
--- /dev/null
+++ b/lib/features/intro/data/model/intro_model.dart
@@ -0,0 +1,13 @@
+import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
+
+class IntroModel extends IntroEntity {
+ const IntroModel({
+ super.id,
+ });
+
+ factory IntroModel.fromJson(Map json) {
+ return IntroModel(
+ id: json['id'],
+ );
+ }
+}
diff --git a/lib/features/intro/data/repository_impl/intro_repository_impl.dart b/lib/features/intro/data/repository_impl/intro_repository_impl.dart
new file mode 100644
index 0000000..362779c
--- /dev/null
+++ b/lib/features/intro/data/repository_impl/intro_repository_impl.dart
@@ -0,0 +1,29 @@
+import 'package:hadi_hoda_flutter/core/params/intro_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/intro/data/datasource/intro_datasource.dart';
+import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
+import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
+
+class IntroRepositoryImpl implements IIntroRepository {
+ final IIntroDatasource datasource;
+
+ const IntroRepositoryImpl(this.datasource);
+
+ @override
+ Future> getData({required IntroParams params}) async {
+ try {
+ final IntroEntity 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/intro/domain/entity/intro_entity.dart b/lib/features/intro/domain/entity/intro_entity.dart
new file mode 100644
index 0000000..15c2e44
--- /dev/null
+++ b/lib/features/intro/domain/entity/intro_entity.dart
@@ -0,0 +1,14 @@
+import 'package:equatable/equatable.dart';
+
+class IntroEntity extends Equatable {
+ final int? id;
+
+ const IntroEntity({
+ this.id,
+ });
+
+ @override
+ List