forked from eatvio/eatvio_app
feat(feed) Blog post edit API connect, TextController management and redirect
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
@@ -13,6 +15,7 @@ part 'blog_post_edit_state.dart';
|
|||||||
class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
|
class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
|
||||||
BlogPostEditBloc(BlogPostEditState initialState) : super(initialState) {
|
BlogPostEditBloc(BlogPostEditState initialState) : super(initialState) {
|
||||||
on<BlogPostEditInitialEvent>(_onInitialize);
|
on<BlogPostEditInitialEvent>(_onInitialize);
|
||||||
|
on<EditBlogPost>(_editBlogPost);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onInitialize(
|
_onInitialize(
|
||||||
@@ -41,10 +44,16 @@ class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
|
|||||||
var currentState = state as BlogPostEditLoadedState;
|
var currentState = state as BlogPostEditLoadedState;
|
||||||
emit(currentState.copyWith(
|
emit(currentState.copyWith(
|
||||||
blog_postModelObj: currentState.blog_postModelObj,
|
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 {
|
} else {
|
||||||
emit(BlogPostEditLoadedState(blog_post: data));
|
emit(BlogPostEditLoadedState(
|
||||||
print(data);
|
blog_post: data,
|
||||||
|
title: TextEditingController(text: data['title']),
|
||||||
|
description: TextEditingController(text: data['description']),
|
||||||
|
youtube_url: TextEditingController(text: data['youtube_url'])));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
|
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
|
||||||
@@ -60,4 +69,54 @@ class BlogPostEditBloc extends Bloc<BlogPostEditEvent, BlogPostEditState> {
|
|||||||
emit(BlogPostEditErrorState('Ошибка при получении данных о чатах: $e'));
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,3 +14,8 @@ class BlogPostEditInitialEvent extends BlogPostEditEvent {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [];
|
List<Object?> get props => [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class EditBlogPost extends BlogPostEditEvent {
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ class BlogPostEditScreen extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_buildBlogPostEdit(BuildContext context, BlogPostEditLoadedState state) {
|
_buildBlogPostEdit(BuildContext context, BlogPostEditLoadedState state) {
|
||||||
print(state.blog_post);
|
|
||||||
mediaQueryData = MediaQuery.of(context);
|
mediaQueryData = MediaQuery.of(context);
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
@@ -90,29 +89,22 @@ class BlogPostEditScreen extends StatelessWidget {
|
|||||||
TextFormField(
|
TextFormField(
|
||||||
controller: state.title,
|
controller: state.title,
|
||||||
decoration: InputDecoration(labelText: 'Заголовок'),
|
decoration: InputDecoration(labelText: 'Заголовок'),
|
||||||
initialValue: state
|
|
||||||
.blog_post?['title'], // Если есть начальное значение
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 16.0),
|
SizedBox(height: 16.0),
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: state.description,
|
controller: state.description,
|
||||||
decoration: InputDecoration(labelText: 'Описание'),
|
decoration: InputDecoration(labelText: 'Описание'),
|
||||||
initialValue: state.blog_post?[
|
|
||||||
'description'], // Если есть начальное значение
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 16.0),
|
SizedBox(height: 16.0),
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: state.youtube_url,
|
controller: state.youtube_url,
|
||||||
decoration: InputDecoration(labelText: 'Ссылка'),
|
decoration: InputDecoration(labelText: 'Ссылка'),
|
||||||
initialValue: state.blog_post?[
|
|
||||||
'youtube_url'], // Если есть начальное значение
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 16.0),
|
SizedBox(height: 16.0),
|
||||||
// Здесь нужно добавить виджет для загрузки картинки
|
// Здесь нужно добавить виджет для загрузки картинки
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () =>
|
||||||
// Действия по сохранению записи в блоге
|
context.read<BlogPostEditBloc>().add(EditBlogPost()),
|
||||||
},
|
|
||||||
child: Text('Сохранить'),
|
child: Text('Сохранить'),
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ class BlogPostBloc extends Bloc<BlogPostEvent, BlogPostState> {
|
|||||||
blog_post: currentState.blog_post));
|
blog_post: currentState.blog_post));
|
||||||
} else {
|
} else {
|
||||||
emit(BlogPostLoadedState(blog_post: data));
|
emit(BlogPostLoadedState(blog_post: data));
|
||||||
print(data);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
|
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ class BlogPostScreen extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_buildBlogPost(BuildContext context, BlogPostLoadedState state) {
|
_buildBlogPost(BuildContext context, BlogPostLoadedState state) {
|
||||||
print(state.blog_post);
|
|
||||||
mediaQueryData = MediaQuery.of(context);
|
mediaQueryData = MediaQuery.of(context);
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
|
|||||||
Reference in New Issue
Block a user