127 lines
3.6 KiB
Dart
127 lines
3.6 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:didvan/config/design_config.dart';
|
|
import 'package:didvan/models/comment/comment.dart';
|
|
import 'package:didvan/models/comment/feedback.dart';
|
|
import 'package:didvan/models/comment/reply.dart';
|
|
import 'package:didvan/models/comment/user.dart';
|
|
import 'package:didvan/models/enums.dart';
|
|
import 'package:didvan/providers/core_provider.dart';
|
|
import 'package:didvan/providers/user_provider.dart';
|
|
import 'package:didvan/services/network/request.dart';
|
|
import 'package:didvan/services/network/request_helper.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
class CommentsState extends CoreProvier {
|
|
String text = '';
|
|
int? commentId;
|
|
UserOverview? replyingTo;
|
|
late VoidCallback onCommentAdded;
|
|
|
|
final List<CommentData> comments = [];
|
|
final Map<int, MapEntry<bool, bool>> _feedbackQueue = {};
|
|
|
|
bool isRadar = true;
|
|
int itemId = 0;
|
|
|
|
Future<void> getComments() async {
|
|
appState = AppState.busy;
|
|
final service = RequestService(
|
|
isRadar
|
|
? RequestHelper.radarComments(itemId)
|
|
: RequestHelper.newsComments(itemId),
|
|
);
|
|
await service.httpGet();
|
|
if (service.isSuccess) {
|
|
final messages = service.result['comments'];
|
|
for (var i = 0; i < messages.length; i++) {
|
|
comments.add(CommentData.fromJson(messages[i]));
|
|
}
|
|
appState = AppState.idle;
|
|
return;
|
|
}
|
|
appState = AppState.failed;
|
|
}
|
|
|
|
Future<void> feedback(int id, bool like, bool dislike) async {
|
|
_feedbackQueue.addAll({id: MapEntry(like, dislike)});
|
|
Future.delayed(const Duration(milliseconds: 500), () async {
|
|
if (!_feedbackQueue.containsKey(id)) return;
|
|
final service = RequestService(
|
|
isRadar
|
|
? RequestHelper.feedbackRadarComment(itemId, id)
|
|
: RequestHelper.feedbackNewsComment(itemId, id),
|
|
body: {
|
|
'like': _feedbackQueue[id]!.key,
|
|
'dislike': _feedbackQueue[id]!.value,
|
|
});
|
|
await service.put();
|
|
_feedbackQueue.remove(id);
|
|
});
|
|
}
|
|
|
|
Future<void> addComment() async {
|
|
final user = DesignConfig.context.read<UserProvider>().user;
|
|
if (replyingTo != null) {
|
|
final coment = comments.firstWhere((comment) => comment.id == commentId);
|
|
coment.replies.add(
|
|
Reply(
|
|
id: Random().nextInt(1000),
|
|
text: text,
|
|
createdAt: DateTime.now().toString(),
|
|
liked: false,
|
|
disliked: false,
|
|
feedback: const FeedbackData(like: 0, dislike: 0),
|
|
toUser: replyingTo!,
|
|
user: UserOverview(
|
|
id: user.id,
|
|
fullName: user.fullName,
|
|
photo: user.photo,
|
|
),
|
|
),
|
|
);
|
|
} else {
|
|
comments.insert(
|
|
0,
|
|
CommentData(
|
|
id: Random().nextInt(1000),
|
|
text: text,
|
|
createdAt: DateTime.now().toString(),
|
|
liked: false,
|
|
disliked: false,
|
|
feedback: const FeedbackData(like: 0, dislike: 0),
|
|
user: UserOverview(
|
|
id: user.id,
|
|
fullName: user.fullName,
|
|
photo: user.photo,
|
|
),
|
|
replies: [],
|
|
),
|
|
);
|
|
}
|
|
|
|
onCommentAdded();
|
|
|
|
final body = {};
|
|
|
|
if (commentId != null) {
|
|
body.addAll({'commentId': commentId});
|
|
}
|
|
if (replyingTo != null) {
|
|
body.addAll({'replyUserId': replyingTo!.id});
|
|
}
|
|
body.addAll({'text': text});
|
|
final service = RequestService(
|
|
isRadar
|
|
? RequestHelper.addRadarComment(itemId)
|
|
: RequestHelper.addNewsComment(itemId),
|
|
body: body);
|
|
commentId = null;
|
|
replyingTo = null;
|
|
update();
|
|
await service.post();
|
|
update();
|
|
}
|
|
}
|