From 9df330cd1b71d0722f4f537261f410e1b4f20781 Mon Sep 17 00:00:00 2001 From: AmirrezaChegini Date: Wed, 1 Oct 2025 13:07:56 +0330 Subject: [PATCH] add: save levels from json into database --- lib/core/utils/my_scroll_behavior.dart | 11 ------- .../home/presentation/bloc/home_bloc.dart | 2 +- .../data/datasource/intro_datasource.dart | 29 ++++++++++++++++++- .../intro/presentation/bloc/intro_bloc.dart | 11 ++++++- .../intro/presentation/ui/intro_page.dart | 17 ++++++++++- .../level/presentation/bloc/level_bloc.dart | 4 ++- lib/init_bindings.dart | 11 ++++++- lib/main.dart | 2 -- 8 files changed, 68 insertions(+), 19 deletions(-) delete mode 100644 lib/core/utils/my_scroll_behavior.dart diff --git a/lib/core/utils/my_scroll_behavior.dart b/lib/core/utils/my_scroll_behavior.dart deleted file mode 100644 index 41ef961..0000000 --- a/lib/core/utils/my_scroll_behavior.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -class MyScrollBehavior extends ScrollBehavior { - @override - Set get dragDevices => { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - PointerDeviceKind.trackpad, - }; -} diff --git a/lib/features/home/presentation/bloc/home_bloc.dart b/lib/features/home/presentation/bloc/home_bloc.dart index b3bc551..114736f 100644 --- a/lib/features/home/presentation/bloc/home_bloc.dart +++ b/lib/features/home/presentation/bloc/home_bloc.dart @@ -26,7 +26,7 @@ class HomeBloc extends Bloc { /// ------------Functions------------ void goToLevelPage(BuildContext context){ - context.go(Routes.levelPage); + context.pushNamed(Routes.levelPage); } /// ------------Api Calls------------ diff --git a/lib/features/intro/data/datasource/intro_datasource.dart b/lib/features/intro/data/datasource/intro_datasource.dart index c23f5a0..f49fb4b 100644 --- a/lib/features/intro/data/datasource/intro_datasource.dart +++ b/lib/features/intro/data/datasource/intro_datasource.dart @@ -1,4 +1,13 @@ +import 'dart:convert'; + +import 'package:flutter/services.dart'; +import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; +import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; import 'package:hadi_hoda_flutter/core/network/http_request.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'; +import 'package:hive/hive.dart'; abstract class IIntroDatasource { Future saveLevels(); @@ -10,5 +19,23 @@ class IntroDatasourceImpl implements IIntroDatasource { const IntroDatasourceImpl(this.httpRequest); @override - Future saveLevels() async {} + Future saveLevels() async { + try { + final Box levelBox = Hive.box(MyConstants.levelBox); + if (levelBox.isEmpty) { + final String levelAssets = await rootBundle.loadString( + 'assets/json/levels.json', + ); + final dynamic response = jsonDecode(levelAssets); + final List levelList = BaseResponse.getDataList( + response?['result'], + (json) => LevelModel.fromJson(json), + ); + + await levelBox.addAll(levelList); + } + } catch (e) { + throw MyException(errorMessage: '$e'); + } + } } diff --git a/lib/features/intro/presentation/bloc/intro_bloc.dart b/lib/features/intro/presentation/bloc/intro_bloc.dart index 8151cd6..886787a 100644 --- a/lib/features/intro/presentation/bloc/intro_bloc.dart +++ b/lib/features/intro/presentation/bloc/intro_bloc.dart @@ -1,6 +1,9 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; +import 'package:go_router/go_router.dart'; import 'package:hadi_hoda_flutter/core/params/no_params.dart'; +import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; +import 'package:hadi_hoda_flutter/core/utils/context_provider.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'; @@ -28,7 +31,13 @@ class IntroBloc extends Bloc { await _saveLevelsUseCase(NoParams()).then( (value) { value.fold( - (data) {}, + (data) async { + await Future.delayed( + Duration(seconds: 1), () { + ContextProvider.context!.goNamed(Routes.homePage); + }, + ); + }, (error) {}, ); }, diff --git a/lib/features/intro/presentation/ui/intro_page.dart b/lib/features/intro/presentation/ui/intro_page.dart index 8f36bd3..afc90af 100644 --- a/lib/features/intro/presentation/ui/intro_page.dart +++ b/lib/features/intro/presentation/ui/intro_page.dart @@ -1,12 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; import 'package:hadi_hoda_flutter/core/utils/my_image.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/intro_loading_widget.dart'; -class IntroPage extends StatelessWidget { +class IntroPage extends StatefulWidget { const IntroPage({super.key}); + @override + State createState() => _IntroPageState(); +} + +class _IntroPageState extends State { + + @override + void initState() { + super.initState(); + context.read().add(SaveLevelsEvent()); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/features/level/presentation/bloc/level_bloc.dart b/lib/features/level/presentation/bloc/level_bloc.dart index 72a49d3..a92b510 100644 --- a/lib/features/level/presentation/bloc/level_bloc.dart +++ b/lib/features/level/presentation/bloc/level_bloc.dart @@ -60,7 +60,9 @@ class LevelBloc extends Bloc { value.fold( (data) { bottom8LevelList.addAll(data.take(8)); - top12LevelList.addAll(data.sublist(8, 20)); + if(data.length > 8){ + top12LevelList.addAll(data.sublist(8, data.length)); + } emit(state.copyWith(getLevelStatus: const BaseComplete(''))); }, (error) {}, diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index d06ad50..d82b2b2 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -7,6 +7,10 @@ import 'package:hadi_hoda_flutter/features/home/data/datasource/home_datasource. import 'package:hadi_hoda_flutter/features/home/data/repository_impl/home_repository_impl.dart'; import 'package:hadi_hoda_flutter/features/home/domain/repository/home_repository.dart'; import 'package:hadi_hoda_flutter/features/home/domain/usecases/get_home_usecase.dart'; +import 'package:hadi_hoda_flutter/features/intro/data/datasource/intro_datasource.dart'; +import 'package:hadi_hoda_flutter/features/intro/data/repository_impl/intro_repository_impl.dart'; +import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart'; +import 'package:hadi_hoda_flutter/features/intro/domain/usecases/save_levels_usecase.dart'; import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasource.dart'; import 'package:hadi_hoda_flutter/features/level/data/repository_impl/level_repository_impl.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; @@ -38,6 +42,11 @@ void initBindings() { locator.registerLazySingleton(() => SampleRepositoryImpl(locator())); locator.registerLazySingleton(() => GetSampleUseCase(locator())); + /// Intro Feature + locator.registerLazySingleton(() => IntroDatasourceImpl(locator())); + locator.registerLazySingleton(() => IntroRepositoryImpl(locator())); + locator.registerLazySingleton(() => SaveLevelsUseCase(locator())); + /// Home Feature locator.registerLazySingleton(() => HomeDatasourceImpl(locator())); locator.registerLazySingleton(() => HomeRepositoryImpl(locator())); @@ -49,7 +58,7 @@ void initBindings() { locator.registerLazySingleton(() => GetQuestionUseCase(locator())); /// Level Feature - locator.registerLazySingleton(() => LevelDatasourceImpl(locator())); + locator.registerLazySingleton(() => LocalLevelDatasourceImpl()); locator.registerLazySingleton(() => LevelRepositoryImpl(locator())); locator.registerLazySingleton(() => GetLevelUseCase(locator())); } diff --git a/lib/main.dart b/lib/main.dart index 5fa9c22..4ca56b1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,6 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:hadi_hoda_flutter/common_ui/theme/my_theme.dart'; import 'package:hadi_hoda_flutter/core/auth_storage/auth_storage.dart'; import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_scroll_behavior.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -31,7 +30,6 @@ class MainApp extends StatelessWidget { themeMode: ThemeService.getTheme(), locale: const Locale('en', 'US'), supportedLocales: const [Locale('en', 'US')], - scrollBehavior: MyScrollBehavior(), routerConfig: appPages, localizationsDelegates: const [ AppLocalizations.delegate,