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 comments = []; final Map> _feedbackQueue = {}; bool isRadar = true; int itemId = 0; Future 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 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 addComment() async { final user = DesignConfig.context.read().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(); } }