From 67fdfcf17c7f4896734d636283c74732748a7eac Mon Sep 17 00:00:00 2001 From: AmirrezaChegini Date: Wed, 1 Oct 2025 11:31:46 +0330 Subject: [PATCH] add: intro feature --- lib/core/params/no_params.dart | 1 + lib/core/routers/my_routes.dart | 13 ++++++- .../data/datasource/intro_datasource.dart | 14 +++++++ .../intro_repository_impl.dart | 28 ++++++++++++++ .../domain/repository/intro_repository.dart | 7 ++++ .../domain/usecases/save_levels_usecase.dart | 16 ++++++++ .../intro/presentation/bloc/intro_bloc.dart | 37 +++++++++++++++++++ .../intro/presentation/bloc/intro_event.dart | 5 +++ .../intro/presentation/bloc/intro_state.dart | 15 ++++++++ .../intro/presentation/ui/intro_page.dart | 10 +++++ 10 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 lib/core/params/no_params.dart create mode 100644 lib/features/intro/data/datasource/intro_datasource.dart create mode 100644 lib/features/intro/data/repository_impl/intro_repository_impl.dart create mode 100644 lib/features/intro/domain/repository/intro_repository.dart create mode 100644 lib/features/intro/domain/usecases/save_levels_usecase.dart create mode 100644 lib/features/intro/presentation/bloc/intro_bloc.dart create mode 100644 lib/features/intro/presentation/bloc/intro_event.dart create mode 100644 lib/features/intro/presentation/bloc/intro_state.dart create mode 100644 lib/features/intro/presentation/ui/intro_page.dart diff --git a/lib/core/params/no_params.dart b/lib/core/params/no_params.dart new file mode 100644 index 0000000..0d64db2 --- /dev/null +++ b/lib/core/params/no_params.dart @@ -0,0 +1 @@ +class NoParams {} diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index cd738a1..ea90dee 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/home/presentation/bloc/home_bloc.dart'; import 'package:hadi_hoda_flutter/features/home/presentation/ui/home_page.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/bloc/level_event.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/ui/level_page.dart'; @@ -15,15 +17,24 @@ class Routes { const Routes._internal(); factory Routes() => _i; + static const String introPage = '/intro_page'; static const String homePage = '/home_page'; static const String questionPage = '/question_page'; static const String levelPage = '/level_page'; } GoRouter get appPages => GoRouter( - initialLocation: Routes.homePage, + initialLocation: Routes.introPage, navigatorKey: ContextProvider.navigatorKey, routes: [ + GoRoute( + name: Routes.introPage, + path: Routes.introPage, + builder: (context, state) => BlocProvider( + create: (context) => IntroBloc(locator()), + child: const IntroPage(), + ), + ), GoRoute( name: Routes.homePage, path: Routes.homePage, 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..c23f5a0 --- /dev/null +++ b/lib/features/intro/data/datasource/intro_datasource.dart @@ -0,0 +1,14 @@ +import 'package:hadi_hoda_flutter/core/network/http_request.dart'; + +abstract class IIntroDatasource { + Future saveLevels(); +} + +class IntroDatasourceImpl implements IIntroDatasource { + final IHttpRequest httpRequest; + + const IntroDatasourceImpl(this.httpRequest); + + @override + Future saveLevels() async {} +} 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..f0be4ba --- /dev/null +++ b/lib/features/intro/data/repository_impl/intro_repository_impl.dart @@ -0,0 +1,28 @@ +import 'package:flutter/foundation.dart'; +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; +import 'package:hadi_hoda_flutter/core/params/no_params.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/repository/intro_repository.dart'; + +class IntroRepositoryImpl implements IIntroRepository { + final IIntroDatasource datasource; + + const IntroRepositoryImpl(this.datasource); + + @override + Future> saveLevels() async { + try { + await datasource.saveLevels(); + return DataState.success(NoParams()); + } 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/repository/intro_repository.dart b/lib/features/intro/domain/repository/intro_repository.dart new file mode 100644 index 0000000..636e5ec --- /dev/null +++ b/lib/features/intro/domain/repository/intro_repository.dart @@ -0,0 +1,7 @@ +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; +import 'package:hadi_hoda_flutter/core/params/no_params.dart'; +import 'package:hadi_hoda_flutter/core/utils/data_state.dart'; + +abstract class IIntroRepository { + Future> saveLevels(); +} diff --git a/lib/features/intro/domain/usecases/save_levels_usecase.dart b/lib/features/intro/domain/usecases/save_levels_usecase.dart new file mode 100644 index 0000000..87f385b --- /dev/null +++ b/lib/features/intro/domain/usecases/save_levels_usecase.dart @@ -0,0 +1,16 @@ +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; +import 'package:hadi_hoda_flutter/core/params/no_params.dart'; +import 'package:hadi_hoda_flutter/core/usecase/usecase.dart'; +import 'package:hadi_hoda_flutter/core/utils/data_state.dart'; +import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart'; + +class SaveLevelsUseCase implements UseCase { + final IIntroRepository repository; + + const SaveLevelsUseCase(this.repository); + + @override + Future> call(NoParams params) { + return repository.saveLevels(); + } +} diff --git a/lib/features/intro/presentation/bloc/intro_bloc.dart b/lib/features/intro/presentation/bloc/intro_bloc.dart new file mode 100644 index 0000000..8151cd6 --- /dev/null +++ b/lib/features/intro/presentation/bloc/intro_bloc.dart @@ -0,0 +1,37 @@ +import 'dart:async'; +import 'package:bloc/bloc.dart'; +import 'package:hadi_hoda_flutter/core/params/no_params.dart'; +import 'package:hadi_hoda_flutter/features/intro/domain/usecases/save_levels_usecase.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart'; + +class IntroBloc extends Bloc { + /// ------------constructor------------ + IntroBloc( + this._saveLevelsUseCase, + ) : super(const IntroState()) { + on(_saveLevelsEvent); + } + + /// ------------UseCases------------ + final SaveLevelsUseCase _saveLevelsUseCase; + + /// ------------Variables------------ + + /// ------------Controllers------------ + + /// ------------Functions------------ + + /// ------------Api Calls------------ + FutureOr _saveLevelsEvent(SaveLevelsEvent event, + Emitter emit) async { + await _saveLevelsUseCase(NoParams()).then( + (value) { + value.fold( + (data) {}, + (error) {}, + ); + }, + ); + } +} diff --git a/lib/features/intro/presentation/bloc/intro_event.dart b/lib/features/intro/presentation/bloc/intro_event.dart new file mode 100644 index 0000000..3d80e11 --- /dev/null +++ b/lib/features/intro/presentation/bloc/intro_event.dart @@ -0,0 +1,5 @@ +sealed class IntroEvent { + const IntroEvent(); +} + +class SaveLevelsEvent extends IntroEvent {} diff --git a/lib/features/intro/presentation/bloc/intro_state.dart b/lib/features/intro/presentation/bloc/intro_state.dart new file mode 100644 index 0000000..2c7fd3f --- /dev/null +++ b/lib/features/intro/presentation/bloc/intro_state.dart @@ -0,0 +1,15 @@ +import 'package:hadi_hoda_flutter/core/status/base_status.dart'; + +class IntroState { + final BaseStatus getIntroStatus; + + const IntroState({this.getIntroStatus = const BaseInit()}); + + IntroState copyWith({ + BaseStatus? getIntroStatus, + }) { + return IntroState( + getIntroStatus: getIntroStatus ?? this.getIntroStatus, + ); + } +} diff --git a/lib/features/intro/presentation/ui/intro_page.dart b/lib/features/intro/presentation/ui/intro_page.dart new file mode 100644 index 0000000..9de0ae2 --- /dev/null +++ b/lib/features/intro/presentation/ui/intro_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class IntroPage extends StatelessWidget { + const IntroPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold(); + } +}