79 lines
2.7 KiB
Dart
79 lines
2.7 KiB
Dart
import 'package:be_happy/domain/entities/scooter.dart';
|
|
import 'package:be_happy/domain/usecase/get_scooter_by_title_usecase.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:geolocator/geolocator.dart';
|
|
import 'package:yandex_mapkit/yandex_mapkit.dart';
|
|
|
|
import '../../core/result.dart';
|
|
import '../../domain/usecase/get_address_by_point_usecase.dart';
|
|
import '../../domain/usecase/get_pedestrian_routes_usecase.dart';
|
|
import '../event/scooter_code_event.dart';
|
|
import '../state/scooter_code_state.dart';
|
|
|
|
class ScooterCodeBloc extends Bloc<ScooterCodeEvent, ScooterCodeState> {
|
|
final GetScooterByTitleUsecase getScooterByTitleUsecase;
|
|
final GetAddressByPointUsecase getAddressUsecase;
|
|
final GetPedestrianRoutesUsecase getPedestrianRoutesUsecase;
|
|
|
|
ScooterCodeBloc({
|
|
required this.getScooterByTitleUsecase,
|
|
required this.getAddressUsecase,
|
|
required this.getPedestrianRoutesUsecase,
|
|
}) : super(const ScooterCodeInitial()) {
|
|
on<ScooterCodeChanged>((event, emit) {
|
|
emit(ScooterCodeInitial(code: event.code));
|
|
});
|
|
|
|
on<ScooterCodeSubmitted>((event, emit) async {
|
|
emit(ScooterCodeLoading(code: event.code));
|
|
|
|
final result = await getScooterByTitleUsecase(event.code);
|
|
|
|
switch (result) {
|
|
case Success(:final data):
|
|
if (data != null) {
|
|
final String currentAddress = await getAddressUsecase(
|
|
data.longitude,
|
|
data.latitude,
|
|
);
|
|
|
|
final position = await Geolocator.getCurrentPosition(
|
|
desiredAccuracy: LocationAccuracy.high,
|
|
);
|
|
|
|
final routes = await getPedestrianRoutesUsecase(
|
|
Point(latitude: position.latitude, longitude: position.longitude),
|
|
Point(latitude: data.longitude, longitude: data.latitude),
|
|
);
|
|
|
|
final distance =
|
|
routes?.firstOrNull?.metadata.weight.walkingDistance.value;
|
|
print("Distance is: $distance");
|
|
final time = routes?.firstOrNull?.metadata.weight.time.value;
|
|
|
|
data.distance = distance;
|
|
data.timeToTravel = time;
|
|
|
|
emit(
|
|
ScooterCodeSuccess(
|
|
data,
|
|
code: event.code,
|
|
address: currentAddress,
|
|
distance: distance ?? 0.0,
|
|
),
|
|
);
|
|
} else {
|
|
emit(ScooterCodeFailure("Самокат не найден", code: event.code));
|
|
}
|
|
case Failure(:final failure):
|
|
emit(
|
|
ScooterCodeFailure(
|
|
failure.message ?? "Неизвестная ошибка",
|
|
code: event.code,
|
|
),
|
|
);
|
|
}
|
|
});
|
|
}
|
|
}
|