Browse Source

fix: step on level page

pull/15/head
AmirrezaChegini 3 days ago
parent
commit
cb86ea65f5
  1. 2
      lib/core/routers/my_routes.dart
  2. 4
      lib/features/level/data/datasource/level_datasource.dart
  3. 30
      lib/features/level/presentation/bloc/level_bloc.dart
  4. 1
      lib/features/level/presentation/bloc/level_event.dart
  5. 26
      lib/features/level/presentation/ui/level_page.dart
  6. 9
      lib/features/level/presentation/ui/widgets/hint_level_widget.dart
  7. 3
      lib/l10n/app_en.arb
  8. 6
      lib/l10n/app_localizations.dart
  9. 3
      lib/l10n/app_localizations_en.dart

2
lib/core/routers/my_routes.dart

@ -60,7 +60,7 @@ GoRouter get appPages => GoRouter(
name: Routes.levelPage, name: Routes.levelPage,
path: Routes.levelPage, path: Routes.levelPage,
builder: (context, state) => BlocProvider( builder: (context, state) => BlocProvider(
create: (context) => LevelBloc(locator())..add(GetLevelListEvent()),
create: (context) => LevelBloc(locator())..add(SetCurrentLevelEvent()),
child: const LevelPage(), child: const LevelPage(),
), ),
), ),

4
lib/features/level/data/datasource/level_datasource.dart

@ -20,8 +20,8 @@ class LocalLevelDatasourceImpl implements ILevelDatasource {
final String selectedLanguage = LocalStorage.readData( final String selectedLanguage = LocalStorage.readData(
key: MyConstants.selectLanguage); key: MyConstants.selectLanguage);
final Box<TotalDataEntity> levelBox = Hive.box(MyConstants.levelBox); final Box<TotalDataEntity> levelBox = Hive.box(MyConstants.levelBox);
final TotalDataEntity findData = levelBox.values.singleWhere((e) =>
e.code == selectedLanguage,
final TotalDataEntity findData = levelBox.values.singleWhere(
(e) => e.code == selectedLanguage,
orElse: () => TotalDataEntity(), orElse: () => TotalDataEntity(),
); );
return findData.levels ?? []; return findData.levels ?? [];

30
lib/features/level/presentation/bloc/level_bloc.dart

@ -20,6 +20,7 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
this._getLeveslUseCase, this._getLeveslUseCase,
) : super(const LevelState()) { ) : super(const LevelState()) {
on<GetLevelListEvent>(_getLevelListEvent); on<GetLevelListEvent>(_getLevelListEvent);
on<SetCurrentLevelEvent>(_setCurrentLevelEvent);
on<StartScrollEvent>(_startScrollEvent); on<StartScrollEvent>(_startScrollEvent);
} }
@ -81,10 +82,9 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
} }
LevelType getLevelType(int index) { LevelType getLevelType(int index) {
final int currentLevel = int.parse(LocalStorage
.readData(key: MyConstants.currentLevel)
.isEmpty ? '1' : LocalStorage
.readData(key: MyConstants.currentLevel));
final int currentLevel = int.parse(
LocalStorage.readData(key: MyConstants.currentLevel),
);
if (index < currentLevel) { if (index < currentLevel) {
return LevelType.finished; return LevelType.finished;
@ -98,6 +98,9 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
/// ------------Api Calls------------ /// ------------Api Calls------------
FutureOr<void> _getLevelListEvent(GetLevelListEvent event, FutureOr<void> _getLevelListEvent(GetLevelListEvent event,
Emitter<LevelState> emit) async { Emitter<LevelState> emit) async {
final int currentLevel = int.parse(
LocalStorage.readData(key: MyConstants.currentLevel),
);
await _getLeveslUseCase(LevelParams()).then((value) { await _getLeveslUseCase(LevelParams()).then((value) {
value.fold( value.fold(
(data) async { (data) async {
@ -107,7 +110,7 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
} }
emit(state.copyWith( emit(state.copyWith(
getLevelStatus: const BaseComplete(''), getLevelStatus: const BaseComplete(''),
chooseLevel: data.first,
chooseLevel: data.singleWhere((e) => e.order == currentLevel),
)); ));
add(StartScrollEvent()); add(StartScrollEvent());
}, },
@ -120,10 +123,9 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
StartScrollEvent event, StartScrollEvent event,
Emitter<LevelState> emit, Emitter<LevelState> emit,
) async { ) async {
final int currentLevel = int.parse(LocalStorage
.readData(key: MyConstants.currentLevel)
.isEmpty ? '1' : LocalStorage
.readData(key: MyConstants.currentLevel));
final int currentLevel = int.parse(
LocalStorage.readData(key: MyConstants.currentLevel),
);
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 1));
if (scrollController.hasClients) { if (scrollController.hasClients) {
@ -142,4 +144,14 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
} }
} }
} }
FutureOr<void> _setCurrentLevelEvent(SetCurrentLevelEvent event,
Emitter<LevelState> emit) async {
final String currentLevel = LocalStorage.readData(
key: MyConstants.currentLevel);
if (currentLevel.isEmpty) {
await LocalStorage.saveData(key: MyConstants.currentLevel, value: '1');
}
add(GetLevelListEvent());
}
} }

1
lib/features/level/presentation/bloc/level_event.dart

@ -6,6 +6,7 @@ sealed class LevelEvent {
class GetLevelListEvent extends LevelEvent {} class GetLevelListEvent extends LevelEvent {}
class StartScrollEvent extends LevelEvent {} class StartScrollEvent extends LevelEvent {}
class SetCurrentLevelEvent extends LevelEvent {}
class ChooseLevelEvent extends LevelEvent { class ChooseLevelEvent extends LevelEvent {
final LevelEntity level; final LevelEntity level;
const ChooseLevelEvent(this.level); const ChooseLevelEvent(this.level);

26
lib/features/level/presentation/ui/level_page.dart

@ -43,22 +43,16 @@ class LevelPage extends StatelessWidget {
buildWhen: (previous, current) => buildWhen: (previous, current) =>
previous.chooseLevel?.id != current.chooseLevel?.id, previous.chooseLevel?.id != current.chooseLevel?.id,
builder: (context, state) { builder: (context, state) {
if (state.chooseLevel != null) {
return Positioned(
bottom: MediaQuery
.viewPaddingOf(context)
.bottom + MySpaces.s10,
right: MySpaces.s16,
left: MySpaces.s16,
child: HintLevelWidget(
level: state.chooseLevel ?? LevelEntity(),
onTap: (level) =>
context.read<LevelBloc>().goToQuestionPage(context, level),
),
);
} else {
return SizedBox.shrink();
}
return Positioned(
bottom: MediaQuery.viewPaddingOf(context).bottom + MySpaces.s10,
right: MySpaces.s16,
left: MySpaces.s16,
child: HintLevelWidget(
level: state.chooseLevel ?? LevelEntity(),
onTap: (level) =>
context.read<LevelBloc>().goToQuestionPage(context, level),
),
);
} }
); );
} }

9
lib/features/level/presentation/ui/widgets/hint_level_widget.dart

@ -3,12 +3,17 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.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/common_ui/resources/my_text_style.dart';
import 'package:hadi_hoda_flutter/core/utils/my_image.dart'; import 'package:hadi_hoda_flutter/core/utils/my_image.dart';
import 'package:hadi_hoda_flutter/core/utils/my_localization.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/core/widgets/answer_box/styles/text_box.dart'; import 'package:hadi_hoda_flutter/core/widgets/answer_box/styles/text_box.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
class HintLevelWidget extends StatelessWidget { class HintLevelWidget extends StatelessWidget {
const HintLevelWidget({super.key, required this.level, this.onTap,});
const HintLevelWidget({
super.key,
required this.level,
this.onTap,
});
final LevelEntity level; final LevelEntity level;
final Function(LevelEntity level)? onTap; final Function(LevelEntity level)? onTap;
@ -36,7 +41,7 @@ class HintLevelWidget extends StatelessWidget {
spacing: MySpaces.s8, spacing: MySpaces.s8,
children: [ children: [
Text( Text(
'Step ${level.order ?? 0}',
'${context.translate.step} ${level.order ?? 0}',
style: Marhey.bold14.copyWith( style: Marhey.bold14.copyWith(
color: Color(0xFFD8490B), color: Color(0xFFD8490B),
), ),

3
lib/l10n/app_en.arb

@ -9,5 +9,6 @@
"lost_connection": "Lost connection!", "lost_connection": "Lost connection!",
"try_again": "Try Again", "try_again": "Try Again",
"connected_to_internet": "You must be connected to the internet to download the initial game data.", "connected_to_internet": "You must be connected to the internet to download the initial game data.",
"start": "Start"
"start": "Start",
"step": "Step"
} }

6
lib/l10n/app_localizations.dart

@ -159,6 +159,12 @@ abstract class AppLocalizations {
/// In en, this message translates to: /// In en, this message translates to:
/// **'Start'** /// **'Start'**
String get start; String get start;
/// No description provided for @step.
///
/// In en, this message translates to:
/// **'Step'**
String get step;
} }
class _AppLocalizationsDelegate class _AppLocalizationsDelegate

3
lib/l10n/app_localizations_en.dart

@ -42,4 +42,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get start => 'Start'; String get start => 'Start';
@override
String get step => 'Step';
} }
Loading…
Cancel
Save