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/models/view/alert_data.dart'; import 'package:didvan/providers/core.dart'; import 'package:didvan/providers/user.dart'; import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; import 'package:didvan/utils/action_sheet.dart'; import 'package:provider/provider.dart'; class CommentsState extends CoreProvier { String text = ''; int? commentId; UserOverview? replyingTo; bool showReplyBox = false; late void Function(int count) onCommentsChanged; int _count = 0; late String type; final List comments = []; final Map> _feedbackQueue = {}; int itemId = 0; Future getComments() async { final service = RequestService( RequestHelper.comments(itemId, type), ); 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])); _count++; for (var j = 0; j < messages[i]['replies'].length; j++) { _count++; } } appState = AppState.idle; return; } appState = AppState.failed; } Future feedback({ required int id, required bool like, required bool dislike, required int likeCount, required int dislikeCount, int? replyId, }) async { _feedbackQueue.addAll({id: MapEntry(like, dislike)}); dynamic comment; if (replyId == null) { comment = comments.firstWhere((comment) => comment.id == id); } else { comment = comments .firstWhere((comment) => comment.id == id) .replies .firstWhere((element) => element.id == replyId); } if (comment != null) { comment.feedback.like = likeCount; comment.feedback.dislike = dislikeCount; comment.disliked = dislike; comment.liked = like; } Future.delayed(const Duration(milliseconds: 500), () async { if (!_feedbackQueue.containsKey(id)) return; final service = RequestService( RequestHelper.feedback(itemId, id, type), body: { 'like': _feedbackQueue[id]!.key, 'dislike': _feedbackQueue[id]!.value, }, ); await service.put(); _feedbackQueue.remove(id); }); } Future addComment() async { final user = DesignConfig.context!.read().user; if (replyingTo != null) { comments.firstWhere((comment) => comment.id == commentId).replies.add( Reply( id: 0, text: text, createdAt: DateTime.now().toString(), liked: false, disliked: false, feedback: FeedbackData(like: 0, dislike: 0), toUser: replyingTo!, user: UserOverview( id: user.id, fullName: user.fullName, photo: user.photo, ), ), ); } else { comments.insert( 0, CommentData( id: 0, text: text, createdAt: DateTime.now().toString(), liked: false, disliked: false, feedback: FeedbackData(like: 0, dislike: 0), user: UserOverview( id: user.id, fullName: user.fullName, photo: user.photo, ), replies: [], ), ); } _count++; onCommentsChanged(_count); final body = {}; if (commentId != null) { body.addAll({'commentId': commentId}); } if (replyingTo != null) { body.addAll({'replyUserId': replyingTo!.id}); } showReplyBox = false; update(); body.addAll({'text': text}); final service = RequestService( RequestHelper.addComment(itemId, type), body: body, ); await service.post(); if (service.isSuccess) { if (replyingTo != null) { comments .firstWhere((comment) => comment.id == commentId) .replies .firstWhere((reply) => reply.id == 0) .id = service.result['comment']['id']; } else { comments.firstWhere((comment) => comment.id == 0).id = service.result['comment']['id']; } commentId = null; replyingTo = null; } } void reportComment(int id) { final service = RequestService(RequestHelper.reportComment(id)); service.post(); ActionSheetUtils.showAlert( AlertData( message: 'گزارش شما با موفقیت ثبت شد و به زودی بررسی میگردد.', aLertType: ALertType.success, ), ); } void deleteComment(int id, int? rootId) { final service = RequestService(RequestHelper.deleteComment(id)); service.delete(); if (rootId == null) { final comment = comments.firstWhere((element) => element.id == id); if (comment.replies.isNotEmpty) { comments.insertAll( comments.indexOf(comment), comment.replies.map( (rep) => CommentData( id: rep.id, text: rep.text, createdAt: rep.createdAt, liked: rep.liked, disliked: rep.disliked, feedback: rep.feedback, user: rep.user, replies: [], ), ), ); } comments.remove(comment); } else { comments .firstWhere((element) => element.id == rootId) .replies .removeWhere((element) => element.id == id); } notifyListeners(); } }