import 'dart:io'; import 'dart:math'; import 'package:eatvio_app/core/app_router.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_cubit.dart'; import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_state.dart'; class EmptyChatScreen extends StatefulWidget { final Author author; const EmptyChatScreen({ super.key, required this.author, }); @override State createState() => _EmptyChatScreenState(); } class _EmptyChatScreenState extends State { final TextEditingController textEditingController = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: true, appBar: AppBar( titleSpacing: 0, backgroundColor: appTheme.gray100, centerTitle: false, title: GestureDetector( onTap: () { GoRouter.of(context).pushNamed( 'profileScreen', extra: Author( authorSlug: widget.author.authorSlug, authorName: widget.author.authorName, authorProfileIcon: widget.author.authorProfileIcon, authorIsMe: false, ), ); }, child: Row( children: [ CircleAvatar( radius: 20, foregroundImage: NetworkImage(widget.author.authorProfileIcon), backgroundImage: const AssetImage('assets/images/no_avatar.png'), ), const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.author.authorName, style: CustomTextStyles.titleSmallBold.copyWith( color: PrimaryColors().black, ), ), ], ), ], ), ), ), body: SafeArea( child: Column( children: [ const Spacer(), Container( padding: const EdgeInsets.symmetric(vertical: 8), child: Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ const SizedBox(width: 8), InkWell( onTap: () => showImagePicker(widget.author.authorSlug), customBorder: const CircleBorder(), child: Ink( height: 40, width: 40, child: Transform.rotate( angle: pi / 4, child: const Icon( Icons.attach_file_rounded, size: 30, color: Color(0xFF858E99), ), ), ), ), const SizedBox(width: 8), Expanded( child: SizedBox( height: 40, child: TextFormField( expands: true, textCapitalization: TextCapitalization.sentences, controller: textEditingController, maxLines: null, minLines: null, keyboardType: TextInputType.multiline, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1), decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), hintText: 'Сообщение', hintStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)), filled: true, border: OutlineInputBorder(borderRadius: BorderRadius.circular(100), borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1)), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(100), borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(100), borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), ), ), ), ), ), const SizedBox(width: 8), InkWell( customBorder: const CircleBorder(), onTap: () async { // Проверяем, заблокирован ли пользователь final blockedUsersCubit = sl(); await blockedUsersCubit.getBlockedUsers(); final blockedState = blockedUsersCubit.state; if (blockedState is BlockedUsersStateLoaded) { final isBlocked = blockedState.profilesList.any((profile) => profile.slug == widget.author.authorSlug); if (isBlocked) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Вы не можете отправить сообщение заблокированному пользователю'), backgroundColor: Colors.red, ), ); } return; } } if (textEditingController.text.isNotEmpty) { await sl().sendMessage( data: textEditingController.text.trim(), slug: widget.author.authorSlug, ); if (mounted) { setState(() { textEditingController.clear(); }); } final chatIdOrError = await sl().getChatByUserSlug(widget.author.authorSlug); if (context.mounted) { AppRouter.navigatorKey.currentContext?.pushReplacementNamed( 'chatScreen', extra: { 'uuid': chatIdOrError, }, ); } } }, child: Ink( decoration: BoxDecoration(color: appTheme.blueA400, shape: BoxShape.circle), height: 40, width: 40, child: const Icon(Icons.arrow_upward_rounded, size: 24, color: Colors.white), ), ), const SizedBox(width: 8), ], ), ), ], ), ), ); } void showImagePicker(String slug) { showCupertinoModalPopup( context: context, builder: (context) => CupertinoActionSheet( actions: [ CupertinoActionSheetAction( onPressed: () async { Navigator.of(context).pop(); // Проверяем, заблокирован ли пользователь final blockedUsersCubit = sl(); await blockedUsersCubit.getBlockedUsers(); final blockedState = blockedUsersCubit.state; if (blockedState is BlockedUsersStateLoaded) { final isBlocked = blockedState.profilesList.any((profile) => profile.slug == widget.author.authorSlug); if (isBlocked) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Вы не можете отправить сообщение заблокированному пользователю'), backgroundColor: Colors.red, ), ); } return; } } final picker = ImagePicker(); List? images = await picker.pickMultiImage(); if (images.isNotEmpty) { List files = images.map((image) => File(image.path)).toList(); await sl().sendMessage( files: files, slug: widget.author.authorSlug, ); final chatIdOrError = await sl().getChatByUserSlug(widget.author.authorSlug); if (mounted) { AppRouter.navigatorKey.currentContext?.pushReplacementNamed( 'chatScreen', extra: { 'uuid': chatIdOrError, }, ); } } }, child: const Row( children: [ Icon(Icons.photo_library_rounded), SizedBox(width: 8), Text('Галерея'), ], ), ), CupertinoActionSheetAction( onPressed: () async { Navigator.of(context).pop(); final picker = ImagePicker(); List? images = await picker.pickMultiImage(); if (images.isNotEmpty) { List files = images.map((image) => File(image.path)).toList(); await sl().sendMessage( files: files, slug: widget.author.authorSlug, ); final chatIdOrError = await sl().getChatByUserSlug(widget.author.authorSlug); if (mounted) { AppRouter.navigatorKey.currentContext?.pushReplacementNamed( 'chatScreen', extra: { 'uuid': chatIdOrError, }, ); } } }, child: const Row( children: [ Icon(Icons.photo_camera), SizedBox(width: 8), Text('Фото'), ], ), ), CupertinoActionSheetAction( onPressed: () async { Navigator.of(context).pop(); FilePickerResult? result = await FilePicker.platform.pickFiles( allowMultiple: true, type: FileType.custom, allowedExtensions: [ 'pdf', 'doc', 'docx', 'json', 'ppt', 'pptx', 'rtf', 'txt', 'xls', 'xlsx', 'csv', 'jpeg', 'jpg', 'png', 'gif', 'svg', 'xml', 'webp', ], ); if (result != null) { List files = result.paths.map((path) => File(path!)).toList(); await sl().sendMessage( files: files, slug: widget.author.authorSlug, ); final chatIdOrError = await sl().getChatByUserSlug(widget.author.authorSlug); if (mounted) { AppRouter.navigatorKey.currentContext?.pushReplacementNamed( 'chatScreen', extra: { 'uuid': chatIdOrError, }, ); } } }, child: const Row( children: [ Icon(Icons.file_present_rounded), SizedBox(width: 8), Text('Файлы'), ], ), ), ], cancelButton: CupertinoActionSheetAction( onPressed: () => Navigator.of(context).pop(), isDestructiveAction: true, child: const Text('Отмена'), ), ), ); } }