Files
eatvio_app/lib/features/menu/presentation/pages/menu_screen.dart
2024-12-18 12:46:19 +03:00

177 lines
5.8 KiB
Dart

import 'package:dio/dio.dart';
import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/token_storage.dart';
import 'package:eatvio_app/core/utils/image_constant.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
class MenuScreen extends StatelessWidget {
MenuScreen({super.key});
final baseUrlController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: Text('Меню'),
actions: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: GestureDetector(
onLongPress: () {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Base url без https:// и /api'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
CustomTextFormField(
controller: baseUrlController,
hintText: 'dev2.eatvio.com',
),
const SizedBox(height: 12),
InkWell(
onTap: () async {
await TokenStorage.removeTokenInStorage();
GoRouter.of(context).go('/auth-screen');
baseUrl = 'https://${baseUrlController.text}';
sl<Dio>().options.baseUrl = baseUrl;
},
borderRadius: BorderRadius.circular(20),
child: Ink(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: appTheme.blueA400,
),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
alignment: Alignment.center,
child: Text(
'Сохранить',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
),
),
),
),
),
],
),
),
);
},
),
),
],
),
body: SingleChildScrollView(
child: Column(
children: [
_tile(
title: 'Настройки профиля',
leading: ImageConstant.icnProfileSettings,
onTap: () => GoRouter.of(context).push('/settings-screen'),
),
_divider(context),
_tile(
leading: ImageConstant.icnRecipes,
title: 'Мои рецепты',
onTap: () => GoRouter.of(context).push('/recipe-select-screen'),
),
_divider(context),
_tile(
leading: 'assets/icons/diets.svg',
title: 'Мои диеты',
onTap: () => GoRouter.of(context).push('/diet-select-screen'),
),
_divider(context),
_tile(
leading: ImageConstant.icnPlans,
title: 'Мои планы',
onTap: () => GoRouter.of(context).push('/plan-select-screen'),
),
_divider(context),
_tile(
leading: 'assets/icons/calendar.svg',
title: 'Календарь',
onTap: () => GoRouter.of(context).push('/calendar-screen'),
),
_divider(context),
_tile(
leading: ImageConstant.icnGlossary,
title: 'Глоссарий',
onTap: () => GoRouter.of(context).push('/glossary-screen'),
),
_divider(context),
_tile(
leading: ImageConstant.icnSupport,
title: 'Поддержка',
onTap: () {},
),
_divider(context),
_tile(
leading: ImageConstant.icnExit,
title: 'Выход',
onTap: _onTapLogout(context),
),
],
),
),
);
}
_tile({
required String title,
required String leading,
required Function() onTap,
}) {
return ListTile(
onTap: onTap,
leading: SvgPicture.asset(
leading,
height: 24,
width: 24,
colorFilter: ColorFilter.mode(appTheme.blueA400, BlendMode.srcIn),
),
title: Text(title),
trailing: Icon(
Icons.arrow_forward_ios_rounded,
size: 12,
color: Colors.black38,
),
);
}
_divider(BuildContext context) {
return Container(
height: 0.4,
width: MediaQuery.of(context).size.width - 32,
decoration: BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.circular(16),
),
);
}
_onTapLogout(BuildContext context) {
return () async {
final response = await sl<Dio>().post(
baseUrl + '/api/profile/logout',
);
if (response.statusCode == 204) {
await TokenStorage.removeTokenInStorage();
GoRouter.of(context).go('/auth-screen');
}
};
}
}