Browse Source

add: base language feature

pull/12/head
AmirrezaChegini 6 days ago
parent
commit
f71f66125c
  1. 13
      lib/core/params/language_params.dart
  2. 13
      lib/core/routers/my_routes.dart
  3. 28
      lib/features/language/data/datasource/language_datasource.dart
  4. 13
      lib/features/language/data/model/language_model.dart
  5. 29
      lib/features/language/data/repository_impl/language_repository_impl.dart
  6. 14
      lib/features/language/domain/entity/language_entity.dart
  7. 8
      lib/features/language/domain/repository/language_repository.dart
  8. 17
      lib/features/language/domain/usecases/get_language_usecase.dart
  9. 41
      lib/features/language/presentation/bloc/language_bloc.dart
  10. 5
      lib/features/language/presentation/bloc/language_event.dart
  11. 15
      lib/features/language/presentation/bloc/language_state.dart
  12. 10
      lib/features/language/presentation/ui/language_page.dart
  13. 9
      lib/init_bindings.dart

13
lib/core/params/language_params.dart

@ -0,0 +1,13 @@
class LanguageParams {
int? id;
LanguageParams({this.id});
LanguageParams copyWith({
int? id,
}) {
return LanguageParams(
id: id ?? this.id,
);
}
}

13
lib/core/routers/my_routes.dart

@ -5,6 +5,8 @@ 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/language/presentation/bloc/language_bloc.dart';
import 'package:hadi_hoda_flutter/features/language/presentation/ui/language_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';
@ -19,13 +21,14 @@ class Routes {
factory Routes() => _i;
static const String introPage = '/intro_page';
static const String languagePage = '/language_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.introPage,
initialLocation: Routes.languagePage,
navigatorKey: ContextProvider.navigatorKey,
routes: [
GoRoute(
@ -36,6 +39,14 @@ GoRouter get appPages => GoRouter(
child: const IntroPage(),
),
),
GoRoute(
name: Routes.languagePage,
path: Routes.languagePage,
builder: (context, state) => BlocProvider(
create: (context) => LanguageBloc(locator()),
child: const LanguagePage(),
),
),
GoRoute(
name: Routes.homePage,
path: Routes.homePage,

28
lib/features/language/data/datasource/language_datasource.dart

@ -0,0 +1,28 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.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/features/language/data/model/language_model.dart';
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart';
abstract class ILanguageDatasource {
Future<LanguageEntity> getData({required LanguageParams params});
}
class LanguageDatasourceImpl implements ILanguageDatasource {
final IHttpRequest httpRequest;
const LanguageDatasourceImpl(this.httpRequest);
@override
Future<LanguageEntity> getData({required LanguageParams params}) async {
final response = await httpRequest.get(
path: MyApi.baseUrl,
);
return BaseResponse.getData<LanguageEntity>(
response?['data'],
(json) => LanguageModel.fromJson(json),
);
}
}

13
lib/features/language/data/model/language_model.dart

@ -0,0 +1,13 @@
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart';
class LanguageModel extends LanguageEntity {
const LanguageModel({
super.id,
});
factory LanguageModel.fromJson(Map<String, dynamic> json) {
return LanguageModel(
id: json['id'],
);
}
}

29
lib/features/language/data/repository_impl/language_repository_impl.dart

@ -0,0 +1,29 @@
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/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/language/data/datasource/language_datasource.dart';
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.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<LanguageEntity, MyException>> getData({required LanguageParams params}) async {
try {
final LanguageEntity response = await datasource.getData(params: params);
return DataState.success(response);
} on MyException catch (e) {
return DataState.error(e);
} catch (e) {
if (kDebugMode) {
rethrow;
} else {
return DataState.error(MyException(errorMessage: '$e'));
}
}
}
}

14
lib/features/language/domain/entity/language_entity.dart

@ -0,0 +1,14 @@
import 'package:equatable/equatable.dart';
class LanguageEntity extends Equatable {
final int? id;
const LanguageEntity({
this.id,
});
@override
List<Object?> get props => [
id,
];
}

8
lib/features/language/domain/repository/language_repository.dart

@ -0,0 +1,8 @@
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/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart';
abstract class ILanguageRepository {
Future<DataState<LanguageEntity, MyException>> getData({required LanguageParams params});
}

17
lib/features/language/domain/usecases/get_language_usecase.dart

@ -0,0 +1,17 @@
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/usecase/usecase.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart';
import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart';
class GetLanguageUseCase implements UseCase<LanguageEntity, LanguageParams> {
final ILanguageRepository repository;
const GetLanguageUseCase(this.repository);
@override
Future<DataState<LanguageEntity, MyException>> call(LanguageParams params) {
return repository.getData(params: params);
}
}

41
lib/features/language/presentation/bloc/language_bloc.dart

@ -0,0 +1,41 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/language/domain/entity/language_entity.dart';
import 'package:hadi_hoda_flutter/features/language/domain/usecases/get_language_usecase.dart';
import 'package:hadi_hoda_flutter/features/language/presentation/bloc/language_event.dart';
import 'package:hadi_hoda_flutter/features/language/presentation/bloc/language_state.dart';
class LanguageBloc extends Bloc<LanguageEvent, LanguageState> {
/// ------------constructor------------
LanguageBloc(
this._getLanguageUseCase,
) : super(const LanguageState()) {
on<GetLanguageEvent>(_getLanguageEvent);
}
/// ------------UseCases------------
final GetLanguageUseCase _getLanguageUseCase;
/// ------------Variables------------
/// ------------Controllers------------
/// ------------Functions------------
/// ------------Api Calls------------
FutureOr<void> _getLanguageEvent(event, emit) async {
await _getLanguageUseCase(event.languageParams).then(
(value) {
value.fold(
(data) {
emit(state.copyWith(getLanguageStatus: BaseComplete<LanguageEntity>(data)));
},
(error) {
emit(state.copyWith(getLanguageStatus: BaseError(error.errorMessage)));
},
);
},
);
}
}

5
lib/features/language/presentation/bloc/language_event.dart

@ -0,0 +1,5 @@
sealed class LanguageEvent {
const LanguageEvent();
}
class GetLanguageEvent extends LanguageEvent {}

15
lib/features/language/presentation/bloc/language_state.dart

@ -0,0 +1,15 @@
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
class LanguageState {
final BaseStatus getLanguageStatus;
const LanguageState({this.getLanguageStatus = const BaseInit()});
LanguageState copyWith({
BaseStatus? getLanguageStatus,
}) {
return LanguageState(
getLanguageStatus: getLanguageStatus ?? this.getLanguageStatus,
);
}
}

10
lib/features/language/presentation/ui/language_page.dart

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class LanguagePage extends StatelessWidget {
const LanguagePage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold();
}
}

9
lib/init_bindings.dart

@ -12,6 +12,10 @@ import 'package:hadi_hoda_flutter/features/intro/data/repository_impl/intro_repo
import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_files_usecase.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/loading_stream_usecase.dart';
import 'package:hadi_hoda_flutter/features/language/data/datasource/language_datasource.dart';
import 'package:hadi_hoda_flutter/features/language/data/repository_impl/language_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/language/domain/repository/language_repository.dart';
import 'package:hadi_hoda_flutter/features/language/domain/usecases/get_language_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';
@ -49,6 +53,11 @@ void initBindings() {
locator.registerLazySingleton<GetFilesUseCase>(() => GetFilesUseCase(locator()));
locator.registerLazySingleton<LoadingStreamUseCase>(() => LoadingStreamUseCase(locator()));
/// Language Feature
locator.registerLazySingleton<ILanguageDatasource>(() => LanguageDatasourceImpl(locator()));
locator.registerLazySingleton<ILanguageRepository>(() => LanguageRepositoryImpl(locator()));
locator.registerLazySingleton<GetLanguageUseCase>(() => GetLanguageUseCase(locator()));
/// Home Feature
locator.registerLazySingleton<IHomeDatasource>(() => HomeDatasourceImpl(locator()));
locator.registerLazySingleton<IHomeRepository>(() => HomeRepositoryImpl(locator()));

Loading…
Cancel
Save