Files
be_happy_public/lib/presentation/viewmodel/scooter_code_bloc.dart
Polyanka 182be1049b some fix
# Conflicts:
#	lib/presentation/navigation/app_router.dart
#	pubspec.yaml
2026-08-11 00:23:16 +03:00

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,
),
);
}
});
}
}