delete direct messages + bug fixes

This commit is contained in:
MohammadTaha Basiri 2022-04-20 21:28:03 +04:30
parent 0c47465d2a
commit 5072704b86
6 changed files with 171 additions and 88 deletions

View File

@ -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

View File

@ -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<int> ids,
String? type,

View File

@ -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<Direct> {
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<Direct> {
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,
),
],
),
),
),
],
),
),

View File

@ -16,6 +16,7 @@ class DirectState extends CoreProvier {
final List<MessageData> messages = [];
late final int typeId;
final Map<String, List<int>> dailyMessages = {};
final List<int> 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)) {

View File

@ -20,9 +20,6 @@ class AudioWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<bool>(
stream: MediaService.audioPlayer.isPlaying,
builder: (context, snapshot) {
return Row(
children: [
Expanded(
@ -30,14 +27,17 @@ class AudioWidget extends StatelessWidget {
tag: 'message-$id',
),
),
_AudioControllerButton(
StreamBuilder<bool>(
stream: MediaService.audioPlayer.isPlaying,
builder: (context, snapshot) {
return _AudioControllerButton(
audioFile: audioFile,
audioUrl: audioUrl,
id: id,
),
],
);
},
),
],
);
}
}

View File

@ -18,11 +18,33 @@ class Message extends StatelessWidget {
@override
Widget build(BuildContext context) {
final firstMessageOfGroupId = context
.read<DirectState>()
final state = context.read<DirectState>();
final firstMessageOfGroupId = state
.dailyMessages[message.createdAt.replaceAll('T', ' ').split(' ').first]!
.last;
return Column(
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,
@ -97,6 +119,8 @@ class Message extends StatelessWidget {
),
),
],
),
),
);
}
}
@ -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,