From f5ac02c0200b39feb60b787579b01638917a70d2 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Thu, 25 Apr 2024 14:13:52 +0300 Subject: [PATCH] Multiple states for chatRoom select --- .../bloc/chat_select_bloc.dart | 13 +- .../bloc/chat_select_state.dart | 26 +-- .../chat_select_screen.dart | 170 ++++++++++-------- .../bloc/my_profile_bloc.dart | 3 +- 4 files changed, 120 insertions(+), 92 deletions(-) diff --git a/lib/presentation/chat/chat_select_screen/bloc/chat_select_bloc.dart b/lib/presentation/chat/chat_select_screen/bloc/chat_select_bloc.dart index 7204934c..9f4208dd 100644 --- a/lib/presentation/chat/chat_select_screen/bloc/chat_select_bloc.dart +++ b/lib/presentation/chat/chat_select_screen/bloc/chat_select_bloc.dart @@ -62,12 +62,17 @@ class ChatSelectBloc extends Bloc { ); if (response.statusCode == 200) { final data = jsonDecode(response.body); - if (data is Map) { + if (data is Map && data.containsKey('chatRooms')) { if (state is ChatSelectLoadedState) { var currentState = state as ChatSelectLoadedState; - emit(currentState.copyWith()); + emit(currentState.copyWith( + chatSelectModelObj: currentState.chatSelectModelObj, + chatRooms: currentState.chatRooms, + )); } else { - emit(ChatSelectLoadedState()); + emit(ChatSelectLoadedState( + chatRooms: data['chatRooms'], + )); } } else { // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку @@ -80,7 +85,7 @@ class ChatSelectBloc extends Bloc { } } catch (e) { // Ошибка при декодировании JSON или другая ошибка выполнения - emit(ChatSelectErrorState('Ошибка при получении данных профиля: $e')); + emit(ChatSelectErrorState('Ошибка при получении данных о чатах: $e')); } } } diff --git a/lib/presentation/chat/chat_select_screen/bloc/chat_select_state.dart b/lib/presentation/chat/chat_select_screen/bloc/chat_select_state.dart index 92573555..e5f1262a 100644 --- a/lib/presentation/chat/chat_select_screen/bloc/chat_select_state.dart +++ b/lib/presentation/chat/chat_select_screen/bloc/chat_select_state.dart @@ -11,33 +11,39 @@ class ChatSelectState extends Equatable { ChatSelectModel? chatSelectModelObj; @override - List get props => [ - chatSelectModelObj, - ]; - ChatSelectState copyWith({ - ChatSelectModel? chatSelectModelObj, - }) { + List get props => [chatSelectModelObj]; + ChatSelectState copyWith({ChatSelectModel? chatSelectModelObj}) { return ChatSelectState( chatSelectModelObj: chatSelectModelObj ?? this.chatSelectModelObj, ); } } +class ChatSelectInitialState extends ChatSelectState { + ChatSelectInitialState({required ChatSelectModel chatSelectModelObj}) + : super(chatSelectModelObj: chatSelectModelObj); +} + class ChatSelectLoadedState extends ChatSelectState { ChatSelectLoadedState({ + this.chatRooms, + this.searchController, this.chatSelectModelObj, }) : super(chatSelectModelObj: null); - + List? chatRooms; + TextEditingController? searchController; ChatSelectModel? chatSelectModelObj; @override - List get props => [ - chatSelectModelObj, - ]; + List get props => [chatSelectModelObj, chatRooms, searchController]; ChatSelectLoadedState copyWith({ ChatSelectModel? chatSelectModelObj, + TextEditingController? searchController, + List? chatRooms, }) { return ChatSelectLoadedState( chatSelectModelObj: chatSelectModelObj ?? this.chatSelectModelObj, + chatRooms: chatRooms ?? this.chatRooms, + searchController: searchController ?? this.searchController, ); } } diff --git a/lib/presentation/chat/chat_select_screen/chat_select_screen.dart b/lib/presentation/chat/chat_select_screen/chat_select_screen.dart index f92e2e3b..29a2a4cd 100644 --- a/lib/presentation/chat/chat_select_screen/chat_select_screen.dart +++ b/lib/presentation/chat/chat_select_screen/chat_select_screen.dart @@ -17,87 +17,103 @@ class ChatSelectScreen extends StatelessWidget { child: ChatSelectScreen()); } - @override Widget build(BuildContext context) { - mediaQueryData = MediaQuery.of(context); - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: Column( - children: [ - SizedBox(height: 30.v), - Container( - margin: EdgeInsets.only( - left: 16.h, - right: 20.h, - ), - padding: EdgeInsets.all(12.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - BlocSelector( - selector: (state) => TextEditingController(), - builder: (context, searchController) { - return CustomSearchView( - controller: searchController, - hintText: "Поиск", - ); - }, - ), - SizedBox(height: 20.v), - _buildChatList(context) - ], - ), - ) - ], - ), - ), - bottomNavigationBar: _buildBottomBar(context)), - ); - } - - _buildChatList(BuildContext context) { - return BlocSelector( - selector: (state) => state.chatSelectModelObj, - builder: (context, chatSelectModelObj) { - return ListView.separated( - shrinkWrap: true, - separatorBuilder: (context, index) { - return SizedBox( - height: 10.v, - ); - }, - itemCount: chatSelectModelObj?.userprofileItemList.length ?? 0, - itemBuilder: (context, index) { - ChatItemModel model = - chatSelectModelObj?.userprofileItemList[index] ?? - ChatItemModel(); - return UserprofileItemWidget( - model, - ); - }, - ); + return BlocBuilder( + builder: (context, state) { + if (state is ChatSelectInitialState) { + // Это начальное состояние, данные ещё не загружены. + return Container( + color: Colors.white, + ); + } else if (state is ChatSelectLoadedState) { + // Данные загружены, можно строить экран. + return _buildScreen(context, state); + } else if (state is ChatSelectErrorState) { + // Произошла ошибка при загрузке данных. + return Center(child: Text(state.errorMessage)); + } else { + // Другие состояния, если они есть. + return Container(); // Пустой контейнер для необработанных состояний. + } }, ); } - _buildBottomBar(BuildContext context) { - return CustomBottomBar(onChanged: (BottomBarEnum type) {}); + _buildScreen(BuildContext context, ChatSelectLoadedState state) { + mediaQueryData = MediaQuery.of(context); + return SafeArea( + child: Scaffold( + resizeToAvoidBottomInset: false, + body: Container( + width: double.maxFinite, + decoration: AppDecoration.fillGray, + child: Column( + children: [ + SizedBox(height: 30.v), + Container( + margin: EdgeInsets.only( + left: 16.h, + right: 20.h, + ), + padding: EdgeInsets.all(12.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(12)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 5, + offset: Offset(0, 3), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CustomSearchView( + controller: state.searchController, + hintText: "Поиск", + ), + SizedBox(height: 20.v), + _buildChatList(context), + ElevatedButton( + onPressed: (() => print(state.chatRooms)), + child: Text("asdasd")) + ], + ), + ) + ], + ), + ), + bottomNavigationBar: _buildBottomBar(context))); } } + +_buildChatList(BuildContext context) { + return BlocSelector( + selector: (state) => state.chatSelectModelObj, + builder: (context, chatSelectModelObj) { + return ListView.separated( + shrinkWrap: true, + separatorBuilder: (context, index) { + return SizedBox( + height: 10.v, + ); + }, + itemCount: chatSelectModelObj?.userprofileItemList.length ?? 0, + itemBuilder: (context, index) { + ChatItemModel model = + chatSelectModelObj?.userprofileItemList[index] ?? ChatItemModel(); + return UserprofileItemWidget( + model, + ); + }, + ); + }, + ); +} + +_buildBottomBar(BuildContext context) { + return CustomBottomBar(onChanged: (BottomBarEnum type) {}); +} diff --git a/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart b/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart index eab8dd94..b0359fd1 100644 --- a/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart +++ b/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart @@ -34,7 +34,7 @@ class MyProfileBloc extends Bloc { ); // Если токен есть, запускаем приложение } //final token = - // "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1neAggmpR2TidVGDPN34fa201a"; + // "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1ne AggmpR2TidVGDPN34fa201a"; final response = await http.get( Uri.parse(dotenv.env['SERVER_ROOT']! + '/profile/index'), headers: { @@ -95,6 +95,7 @@ class MyProfileBloc extends Bloc { selectedCity: currentState.selectedCity, selectedCountry: currentState.selectedCountry, selectedActivity: currentState.selectedActivity, + myProfileModelObj: currentState.myProfileModelObj, )); } else { var plans = []