Files
be_happy_public/lib/presentation/components/side_menu.dart
2026-05-12 12:02:40 +03:00

187 lines
6.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:be_happy/presentation/viewmodel/map_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import '../../core/app_colors.dart';
import '../event/map_event.dart';
class SideMenu extends StatelessWidget {
const SideMenu({super.key,});
@override
Widget build(BuildContext context) {
final state = context.watch<MapBloc>().state;
return Drawer(
child: Container(
decoration: BoxDecoration(
gradient: AppColors.phoneScreenBg,
),
child: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Заголовок
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Добро пожаловать!',
style: TextStyle(
color: AppColors.smsDigit,
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 4),
Text(
state.phoneNumber ?? "Загрузка...",
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
),
),
const SizedBox(height: 4),
Text(
'Баланс ${state.balance} руб.',
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
),
),
],
),
),
const Divider(color: Colors.white30, height: 1),
Expanded(
child: SingleChildScrollView(
child: Column(
children: [
// Пункты меню
Column(
children: [
_MenuItem(
icon: 'assets/icons/person_icon.png',
title: 'Профиль',
onTap: () => {
context.go('/home/profile'),
},
),
_MenuItem(
icon: 'assets/icons/list_star_icon.png',
title: 'История поездок',
onTap: () => context.go("/home/order-history"),
),
const Divider(color: Colors.white30, height: 1),
_MenuItem(
icon: 'assets/icons/creditcard_icon.png',
title: 'Способ оплаты',
onTap: () => context.go("/home/payment-methods"),
),
_MenuItem(
icon: 'assets/icons/promo_icon.png',
title: 'Промокоды',
onTap: () => context.go("/home/promo"),
),
_MenuItem(
icon: 'assets/icons/plans_icon.png',
title: 'Абонементы',
onTap: () => context.push("/home/subscriptions"),
),
const Divider(color: Colors.white30, height: 1),
_MenuItem(
icon: 'assets/icons/magazine_icon.png',
title: 'Правила пользования самокатом',
onTap: () => context.go("/home/rules")
),
_MenuItem(
icon: 'assets/icons/headphones_icon.png',
title: 'Техподдержка',
onTap: () => {
context.go('/home/support'),
},
),
_MenuItem(
icon: 'assets/icons/doc_icon.png',
title: 'Документы',
onTap: () => context.go("/home/documents"),
),
_MenuItem(
icon: 'assets/icons/news_icon.png',
title: 'Новости',
onTap: () => context.go("/home/news"),
),
const Divider(color: Colors.white30, height: 1),
_MenuItem(
icon: 'assets/icons/logout_icon.png',
title: 'Выход',
onTap: () => {
context.go('/login'),
context.read<MapBloc>().stopNotificationStream(),
context.read<MapBloc>().add(LogoutPressed()),
},
),
],
),
// Картинка внизу (внутри скролла)
Padding(
padding: const EdgeInsets.only(top: 2),
child: Image.asset(
'assets/wave.png',
width: double.infinity,
fit: BoxFit.fitWidth,
),
),
],
),
),
),
],
),
),
)
);
}
}
class _MenuItem extends StatelessWidget {
final String icon;
final String title;
final Color? color;
final VoidCallback onTap;
const _MenuItem({
required this.icon,
required this.title,
required this.onTap,
this.color,
});
@override
Widget build(BuildContext context) {
return ListTile(
leading: Image.asset(
icon,
width: 24,
height: 24
),
title: Text(
title,
style: TextStyle(
color: color ?? Colors.white,
fontSize: 14,
fontWeight: FontWeight.w500,
),
),
onTap: onTap,
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5),
);
}
}