mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 12:59:21 +00:00
Can send comments
This commit is contained in:
parent
c267940ce6
commit
1f899f7594
@ -1,10 +1,30 @@
|
|||||||
|
import 'package:comunic/models/api_request.dart';
|
||||||
import 'package:comunic/models/comment.dart';
|
import 'package:comunic/models/comment.dart';
|
||||||
|
import 'package:comunic/models/new_comment.dart';
|
||||||
|
|
||||||
/// Comments helper
|
/// Comments helper
|
||||||
///
|
///
|
||||||
/// @author Pierre HUBERT
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
class CommentsHelper {
|
class CommentsHelper {
|
||||||
|
/// Send a new comment
|
||||||
|
///
|
||||||
|
/// Returns 0 or below in case of failure, the ID of the comment else
|
||||||
|
Future<int> createComment(NewComment comment) async {
|
||||||
|
final request = APIRequest(uri: "comments/create", needLogin: true, args: {
|
||||||
|
"postID": comment.postID.toString(),
|
||||||
|
"content": comment.hasContent ? comment.content : "",
|
||||||
|
});
|
||||||
|
|
||||||
|
if (comment.hasImage) request.addFile("image", comment.image);
|
||||||
|
|
||||||
|
final response = await request.execWithFiles();
|
||||||
|
|
||||||
|
if (response.code != 200) return -1;
|
||||||
|
|
||||||
|
return response.getObject()["commentID"];
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn an API entry into a [Comment] object
|
/// Turn an API entry into a [Comment] object
|
||||||
static Comment apiToComment(Map<String, dynamic> entry) {
|
static Comment apiToComment(Map<String, dynamic> entry) {
|
||||||
return Comment(
|
return Comment(
|
||||||
|
23
lib/models/new_comment.dart
Normal file
23
lib/models/new_comment.dart
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
/// New comment information
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
class NewComment {
|
||||||
|
final int postID;
|
||||||
|
final String content;
|
||||||
|
final File image;
|
||||||
|
|
||||||
|
const NewComment({
|
||||||
|
@required this.postID,
|
||||||
|
@required this.content,
|
||||||
|
@required this.image,
|
||||||
|
}) : assert(postID != null);
|
||||||
|
|
||||||
|
bool get hasContent => content != null && content.length > 0;
|
||||||
|
|
||||||
|
bool get hasImage => image != null;
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:comunic/enums/post_kind.dart';
|
import 'package:comunic/enums/post_kind.dart';
|
||||||
|
import 'package:comunic/helpers/comments_helper.dart';
|
||||||
import 'package:comunic/lists/users_list.dart';
|
import 'package:comunic/lists/users_list.dart';
|
||||||
|
import 'package:comunic/models/new_comment.dart';
|
||||||
import 'package:comunic/models/post.dart';
|
import 'package:comunic/models/post.dart';
|
||||||
import 'package:comunic/models/user.dart';
|
import 'package:comunic/models/user.dart';
|
||||||
import 'package:comunic/ui/tiles/comment_tile.dart';
|
import 'package:comunic/ui/tiles/comment_tile.dart';
|
||||||
@ -44,15 +46,20 @@ class PostTile extends StatefulWidget {
|
|||||||
|
|
||||||
class _PostTileState extends State<PostTile> {
|
class _PostTileState extends State<PostTile> {
|
||||||
// Class members
|
// Class members
|
||||||
TextEditingController _controller = TextEditingController();
|
TextEditingController _commentController = TextEditingController();
|
||||||
File _commentImage;
|
File _commentImage;
|
||||||
|
bool _submitting = false;
|
||||||
|
|
||||||
User get _user => widget.usersInfo.getUser(widget.post.userID);
|
User get _user => widget.usersInfo.getUser(widget.post.userID);
|
||||||
|
|
||||||
bool get _commentValid => _controller.text.toString().length > 3;
|
bool get _commentValid => _commentController.text.toString().length > 3;
|
||||||
|
|
||||||
bool get _hasImage => _commentImage != null;
|
bool get _hasImage => _commentImage != null;
|
||||||
|
|
||||||
|
bool get _canSubmitComment => !_submitting && (_commentValid || _hasImage);
|
||||||
|
|
||||||
|
set _sendingComment(bool sending) => setState(() => _submitting = sending);
|
||||||
|
|
||||||
Widget _buildHeaderRow() {
|
Widget _buildHeaderRow() {
|
||||||
// Header row
|
// Header row
|
||||||
return Row(
|
return Row(
|
||||||
@ -211,9 +218,9 @@ class _PostTileState extends State<PostTile> {
|
|||||||
// Comment input
|
// Comment input
|
||||||
Expanded(
|
Expanded(
|
||||||
child: TextField(
|
child: TextField(
|
||||||
controller: _controller,
|
controller: _commentController,
|
||||||
onChanged: (s) => setState(() {}),
|
onChanged: (s) => setState(() {}),
|
||||||
onSubmitted: _commentValid ? (s) => _submitComment() : null,
|
onSubmitted: _canSubmitComment ? (s) => _submitComment() : null,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: tr("New comment..."),
|
hintText: tr("New comment..."),
|
||||||
hintStyle: TextStyle(color: Colors.grey, fontSize: 12),
|
hintStyle: TextStyle(color: Colors.grey, fontSize: 12),
|
||||||
@ -253,11 +260,10 @@ class _PostTileState extends State<PostTile> {
|
|||||||
width: 40,
|
width: 40,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
padding: EdgeInsets.only(),
|
padding: EdgeInsets.only(),
|
||||||
onPressed:
|
onPressed: _canSubmitComment ? () => _submitComment() : null,
|
||||||
_commentValid || _hasImage ? () => _submitComment() : null,
|
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.send,
|
Icons.send,
|
||||||
color: _commentValid || _hasImage ? Colors.blue : Colors.grey,
|
color: _canSubmitComment ? Colors.blue : Colors.grey,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -266,6 +272,14 @@ class _PostTileState extends State<PostTile> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clear comments submitting form
|
||||||
|
void clearCommentForm() {
|
||||||
|
setState(() {
|
||||||
|
_commentController.text = "";
|
||||||
|
_commentImage = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// Pick an image
|
/// Pick an image
|
||||||
Future<void> _pickImage() async {
|
Future<void> _pickImage() async {
|
||||||
// Ask the user to confirm image removal if there is already one selected
|
// Ask the user to confirm image removal if there is already one selected
|
||||||
@ -291,5 +305,22 @@ class _PostTileState extends State<PostTile> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Submit comment entered by the user
|
/// Submit comment entered by the user
|
||||||
Future<bool> _submitComment() async {}
|
Future<void> _submitComment() async {
|
||||||
|
_sendingComment = true;
|
||||||
|
|
||||||
|
final commentID = await CommentsHelper().createComment(NewComment(
|
||||||
|
postID: widget.post.id,
|
||||||
|
content: _commentController.text,
|
||||||
|
image: _commentImage,
|
||||||
|
));
|
||||||
|
|
||||||
|
_sendingComment = false;
|
||||||
|
|
||||||
|
if (commentID < 1)
|
||||||
|
return showSimpleSnack(context, tr("Could not create comment!"));
|
||||||
|
|
||||||
|
clearCommentForm();
|
||||||
|
|
||||||
|
// Get and show new comment
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user