delete direct messages + bug fixes
This commit is contained in:
parent
0c47465d2a
commit
5072704b86
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -20,24 +20,24 @@ class AudioWidget extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StreamBuilder<bool>(
|
||||
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<bool>(
|
||||
stream: MediaService.audioPlayer.isPlaying,
|
||||
builder: (context, snapshot) {
|
||||
return _AudioControllerButton(
|
||||
audioFile: audioFile,
|
||||
audioUrl: audioUrl,
|
||||
id: id,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,85 +18,109 @@ 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(
|
||||
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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue