feature/intro
#13
Merged
amirreza.chegini
merged 2 commits from feature/intro
into develop
4 days ago
42 changed files with 413 additions and 249 deletions
-
BINassets/images/error.png
-
1lib/common_ui/resources/my_assets.dart
-
10lib/common_ui/resources/my_text_style.dart
-
16lib/common_ui/theme/my_theme.dart
-
1lib/core/constants/my_constants.dart
-
21lib/core/middleware/language_middleware.dart
-
4lib/core/params/language_params.dart
-
7lib/core/routers/my_routes.dart
-
2lib/core/utils/context_provider.dart
-
5lib/core/utils/convert_size.dart
-
3lib/core/utils/my_image.dart
-
6lib/core/widgets/about_us_dialog/about_us_dialog.dart
-
4lib/core/widgets/answer_box/styles/picture_box.dart
-
6lib/core/widgets/button/my_button.dart
-
59lib/core/widgets/error/error_state.dart
-
6lib/core/widgets/showcase/question_showcase.dart
-
4lib/features/home/presentation/bloc/home_bloc.dart
-
9lib/features/home/presentation/ui/home_page.dart
-
61lib/features/intro/data/datasource/intro_datasource.dart
-
19lib/features/intro/data/repository_impl/intro_repository_impl.dart
-
7lib/features/intro/domain/entities/download_entity.dart
-
4lib/features/intro/domain/repository/intro_repository.dart
-
3lib/features/intro/domain/usecases/loading_stream_usecase.dart
-
16lib/features/intro/domain/usecases/save_levels_usecase.dart
-
41lib/features/intro/presentation/bloc/intro_bloc.dart
-
1lib/features/intro/presentation/bloc/intro_event.dart
-
56lib/features/intro/presentation/ui/intro_page.dart
-
11lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart
-
46lib/features/language/data/datasource/language_datasource.dart
-
29lib/features/language/data/repository_impl/language_repository_impl.dart
-
8lib/features/language/domain/repository/language_repository.dart
-
17lib/features/language/domain/usecases/save_levels_usecase.dart
-
50lib/features/language/presentation/bloc/language_bloc.dart
-
5lib/features/language/presentation/bloc/language_event.dart
-
24lib/features/language/presentation/ui/language_page.dart
-
4lib/features/level/presentation/ui/widgets/level_widget.dart
-
8lib/features/question/presentation/ui/question_page.dart
-
4lib/features/question/presentation/ui/widgets/refresh_button.dart
-
9lib/init_bindings.dart
-
7lib/l10n/app_en.arb
-
30lib/l10n/app_localizations.dart
-
16lib/l10n/app_localizations_en.dart
After Width: 332 | Height: 222 | Size: 14 KiB |
@ -1,21 +0,0 @@ |
|||
import 'dart:async'; |
|||
|
|||
import 'package:flutter/material.dart'; |
|||
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; |
|||
import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; |
|||
import 'package:go_router/go_router.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/local_storage.dart'; |
|||
|
|||
class LanguageMiddleware { |
|||
static const LanguageMiddleware _i = LanguageMiddleware._internal(); |
|||
const LanguageMiddleware._internal(); |
|||
factory LanguageMiddleware() => _i; |
|||
|
|||
static FutureOr<String?> redirect(BuildContext context, GoRouterState state) async { |
|||
if (LocalStorage.readData(key: MyConstants.selectLanguage).isNotEmpty) { |
|||
return Routes.homePage; |
|||
} else { |
|||
return null; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,5 @@ |
|||
extension ConvertSize on double? { |
|||
String get toMB { |
|||
return this == null ? '0.0' : (this! / (1024 * 1024)).toStringAsFixed(1); |
|||
} |
|||
} |
@ -0,0 +1,59 @@ |
|||
import 'package:flutter/material.dart'; |
|||
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; |
|||
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart'; |
|||
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; |
|||
import 'package:hadi_hoda_flutter/common_ui/resources/my_text_style.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/gap.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/my_image.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; |
|||
|
|||
class ErrorState extends StatelessWidget { |
|||
const ErrorState({super.key, this.onTap}); |
|||
|
|||
final VoidCallback? onTap; |
|||
|
|||
@override |
|||
Widget build(BuildContext context) { |
|||
return Column( |
|||
children: [ |
|||
Spacer(), |
|||
Text( |
|||
context.translate.lost_connection, |
|||
style: DinoKids.regular45.copyWith(color: MyColors.white), |
|||
), |
|||
MyImage(image: MyAssets.error), |
|||
MySpaces.s40.gapHeight, |
|||
Text( |
|||
context.translate.connected_to_internet, |
|||
textAlign: TextAlign.center, |
|||
style: Marhey.medium12.copyWith(color: MyColors.white), |
|||
), |
|||
Spacer(), |
|||
SizedBox( |
|||
height: 84, |
|||
width: 194, |
|||
child: InkWell( |
|||
onTap: onTap, |
|||
highlightColor: MyColors.transparent, |
|||
splashColor: MyColors.transparent, |
|||
child: Stack( |
|||
alignment: Alignment.center, |
|||
children: [ |
|||
MyImage(image: MyAssets.button), |
|||
PositionedDirectional( |
|||
top: MySpaces.s8, |
|||
child: Text( |
|||
context.translate.try_again, |
|||
style: DinoKids.regular35.copyWith( |
|||
color: Color(0XFF1D6EFF), |
|||
), |
|||
), |
|||
), |
|||
], |
|||
), |
|||
), |
|||
), |
|||
], |
|||
); |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
class DownloadEntity { |
|||
final double? count; |
|||
final double? total; |
|||
final double? percent; |
|||
|
|||
const DownloadEntity({this.count, this.total, this.percent}); |
|||
} |
@ -1,8 +1,10 @@ |
|||
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/domain/entities/download_entity.dart'; |
|||
|
|||
abstract class IIntroRepository { |
|||
Future<DataState<NoParams, MyException>> getFiles(); |
|||
Stream<double> loadingStream(); |
|||
Future<DataState<NoParams, MyException>> saveLevels(); |
|||
Stream<DownloadEntity> loadingStream(); |
|||
} |
@ -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<NoParams, NoParams> { |
|||
final IIntroRepository repository; |
|||
|
|||
const SaveLevelsUseCase(this.repository); |
|||
|
|||
@override |
|||
Future<DataState<NoParams, MyException>> call(NoParams params) { |
|||
return repository.saveLevels(); |
|||
} |
|||
} |
@ -1,46 +0,0 @@ |
|||
import 'package:hadi_hoda_flutter/core/constants/my_api.dart'; |
|||
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; |
|||
import 'package:hadi_hoda_flutter/core/network/http_request.dart'; |
|||
import 'package:hadi_hoda_flutter/core/params/language_params.dart'; |
|||
import 'package:hadi_hoda_flutter/core/response/base_response.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/local_storage.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:hadi_hoda_flutter/features/level/domain/entity/total_data_entity.dart'; |
|||
import 'package:hive/hive.dart'; |
|||
|
|||
abstract class ILanguageDatasource { |
|||
Future<void> saveLevels({required LanguageParams params}); |
|||
} |
|||
|
|||
class LanguageDatasourceImpl implements ILanguageDatasource { |
|||
final IHttpRequest httpRequest; |
|||
|
|||
const LanguageDatasourceImpl(this.httpRequest); |
|||
|
|||
@override |
|||
Future<void> saveLevels({required LanguageParams params}) async { |
|||
await LocalStorage.saveData( |
|||
key: MyConstants.selectLanguage, |
|||
value: params.code ?? 'fa', |
|||
); |
|||
final Box<TotalDataEntity> data = Hive.box(MyConstants.levelBox); |
|||
final TotalDataEntity findData = data.values.singleWhere( |
|||
(e) => e.code == params.code, |
|||
orElse: () => TotalDataEntity(), |
|||
); |
|||
|
|||
if (findData.code != params.code) { |
|||
final response = await httpRequest.get( |
|||
path: MyApi.levels, |
|||
header: params.toHeader, |
|||
); |
|||
final List<LevelEntity> levels = BaseResponse.getDataList<LevelEntity>( |
|||
response?['result'], |
|||
(json) => LevelModel.fromJson(json), |
|||
); |
|||
|
|||
await data.add(TotalDataEntity(code: params.code, levels: levels)); |
|||
} |
|||
} |
|||
} |
@ -1,29 +0,0 @@ |
|||
import 'package:hadi_hoda_flutter/core/params/language_params.dart'; |
|||
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/language/data/datasource/language_datasource.dart'; |
|||
import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart'; |
|||
|
|||
class LanguageRepositoryImpl implements ILanguageRepository { |
|||
final ILanguageDatasource datasource; |
|||
|
|||
const LanguageRepositoryImpl(this.datasource); |
|||
|
|||
@override |
|||
Future<DataState<NoParams, MyException>> saveLevels({required LanguageParams params}) async { |
|||
try { |
|||
await datasource.saveLevels(params: params); |
|||
return DataState.success(NoParams()); |
|||
} on MyException catch (e) { |
|||
return DataState.error(e); |
|||
} catch (e) { |
|||
if (kDebugMode) { |
|||
rethrow; |
|||
} else { |
|||
return DataState.error(MyException(errorMessage: '$e')); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -1,8 +0,0 @@ |
|||
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; |
|||
import 'package:hadi_hoda_flutter/core/params/language_params.dart'; |
|||
import 'package:hadi_hoda_flutter/core/params/no_params.dart'; |
|||
import 'package:hadi_hoda_flutter/core/utils/data_state.dart'; |
|||
|
|||
abstract class ILanguageRepository { |
|||
Future<DataState<NoParams, MyException>> saveLevels({required LanguageParams params}); |
|||
} |
@ -1,17 +0,0 @@ |
|||
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; |
|||
import 'package:hadi_hoda_flutter/core/params/language_params.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/language/domain/repository/language_repository.dart'; |
|||
|
|||
class SaveLevelsUseCase implements UseCase<NoParams, LanguageParams> { |
|||
final ILanguageRepository repository; |
|||
|
|||
const SaveLevelsUseCase(this.repository); |
|||
|
|||
@override |
|||
Future<DataState<NoParams, MyException>> call(LanguageParams params) { |
|||
return repository.saveLevels(params: params); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue