From 5072704b86d0e903a41a965c15027966ef8a28aa Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Wed, 20 Apr 2022 21:28:03 +0430 Subject: [PATCH] delete direct messages + bug fixes --- lib/providers/server_data.dart | 2 +- lib/services/network/request_helper.dart | 2 + lib/views/home/direct/direct.dart | 43 ++++- lib/views/home/direct/direct_state.dart | 13 ++ .../home/direct/widgets/audio_widget.dart | 30 ++-- lib/views/home/direct/widgets/message.dart | 169 ++++++++++-------- 6 files changed, 171 insertions(+), 88 deletions(-) diff --git a/lib/providers/server_data.dart b/lib/providers/server_data.dart index 3468d29..4aac55f 100644 --- a/lib/providers/server_data.dart +++ b/lib/providers/server_data.dart @@ -12,7 +12,7 @@ class ServerDataProvider { static int labelToTypeId(String label) { if (label.contains('پشتیبانی اپلیکیشن')) { return 8; - } else if (label.contains('پشتیبانی')) { + } else if (label.contains('پشتیبانی محتوا')) { return 7; } else { return directTypes diff --git a/lib/services/network/request_helper.dart b/lib/services/network/request_helper.dart index 6583f1d..cbf4411 100644 --- a/lib/services/network/request_helper.dart +++ b/lib/services/network/request_helper.dart @@ -40,6 +40,8 @@ class RequestHelper { static String direct(int id) => _baseDirectUrl + '/$id'; static String sendDirectMessage(int id) => _baseDirectUrl + '/$id/sendMessage'; + static String deleteDirect(int id, int messageId) => + _baseDirectUrl + '/$id/message/$messageId'; static String tag({ required List ids, String? type, diff --git a/lib/views/home/direct/direct.dart b/lib/views/home/direct/direct.dart index 5673434..2c0ba84 100644 --- a/lib/views/home/direct/direct.dart +++ b/lib/views/home/direct/direct.dart @@ -1,3 +1,4 @@ +import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/assets.dart'; import 'package:didvan/models/enums.dart'; import 'package:didvan/models/view/app_bar_data.dart'; @@ -6,7 +7,9 @@ import 'package:didvan/services/media/media.dart'; import 'package:didvan/views/home/direct/direct_state.dart'; import 'package:didvan/views/home/direct/widgets/message.dart'; import 'package:didvan/views/home/direct/widgets/message_box.dart'; +import 'package:didvan/views/widgets/didvan/icon_button.dart'; import 'package:didvan/views/widgets/didvan/scaffold.dart'; +import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/state_handlers/empty_state.dart'; import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart'; import 'package:flutter/material.dart'; @@ -52,11 +55,12 @@ class _DirectState extends State { left: 0, right: 0, child: DidvanScaffold( + padding: EdgeInsets.zero, reverse: true, backgroundColor: Theme.of(context).colorScheme.surface, appBarData: AppBarData( hasBack: true, - subtitle: widget.pageData['type'] == null + subtitle: widget.pageData['type'].contains('پشتیبانی') ? null : 'ارتباط با سردبیر', title: widget.pageData['type'] ?? 'پشتیبانی اپلیکیشن', @@ -105,6 +109,43 @@ class _DirectState extends State { left: 0, child: const MessageBox(), ), + if (state.deletionQueue.isNotEmpty) + Positioned( + left: 0, + right: 0, + top: d.padding.top, + child: Container( + height: 72, + color: Theme.of(context).colorScheme.surface, + child: Row( + children: [ + DidvanIconButton( + icon: DidvanIcons.close_solid, + size: 32, + gestureSize: 48, + color: Theme.of(context).colorScheme.secondary, + onPressed: () { + state.deletionQueue.clear(); + state.update(); + }, + ), + DidvanText( + '${state.deletionQueue.length} مورد انتخاب شد', + style: Theme.of(context).textTheme.subtitle1, + color: Theme.of(context).colorScheme.secondary, + ), + const Spacer(), + DidvanIconButton( + icon: DidvanIcons.trash_solid, + size: 32, + gestureSize: 48, + color: Theme.of(context).colorScheme.primary, + onPressed: state.delete, + ), + ], + ), + ), + ), ], ), ), diff --git a/lib/views/home/direct/direct_state.dart b/lib/views/home/direct/direct_state.dart index 20964d5..ba1e98c 100644 --- a/lib/views/home/direct/direct_state.dart +++ b/lib/views/home/direct/direct_state.dart @@ -16,6 +16,7 @@ class DirectState extends CoreProvier { final List messages = []; late final int typeId; final Map> dailyMessages = {}; + final List deletionQueue = []; String? text; RadarAttachment? replyRadar; @@ -77,6 +78,18 @@ class DirectState extends CoreProvier { } } + void delete() { + for (var i = 0; i < deletionQueue.length; i++) { + final service = RequestService( + RequestHelper.deleteDirect(typeId, deletionQueue[i]), + ); + service.delete(); + messages.removeWhere((element) => element.id == deletionQueue[i]); + } + deletionQueue.clear(); + notifyListeners(); + } + void _addToDailyGrouped(MessageData message) { String createdAt = message.createdAt.replaceAll('T', ' ').split(' ').first; if (!dailyMessages.containsKey(createdAt)) { diff --git a/lib/views/home/direct/widgets/audio_widget.dart b/lib/views/home/direct/widgets/audio_widget.dart index 5f1c8bd..7e55bd4 100644 --- a/lib/views/home/direct/widgets/audio_widget.dart +++ b/lib/views/home/direct/widgets/audio_widget.dart @@ -20,24 +20,24 @@ class AudioWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return StreamBuilder( - stream: MediaService.audioPlayer.isPlaying, - builder: (context, snapshot) { - return Row( - children: [ - Expanded( - child: AudioSlider( - tag: 'message-$id', - ), - ), - _AudioControllerButton( + return Row( + children: [ + Expanded( + child: AudioSlider( + tag: 'message-$id', + ), + ), + StreamBuilder( + stream: MediaService.audioPlayer.isPlaying, + builder: (context, snapshot) { + return _AudioControllerButton( audioFile: audioFile, audioUrl: audioUrl, id: id, - ), - ], - ); - }, + ); + }, + ), + ], ); } } diff --git a/lib/views/home/direct/widgets/message.dart b/lib/views/home/direct/widgets/message.dart index ff90eb1..d1c5e6a 100644 --- a/lib/views/home/direct/widgets/message.dart +++ b/lib/views/home/direct/widgets/message.dart @@ -18,85 +18,109 @@ class Message extends StatelessWidget { @override Widget build(BuildContext context) { - final firstMessageOfGroupId = context - .read() + final state = context.read(); + final firstMessageOfGroupId = state .dailyMessages[message.createdAt.replaceAll('T', ' ').split(' ').first]! .last; - return Column( - crossAxisAlignment: message.writedByAdmin - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, - children: [ - if (message.id == firstMessageOfGroupId) - Center( - child: Container( - margin: const EdgeInsets.only(bottom: 12), - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.splash, - borderRadius: DesignConfig.lowBorderRadius, - ), - child: DidvanText( - DateTime.parse(message.createdAt).toPersianDateStr(), - style: Theme.of(context).textTheme.overline, - color: DesignConfig.isDark - ? Theme.of(context).colorScheme.white - : Theme.of(context).colorScheme.black, - ), - ), - ), - Padding( - padding: EdgeInsets.only( - right: message.writedByAdmin ? 20 : 0, - left: !message.writedByAdmin ? 20 : 0, - ), - child: Column( - crossAxisAlignment: message.writedByAdmin - ? CrossAxisAlignment.start - : CrossAxisAlignment.end, - children: [ - _MessageContainer( - writedByAdmin: message.writedByAdmin, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (message.text != null) DidvanText(message.text!), - if (message.audio != null || message.audioFile != null) - AudioWidget( - audioFile: message.audioFile, - audioUrl: message.audio, - id: message.id, - ), - if (message.radar != null) const DidvanDivider(), - if (message.radar != null) const SizedBox(height: 4), - if (message.radar != null) - _ReplyRadarOverview(message: message), - if (message.radar != null) const SizedBox(height: 4), - ], + return GestureDetector( + onLongPress: () { + if (state.deletionQueue.contains(message.id) || message.writedByAdmin) { + return; + } + state.deletionQueue.add(message.id); + state.update(); + }, + onTap: () { + if (state.deletionQueue.isEmpty || message.writedByAdmin) return; + if (!state.deletionQueue.contains(message.id)) { + state.deletionQueue.add(message.id); + } else { + state.deletionQueue.remove(message.id); + } + state.update(); + }, + child: Container( + color: state.deletionQueue.contains(message.id) + ? Theme.of(context).colorScheme.secondaryDisabled.withOpacity(0.5) + : null, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Column( + crossAxisAlignment: message.writedByAdmin + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + if (message.id == firstMessageOfGroupId) + Center( + child: Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.splash, + borderRadius: DesignConfig.lowBorderRadius, + ), + child: DidvanText( + DateTime.parse(message.createdAt).toPersianDateStr(), + style: Theme.of(context).textTheme.overline, + color: DesignConfig.isDark + ? Theme.of(context).colorScheme.white + : Theme.of(context).colorScheme.black, + ), ), ), - const SizedBox(height: 4), - Row( - mainAxisSize: MainAxisSize.min, + Padding( + padding: EdgeInsets.only( + right: message.writedByAdmin ? 20 : 0, + left: !message.writedByAdmin ? 20 : 0, + ), + child: Column( + crossAxisAlignment: message.writedByAdmin + ? CrossAxisAlignment.start + : CrossAxisAlignment.end, children: [ - DidvanText( - DateTimeUtils.timeWithAmPm(message.createdAt), - style: Theme.of(context).textTheme.overline, - color: Theme.of(context).colorScheme.caption, + _MessageContainer( + writedByAdmin: message.writedByAdmin, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (message.text != null) DidvanText(message.text!), + if (message.audio != null || message.audioFile != null) + AudioWidget( + audioFile: message.audioFile, + audioUrl: message.audio, + id: message.id, + ), + if (message.radar != null) const DidvanDivider(), + if (message.radar != null) const SizedBox(height: 4), + if (message.radar != null) + _ReplyRadarOverview(message: message), + if (message.radar != null) const SizedBox(height: 4), + ], + ), + ), + const SizedBox(height: 4), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + DidvanText( + DateTimeUtils.timeWithAmPm(message.createdAt), + style: Theme.of(context).textTheme.overline, + color: Theme.of(context).colorScheme.caption, + ), + if (!message.writedByAdmin) + Icon( + message.readed + ? DidvanIcons.check_double_light + : DidvanIcons.check_light, + size: 16, + ) + ], ), - if (!message.writedByAdmin) - Icon( - message.readed - ? DidvanIcons.check_double_light - : DidvanIcons.check_light, - size: 16, - ) ], ), - ], - ), + ), + ], ), - ], + ), ); } } @@ -177,7 +201,10 @@ class _MessageContainer extends StatelessWidget { bottomLeft: writedByAdmin ? Radius.zero : null, bottomRight: !writedByAdmin ? Radius.zero : null, ), - color: writedByAdmin ? null : Theme.of(context).colorScheme.focused, + color: (writedByAdmin + ? Theme.of(context).colorScheme.surface + : Theme.of(context).colorScheme.focused) + .withOpacity(0.9), border: Border.all( color: Theme.of(context).colorScheme.border, width: 0.5,