From 6db3caf969a0c09bca0de07750d41057dc88a33b Mon Sep 17 00:00:00 2001 From: maxxkim Date: Thu, 25 Apr 2024 11:17:38 +0300 Subject: [PATCH] Token verification and API data load --- .../bloc/chat_select_bloc.dart | 49 ++++++++++++++++--- .../bloc/chat_select_state.dart | 35 ++++++++++--- 2 files changed, 71 insertions(+), 13 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 04059200..7204934c 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 @@ -1,5 +1,9 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:http/http.dart' as http; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'dart:convert'; import '/core/app_export.dart'; import 'package:eatvio_app/presentation/chat/chat_select_screen/models/chat_select_model.dart'; import 'package:eatvio_app/presentation/chat/chat_select_screen/models/chat_entry.dart'; // ignore: must_be_immutable @@ -7,11 +11,12 @@ part 'chat_select_event.dart'; part 'chat_select_state.dart'; /// A bloc that manages the state of a ChatSelect according to the event that is dispatched to it. +/// + class ChatSelectBloc extends Bloc { ChatSelectBloc(ChatSelectState initialState) : super(initialState) { on(_onInitialize); } - List fillChatEntryList() { return [ ChatItemModel( @@ -37,13 +42,45 @@ class ChatSelectBloc extends Bloc { ]; } - _onInitialize( + Future _onInitialize( ChatSelectInitialEvent event, Emitter emit, ) async { - emit(state.copyWith( - chatSelectModelObj: state.chatSelectModelObj?.copyWith( - userprofileItemList: fillChatEntryList(), - ))); + try { + final box = await Hive.openBox('token'); + final token = box.get('token'); + if (token == null) { + NavigatorService.popAndPushNamed( + AppRoutes.authScreen, + ); + } + final response = await http.get( + Uri.parse(dotenv.env['SERVER_ROOT']! + '/chat/index'), + headers: { + 'Authorization': 'Bearer $token', + }, + ); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + if (data is Map) { + if (state is ChatSelectLoadedState) { + var currentState = state as ChatSelectLoadedState; + emit(currentState.copyWith()); + } else { + emit(ChatSelectLoadedState()); + } + } else { + // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку + emit(ChatSelectErrorState( + 'Некоторые необходимые данные отсутствуют.')); + } + } else { + // Статус ответа не равен 200, обрабатываем ошибку + emit(ChatSelectErrorState('Ошибка сервера: ${response.statusCode}')); + } + } catch (e) { + // Ошибка при декодировании JSON или другая ошибка выполнения + 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 7f56519e..92573555 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 @@ -5,27 +5,48 @@ part of 'chat_select_bloc.dart'; /// Represents the state of ChatSelect in the application. class ChatSelectState extends Equatable { ChatSelectState({ - this.selectedDropDownValue, this.chatSelectModelObj, }); - SelectionPopupModel? selectedDropDownValue; - ChatSelectModel? chatSelectModelObj; @override List get props => [ - selectedDropDownValue, chatSelectModelObj, ]; ChatSelectState copyWith({ - SelectionPopupModel? selectedDropDownValue, ChatSelectModel? chatSelectModelObj, }) { return ChatSelectState( - selectedDropDownValue: - selectedDropDownValue ?? this.selectedDropDownValue, chatSelectModelObj: chatSelectModelObj ?? this.chatSelectModelObj, ); } } + +class ChatSelectLoadedState extends ChatSelectState { + ChatSelectLoadedState({ + this.chatSelectModelObj, + }) : super(chatSelectModelObj: null); + + ChatSelectModel? chatSelectModelObj; + @override + List get props => [ + chatSelectModelObj, + ]; + ChatSelectLoadedState copyWith({ + ChatSelectModel? chatSelectModelObj, + }) { + return ChatSelectLoadedState( + chatSelectModelObj: chatSelectModelObj ?? this.chatSelectModelObj, + ); + } +} + +class ChatSelectErrorState extends ChatSelectState { + final String errorMessage; + + ChatSelectErrorState(this.errorMessage); + + @override + List get props => [errorMessage]; +}