feat(feed) Blog post edit API connect, TextController management and redirect

This commit is contained in:
2024-05-13 12:49:47 +03:00
parent 96ad5a7cfb
commit 1ad58f8f42
5 changed files with 69 additions and 15 deletions

View File

@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
@@ -13,6 +15,7 @@ part 'blog_post_edit_state.dart';
class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
BlogPostEditBloc(BlogPostEditState initialState) : super(initialState) {
on<BlogPostEditInitialEvent>(_onInitialize);
on<EditBlogPost>(_editBlogPost);
}
_onInitialize(
@@ -41,10 +44,16 @@ class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
var currentState = state as BlogPostEditLoadedState;
emit(currentState.copyWith(
blog_postModelObj: currentState.blog_postModelObj,
blog_post: currentState.blog_post));
blog_post: currentState.blog_post,
title: currentState.title,
description: currentState.description,
youtube_url: currentState.youtube_url));
} else {
emit(BlogPostEditLoadedState(blog_post: data));
print(data);
emit(BlogPostEditLoadedState(
blog_post: data,
title: TextEditingController(text: data['title']),
description: TextEditingController(text: data['description']),
youtube_url: TextEditingController(text: data['youtube_url'])));
}
} else {
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
@@ -60,4 +69,54 @@ class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
emit(BlogPostEditErrorState('Ошибка при получении данных о чатах: $e'));
}
}
FutureOr<void> _editBlogPost(
EditBlogPost event, Emitter<BlogPostEditState> emit) async {
if (state is BlogPostEditLoadedState) {
var currentState = state as BlogPostEditLoadedState;
var response = await sendBlogPost(
currentState.blog_post,
currentState.title?.text,
currentState.youtube_url?.text,
currentState.description?.text,
);
if (response.statusCode == 200) {
NavigatorService.pushNamed(AppRoutes.blogPostScreen,
arguments: currentState.blog_post?['id'].toString());
} else {
print(
'Failed to edit blog post. Status Code: ${response.statusCode} ${response.body}');
}
}
}
FutureOr<http.Response> sendBlogPost(
Map<String, dynamic>? blog_post,
String? title,
String? youtube_url,
String? description,
) async {
int id = blog_post?['id'];
String url = '${dotenv.env['SERVER_ROOT']!}/feed/update/$id';
final Map<String, dynamic> credentials = {
'id': id,
'title': title,
'description': description,
'youtube_url': youtube_url,
};
var response = await http.post(
Uri.parse(url),
headers: {
'Content-Type': 'application/json',
},
body: json.encode(credentials),
encoding: utf8,
);
return response;
}
}

View File

@@ -14,3 +14,8 @@ class BlogPostEditInitialEvent extends BlogPostEditEvent {
@override
List<Object?> get props => [];
}
class EditBlogPost extends BlogPostEditEvent {
@override
List<Object?> get props => [];
}

View File

@@ -41,7 +41,6 @@ class BlogPostEditScreen extends StatelessWidget {
}
_buildBlogPostEdit(BuildContext context, BlogPostEditLoadedState state) {
print(state.blog_post);
mediaQueryData = MediaQuery.of(context);
return SafeArea(
child: Scaffold(
@@ -90,29 +89,22 @@ class BlogPostEditScreen extends StatelessWidget {
TextFormField(
controller: state.title,
decoration: InputDecoration(labelText: 'Заголовок'),
initialValue: state
.blog_post?['title'], // Если есть начальное значение
),
SizedBox(height: 16.0),
TextFormField(
controller: state.description,
decoration: InputDecoration(labelText: 'Описание'),
initialValue: state.blog_post?[
'description'], // Если есть начальное значение
),
SizedBox(height: 16.0),
TextFormField(
controller: state.youtube_url,
decoration: InputDecoration(labelText: 'Ссылка'),
initialValue: state.blog_post?[
'youtube_url'], // Если есть начальное значение
),
SizedBox(height: 16.0),
// Здесь нужно добавить виджет для загрузки картинки
ElevatedButton(
onPressed: () {
// Действия по сохранению записи в блоге
},
onPressed: () =>
context.read<BlogPostEditBloc>().add(EditBlogPost()),
child: Text('Сохранить'),
)
]),

View File

@@ -44,7 +44,6 @@ class BlogPostBloc extends Bloc<BlogPostEvent, BlogPostState> {
blog_post: currentState.blog_post));
} else {
emit(BlogPostLoadedState(blog_post: data));
print(data);
}
} else {
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку

View File

@@ -46,7 +46,6 @@ class BlogPostScreen extends StatelessWidget {
}
_buildBlogPost(BuildContext context, BlogPostLoadedState state) {
print(state.blog_post);
mediaQueryData = MediaQuery.of(context);
return SafeArea(
child: Scaffold(