Browse Source

add: get levels logic

pull/9/head
AmirrezaChegini 1 week ago
parent
commit
a4ba5f4c8f
  1. 31
      lib/features/level/data/datasource/level_datasource.dart
  2. 10
      lib/features/level/data/model/level_model.dart
  3. 10
      lib/features/level/data/repository_impl/level_repository_impl.dart
  4. 4
      lib/features/level/domain/entity/level_location.dart
  5. 2
      lib/features/level/domain/repository/level_repository.dart
  6. 6
      lib/features/level/domain/usecases/get_level_usecase.dart
  7. 75
      lib/features/level/presentation/bloc/level_bloc.dart
  8. 2
      lib/features/level/presentation/bloc/level_event.dart
  9. 79
      lib/features/level/presentation/ui/level_page.dart

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

@ -1,28 +1,49 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.dart'; 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/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/network/http_request.dart'; import 'package:hadi_hoda_flutter/core/network/http_request.dart';
import 'package:hadi_hoda_flutter/core/params/level_params.dart'; import 'package:hadi_hoda_flutter/core/params/level_params.dart';
import 'package:hadi_hoda_flutter/core/response/base_response.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/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/level_entity.dart';
import 'package:hive/hive.dart';
abstract class ILevelDatasource { abstract class ILevelDatasource {
Future<LevelEntity> getData({required LevelParams params});
Future<List<LevelEntity>> getLevels({required LevelParams params});
} }
class LevelDatasourceImpl implements ILevelDatasource {
/// Remote
class RemoteLevelDatasourceImpl implements ILevelDatasource {
final IHttpRequest httpRequest; final IHttpRequest httpRequest;
const LevelDatasourceImpl(this.httpRequest);
const RemoteLevelDatasourceImpl(this.httpRequest);
@override @override
Future<LevelEntity> getData({required LevelParams params}) async {
Future<List<LevelEntity>> getLevels({required LevelParams params}) async {
final response = await httpRequest.get( final response = await httpRequest.get(
path: MyApi.baseUrl, path: MyApi.baseUrl,
); );
return BaseResponse.getData<LevelEntity>(
return BaseResponse.getDataList<LevelEntity>(
response?['data'], response?['data'],
(json) => LevelModel.fromJson(json), (json) => LevelModel.fromJson(json),
); );
} }
} }
/// Local
class LocalLevelDatasourceImpl implements ILevelDatasource {
const LocalLevelDatasourceImpl();
@override
Future<List<LevelEntity>> getLevels({required LevelParams params}) async {
try {
final Box<LevelEntity> levelBox = Hive.box(MyConstants.levelBox);
return levelBox.values.toList();
} catch (_) {
throw MyException(errorMessage: 'Operation Failed');
}
}
}

10
lib/features/level/data/model/level_model.dart

@ -1,13 +1,23 @@
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/data/model/question_model.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
class LevelModel extends LevelEntity { class LevelModel extends LevelEntity {
LevelModel({ LevelModel({
super.id, super.id,
super.order,
super.title,
super.questions,
}); });
factory LevelModel.fromJson(Map<String, dynamic> json) { factory LevelModel.fromJson(Map<String, dynamic> json) {
return LevelModel( return LevelModel(
id: json['id'], id: json['id'],
order: json['order'],
title: json['title'],
questions: json['questions']
?.map<QuestionEntity>((e) => QuestionModel.fromJson(e))
.toList(),
); );
} }
} }

10
lib/features/level/data/repository_impl/level_repository_impl.dart

@ -1,6 +1,6 @@
import 'package:hadi_hoda_flutter/core/params/level_params.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart'; import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/level_params.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart'; import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasource.dart'; import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasource.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';
@ -12,9 +12,13 @@ class LevelRepositoryImpl implements ILevelRepository {
const LevelRepositoryImpl(this.datasource); const LevelRepositoryImpl(this.datasource);
@override @override
Future<DataState<LevelEntity, MyException>> getData({required LevelParams params}) async {
Future<DataState<List<LevelEntity>, MyException>> getLevels({
required LevelParams params,
}) async {
try { try {
final LevelEntity response = await datasource.getData(params: params);
final List<LevelEntity> response = await datasource.getLevels(
params: params,
);
return DataState.success(response); return DataState.success(response);
} on MyException catch (e) { } on MyException catch (e) {
return DataState.error(e); return DataState.error(e);

4
lib/features/level/domain/entity/level_location.dart

@ -1,11 +1,11 @@
class MissionLocation {
class LevelLocation {
final int? index; final int? index;
final double? top; final double? top;
final double? bottom; final double? bottom;
final double? right; final double? right;
final double? left; final double? left;
const MissionLocation({
const LevelLocation({
this.index, this.index,
this.top, this.top,
this.bottom, this.bottom,

2
lib/features/level/domain/repository/level_repository.dart

@ -4,5 +4,5 @@ import 'package:hadi_hoda_flutter/core/utils/data_state.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';
abstract class ILevelRepository { abstract class ILevelRepository {
Future<DataState<LevelEntity, MyException>> getData({required LevelParams params});
Future<DataState<List<LevelEntity>, MyException>> getLevels({required LevelParams params});
} }

6
lib/features/level/domain/usecases/get_level_usecase.dart

@ -5,13 +5,13 @@ import 'package:hadi_hoda_flutter/core/utils/data_state.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';
import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart'; import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
class GetLevelUseCase implements UseCase<LevelEntity, LevelParams> {
class GetLevelUseCase implements UseCase<List<LevelEntity>, LevelParams> {
final ILevelRepository repository; final ILevelRepository repository;
const GetLevelUseCase(this.repository); const GetLevelUseCase(this.repository);
@override @override
Future<DataState<LevelEntity, MyException>> call(LevelParams params) {
return repository.getData(params: params);
Future<DataState<List<LevelEntity>, MyException>> call(LevelParams params) {
return repository.getLevels(params: params);
} }
} }

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

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:hadi_hoda_flutter/core/params/level_params.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart'; import 'package:hadi_hoda_flutter/core/status/base_status.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';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_location.dart'; import 'package:hadi_hoda_flutter/features/level/domain/entity/level_location.dart';
@ -12,56 +13,58 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
LevelBloc( LevelBloc(
this._getLevelUseCase, this._getLevelUseCase,
) : super(const LevelState()) { ) : super(const LevelState()) {
on<GetLevelEvent>(_getLevelEvent);
on<GetLevelListEvent>(_getLevelListEvent);
} }
/// ------------UseCases------------ /// ------------UseCases------------
final GetLevelUseCase _getLevelUseCase; final GetLevelUseCase _getLevelUseCase;
/// ------------Variables------------ /// ------------Variables------------
final List<MissionLocation> bottomLocationList = [
MissionLocation(bottom: -30, left: 30, index: 1),
MissionLocation(bottom: 50, left: 100, index: 2),
MissionLocation(bottom: 150, left: 60, index: 3),
MissionLocation(bottom: 210, left: 120, index: 4),
MissionLocation(bottom: 250, right: 60, index: 5),
MissionLocation(top: 170, right: 40, index: 6),
MissionLocation(top: 70, right: 70, index: 7),
MissionLocation(top: -20, right: 70, index: 8),
final List<LevelLocation> bottomLocationList = [
LevelLocation(bottom: -30, left: 30, index: 1),
LevelLocation(bottom: 50, left: 100, index: 2),
LevelLocation(bottom: 150, left: 60, index: 3),
LevelLocation(bottom: 210, left: 120, index: 4),
LevelLocation(bottom: 250, right: 60, index: 5),
LevelLocation(top: 170, right: 40, index: 6),
LevelLocation(top: 70, right: 70, index: 7),
LevelLocation(top: -20, right: 70, index: 8),
]; ];
final List<MissionLocation> topLocationList = [
MissionLocation(bottom: 30, right: 80, index: 9),
MissionLocation(bottom: 70, left: 20, index: 10),
MissionLocation(bottom: 150, left: 50, index: 11),
MissionLocation(bottom: 180, left: 140, index: 12),
MissionLocation(bottom: 260, right: 20, index: 13),
MissionLocation(bottom: 370, right: 30, index: 14),
MissionLocation(bottom: 420, left: 40, index: 15),
MissionLocation(top: 410, left: 0, index: 16),
MissionLocation(top: 320, left: 60, index: 17),
MissionLocation(top: 220, left: 80, index: 18),
MissionLocation(top: 130, left: 20, index: 19),
MissionLocation(top: 50, left: 70, index: 20),
final List<LevelLocation> topLocationList = [
LevelLocation(bottom: 30, right: 80, index: 9),
LevelLocation(bottom: 70, left: 20, index: 10),
LevelLocation(bottom: 150, left: 50, index: 11),
LevelLocation(bottom: 180, left: 140, index: 12),
LevelLocation(bottom: 260, right: 20, index: 13),
LevelLocation(bottom: 370, right: 30, index: 14),
LevelLocation(bottom: 420, left: 40, index: 15),
LevelLocation(top: 410, left: 0, index: 16),
LevelLocation(top: 320, left: 60, index: 17),
LevelLocation(top: 220, left: 80, index: 18),
LevelLocation(top: 130, left: 20, index: 19),
LevelLocation(top: 50, left: 70, index: 20),
]; ];
final List<LevelEntity> bottom8LevelList = [];
final List<LevelEntity> top12LevelList = [];
/// ------------Controllers------------ /// ------------Controllers------------
/// ------------Functions------------ /// ------------Functions------------
/// ------------Api Calls------------ /// ------------Api Calls------------
FutureOr<void> _getLevelEvent(event, emit) async {
await _getLevelUseCase(event.levelParams).then(
(value) {
value.fold(
(data) {
emit(state.copyWith(getLevelStatus: BaseComplete<LevelEntity>(data)));
},
(error) {
emit(state.copyWith(getLevelStatus: BaseError(error.errorMessage)));
},
);
},
);
FutureOr<void> _getLevelListEvent(GetLevelListEvent event,
Emitter<LevelState> emit) async {
await _getLevelUseCase(LevelParams()).then((value) {
value.fold(
(data) {
bottom8LevelList.addAll(data.take(8));
top12LevelList.addAll(data.sublist(8, 20));
emit(state.copyWith(getLevelStatus: const BaseComplete('')));
},
(error) {},
);
});
} }
} }

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

@ -2,4 +2,4 @@ sealed class LevelEvent {
const LevelEvent(); const LevelEvent();
} }
class GetLevelEvent extends LevelEvent {}
class GetLevelListEvent extends LevelEvent {}

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

@ -5,6 +5,7 @@ import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.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/screen_size.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_state.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/bottom_path.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/bottom_path.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/hint_level_widget.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/hint_level_widget.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/level_widget.dart'; import 'package:hadi_hoda_flutter/features/level/presentation/ui/widgets/level_widget.dart';
@ -71,25 +72,27 @@ class LevelPage extends StatelessWidget {
return Positioned( return Positioned(
top: context.heightScreen * 0.16, top: context.heightScreen * 0.16,
left: context.widthScreen * 0.15, left: context.widthScreen * 0.15,
child: Stack(
children: [
TopPath(
height: 950,
width: context.widthScreen * 0.6,
),
...List.generate(
context.read<LevelBloc>().topLocationList.length,
(index) => Positioned(
top: context.read<LevelBloc>().topLocationList[index].top,
bottom: context.read<LevelBloc>().topLocationList[index].bottom,
right: context.read<LevelBloc>().topLocationList[index].right,
left: context.read<LevelBloc>().topLocationList[index].left,
child: LevelWidget(
index: context.read<LevelBloc>().topLocationList[index].index ?? 0,
child: BlocBuilder<LevelBloc, LevelState>(
builder: (context, state) => Stack(
children: [
TopPath(
height: 950,
width: context.widthScreen * 0.6,
),
...List.generate(
context.read<LevelBloc>().top12LevelList.length,
(index) => Positioned(
top: context.read<LevelBloc>().topLocationList[index].top,
bottom: context.read<LevelBloc>().topLocationList[index].bottom,
right: context.read<LevelBloc>().topLocationList[index].right,
left: context.read<LevelBloc>().topLocationList[index].left,
child: LevelWidget(
index: context.read<LevelBloc>().topLocationList[index].index ?? 0,
),
), ),
),
),
],
),
],
),
), ),
); );
} }
@ -98,26 +101,28 @@ class LevelPage extends StatelessWidget {
return Positioned( return Positioned(
bottom: context.heightScreen * 0.18, bottom: context.heightScreen * 0.18,
left: context.widthScreen * 0.2, left: context.widthScreen * 0.2,
child: Stack(
clipBehavior: Clip.none,
children: [
BottomPath(
width: context.widthScreen * 0.75,
height: context.heightScreen * 0.6,
),
...List.generate(
context.read<LevelBloc>().bottomLocationList.length,
(index) => Positioned(
top: context.read<LevelBloc>().bottomLocationList[index].top,
bottom: context.read<LevelBloc>().bottomLocationList[index].bottom,
right: context.read<LevelBloc>().bottomLocationList[index].right,
left: context.read<LevelBloc>().bottomLocationList[index].left,
child: LevelWidget(
index: context.read<LevelBloc>().bottomLocationList[index].index ?? 0,
child: BlocBuilder<LevelBloc, LevelState>(
builder: (context, state) => Stack(
clipBehavior: Clip.none,
children: [
BottomPath(
width: context.widthScreen * 0.75,
height: context.heightScreen * 0.6,
),
...List.generate(
context.read<LevelBloc>().bottom8LevelList.length,
(index) => Positioned(
top: context.read<LevelBloc>().bottomLocationList[index].top,
bottom: context.read<LevelBloc>().bottomLocationList[index].bottom,
right: context.read<LevelBloc>().bottomLocationList[index].right,
left: context.read<LevelBloc>().bottomLocationList[index].left,
child: LevelWidget(
index: context.read<LevelBloc>().bottomLocationList[index].index ?? 0,
),
), ),
),
),
],
),
],
),
), ),
); );
} }

Loading…
Cancel
Save