import 'package:easy_debounce/easy_debounce.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_select_cubit/chat_select_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_select_cubit/chat_select_state.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_entry_widget.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_search_bar_widget.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class ChatSelectScreen extends StatefulWidget { const ChatSelectScreen({Key? key}) : super(key: key); @override State createState() => _ChatSelectScreenState(); } class _ChatSelectScreenState extends State { final ChatSelectCubit chatSelectCubit = sl(); final searchController = TextEditingController(); Widget build(BuildContext context) { return BlocProvider( create: (context) => chatSelectCubit..getChatRooms(), child: BlocBuilder( builder: (context, state) { return Scaffold( appBar: AppBar( backgroundColor: Colors.white, toolbarHeight: 0, ), body: NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return [ SliverPadding( padding: const EdgeInsets.only(top: 8), sliver: SliverAppBar( automaticallyImplyLeading: false, stretchTriggerOffset: 1, scrolledUnderElevation: 0, floating: true, snap: true, title: Padding( padding: const EdgeInsets.only(top: 8), child: ChatSearchBarWidget( onSuffixIconTap: () => context.read().getChatRooms(), onChanged: (query) { if (query.length > 2) { EasyDebounce.debounce( 'searchChatRoom', Duration(milliseconds: 300), () => context.read().getChatRooms(query: query), ); } else { context.read().getChatRooms(); } }, controller: searchController, fillColor: Color(0xFFF0F2F5), hintText: "Поиск", hintStyle: TextStyle( color: Color(0xFF7B8794), ), ), ), ), ), ]; }, body: stateBuilder(state), ), ); }, ), ); } stateBuilder(state) { if (state is ChatSelectStateLoading) { return Scaffold( body: const Loader(), ); } else if (state is ChatSelectStateLoaded) { return _buildChatList(context, state); } else if (state is ChatSelectStateError) { return Padding( padding: const EdgeInsets.all(16), child: Center(child: Text(state.errorMessage)), ); } else { return Scaffold( body: const Loader(), ); } } } _buildChatList(BuildContext context, ChatSelectStateLoaded state) { return ListView.separated( padding: EdgeInsets.all(16), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), separatorBuilder: (context, index) { return SizedBox( height: 8, ); }, itemCount: state.chatRooms.length, itemBuilder: (context, index) { return ChatEntryWidget(chatRoom: state.chatRooms[index]); }, ); }