sync changes

This commit is contained in:
2026-05-12 11:25:19 +03:00
parent 3616f84556
commit fdc5aefdd2
25 changed files with 313 additions and 152 deletions

View File

@@ -36,7 +36,6 @@ class _ActiveRideSheetState extends State<ActiveRideSheet> {
_bloc = getIt<ActiveRideBloc>();
_bloc.add(LoadScooterOrder(widget.orderId));
// Локальный таймер для обновления UI каждую секунду
_localTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (mounted && !_bloc.state.isPaused) {
setState(() {});
@@ -60,7 +59,6 @@ class _ActiveRideSheetState extends State<ActiveRideSheet> {
listener: (context, state) {
if (!state.inZone) {
BotToast.showCustomNotification(
// duration: const Duration(seconds: 4),
toastBuilder: (_) {
return NotificationToast(
@@ -125,8 +123,7 @@ class _ActiveRideSheetState extends State<ActiveRideSheet> {
? state.elapsedTime
: state.elapsedTime + (DateTime.now().difference(DateTime.now().subtract(const Duration(seconds: 1))));
// Для отображения текущего времени в реальном времени
final effectiveElapsedTime = state.isPaused
final effectiveElapsedTime = state.isPaused
? state.elapsedTime
: DateTime.now().difference(state.order?.startAt ?? state.order?.createdAt ?? DateTime.now());
@@ -189,7 +186,6 @@ class _ActiveRideSheetState extends State<ActiveRideSheet> {
const SizedBox(height: 20),
// 🔹 ТАЙМЕР
Container(
width: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 20),

View File

@@ -5,15 +5,23 @@ import 'package:flutter/cupertino.dart';
class TariffInfoSheet extends StatefulWidget {
final Tariff tariff;
final bool isInsurance;
final Function(bool) onChanged;
const TariffInfoSheet({super.key, required this.tariff});
const TariffInfoSheet({super.key, required this.tariff, required this.isInsurance, required this.onChanged});
@override
State<TariffInfoSheet> createState() => _TariffInfoSheetState();
}
class _TariffInfoSheetState extends State<TariffInfoSheet> {
bool _isInsuranceEnabled = true;
late bool _isInsuranceEnabled;
@override
void initState() {
super.initState();
_isInsuranceEnabled = widget.isInsurance;
}
@override
Widget build(BuildContext context) {
@@ -80,7 +88,6 @@ class _TariffInfoSheetState extends State<TariffInfoSheet> {
const Divider(color: Colors.white24, height: 40),
// Страховка
Row(
children: [
const Text(
@@ -100,7 +107,10 @@ class _TariffInfoSheetState extends State<TariffInfoSheet> {
child: CupertinoSwitch(
value: _isInsuranceEnabled,
activeColor: const Color(0xFF66E3C4),
onChanged: (val) => setState(() => _isInsuranceEnabled = val),
onChanged: (val) {
setState(() => _isInsuranceEnabled = val);
widget.onChanged(val);
},
),
),
],
@@ -108,7 +118,6 @@ class _TariffInfoSheetState extends State<TariffInfoSheet> {
const Divider(color: Colors.white24, height: 40),
// Список правил (Bullet points)
_buildInfoBullet('Оплата страховки осуществляется только по банковской карте отдельным платежом'),
_buildInfoBullet('В режиме паузы время тарифа приостанавливается'),
_buildInfoBullet('При старте заказа будет заблокирована сумма в размере 7 рублей для проверки платежеспособности. Сумма разблокируется по факту списания средств за поездку.'),

View File

@@ -30,7 +30,6 @@ class TariffSheet extends StatefulWidget {
class _TariffSheetState extends State<TariffSheet> {
int? _selectedTariffIndex;
bool _hasPaymentCard = true;
@override
void initState() {
@@ -40,7 +39,27 @@ class _TariffSheetState extends State<TariffSheet> {
@override
Widget build(BuildContext context) {
return BlocBuilder<TariffSheetBloc, TariffSheetState>(
return BlocConsumer<TariffSheetBloc, TariffSheetState>(
listener: (context, state) {
if (state.status == TariffSheetStatus.failure && state.errorMessage != null) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
state.errorMessage!,
style: const TextStyle(color: Colors.white),
),
backgroundColor: Colors.redAccent.withOpacity(0.9),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
margin: const EdgeInsets.all(20),
duration: const Duration(seconds: 3),
),
);
}
},
builder: (context, state) {
if (state.status == TariffSheetStatus.loading) {
return Align(
@@ -193,7 +212,7 @@ class _TariffSheetState extends State<TariffSheet> {
bottom: 0,
child: Center(
child: Text(
'${widget.scooter.batteryLevel.toInt()}%', // ✅ Цифры
'${widget.scooter.batteryLevel.toInt()}%',
style: const TextStyle(
color: Colors.white,
fontSize: 10,
@@ -245,6 +264,7 @@ class _TariffSheetState extends State<TariffSheet> {
'Минута на паузе ${tariff.pausePrice.toStringAsFixed(0)} ${tariff.currency}',
],
isSelected: _selectedTariffIndex == index,
isInsurance: state.isInsurance,
tariff: tariff,
onTap: () {
setState(() {
@@ -380,7 +400,7 @@ class _TariffSheetState extends State<TariffSheet> {
0,
state.useBalance ? null : state.selectedCard?.id,
state.useBalance,
false
state.isInsurance
)
);
context.pushReplacement('/home/current-rides-sheet');
@@ -421,6 +441,7 @@ class _TariffCard extends StatelessWidget {
final String currency;
final String subtitle;
final List<String> details;
final bool isInsurance;
final bool isSelected;
final VoidCallback onTap;
@@ -432,6 +453,7 @@ class _TariffCard extends StatelessWidget {
required this.subtitle,
required this.details,
required this.isSelected,
required this.isInsurance,
required this.onTap,
});
@@ -448,14 +470,11 @@ class _TariffCard extends StatelessWidget {
: Colors.white.withOpacity(0.19),
borderRadius: BorderRadius.circular(20),
),
// Используем Stack, чтобы наложить кнопку поверх контента
child: Stack(
children: [
// Основной контент карточки
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Заголовок с иконкой часов
Row(
children: [
const Icon(
@@ -531,8 +550,16 @@ class _TariffCard extends StatelessWidget {
context: context,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => TariffInfoSheet(tariff: tariff),
builder: (context) => TariffInfoSheet(
tariff: tariff,
isInsurance: isInsurance,
onChanged: (val) {
context.read<TariffSheetBloc>().add(InsuranceToggled(val));
}),
);
print('Info pressed for $title');
},
child: Image.asset(