Skip to content

Commit d2aabea

Browse files
committed
chore(ui): make CustomMessageAction extendable
1 parent 6a5cf55 commit d2aabea

File tree

2 files changed

+99
-49
lines changed

2 files changed

+99
-49
lines changed

packages/stream_chat_flutter/lib/src/message_action/message_action_type.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ final class ThreadReply extends MessageAction {
125125

126126
/// Custom message action that allows for additional data to be passed
127127
/// along with the message.
128-
final class CustomMessageAction extends MessageAction {
128+
class CustomMessageAction extends MessageAction {
129129
/// Create a new custom message action
130130
const CustomMessageAction({
131131
required super.message,

sample_app/lib/pages/channel_page.dart

Lines changed: 98 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -152,38 +152,15 @@ class _ChannelPageState extends State<ChannelPage> {
152152
color: colorTheme.textLowEmphasis,
153153
),
154154
title: const Text('Edit Reminder'),
155-
onTap: (message) async {
156-
Navigator.of(context).pop();
157-
158-
final option = await showDialog<ReminderOption>(
159-
context: context,
160-
builder: (_) => EditReminderDialog(
161-
isBookmarkReminder: reminder.remindAt == null,
162-
),
163-
);
164-
165-
if (option == null) return;
166-
final client = StreamChat.of(context).client;
167-
final messageId = message.id;
168-
final remindAt = option.remindAt;
169-
170-
client.updateReminder(messageId, remindAt: remindAt).ignore();
171-
},
155+
action: EditReminder(message: message, reminder: reminder),
172156
),
173157
StreamMessageAction(
174158
leading: StreamSvgIcon(
175159
icon: StreamSvgIcons.checkAll,
176160
color: colorTheme.textLowEmphasis,
177161
),
178162
title: const Text('Remove from later'),
179-
onTap: (message) {
180-
Navigator.of(context).pop();
181-
182-
final client = StreamChat.of(context).client;
183-
final messageId = message.id;
184-
185-
client.deleteReminder(messageId).ignore();
186-
},
163+
action: RemoveReminder(message: message, reminder: reminder),
187164
),
188165
] else ...[
189166
StreamMessageAction(
@@ -192,36 +169,15 @@ class _ChannelPageState extends State<ChannelPage> {
192169
color: colorTheme.textLowEmphasis,
193170
),
194171
title: const Text('Remind me'),
195-
onTap: (message) async {
196-
Navigator.of(context).pop();
197-
198-
final reminder = await showDialog<ScheduledReminder>(
199-
context: context,
200-
builder: (_) => const CreateReminderDialog(),
201-
);
202-
203-
if (reminder == null) return;
204-
final client = StreamChat.of(context).client;
205-
final messageId = message.id;
206-
final remindAt = reminder.remindAt;
207-
208-
client.createReminder(messageId, remindAt: remindAt).ignore();
209-
},
172+
action: CreateReminder(message: message),
210173
),
211174
StreamMessageAction(
212175
leading: Icon(
213176
Icons.bookmark_border,
214177
color: colorTheme.textLowEmphasis,
215178
),
216179
title: const Text('Save for later'),
217-
onTap: (message) {
218-
Navigator.of(context).pop();
219-
220-
final client = StreamChat.of(context).client;
221-
final messageId = message.id;
222-
223-
client.createReminder(messageId).ignore();
224-
},
180+
action: CreateBookmark(message: message),
225181
),
226182
],
227183
]
@@ -263,6 +219,13 @@ class _ChannelPageState extends State<ChannelPage> {
263219
defaultMessageWidget.copyWith(
264220
onReplyTap: _reply,
265221
customActions: customOptions,
222+
onCustomActionTap: (it) async => await switch (it) {
223+
CreateReminder() => _createReminder(it.message),
224+
CreateBookmark() => _createBookmark(it.message),
225+
EditReminder() => _editReminder(it.message, it.reminder),
226+
RemoveReminder() => _removeReminder(it.message, it.reminder),
227+
_ => null,
228+
},
266229
onShowMessage: (message, channel) => GoRouter.of(context).goNamed(
267230
Routes.CHANNEL_PAGE.name,
268231
pathParameters: Routes.CHANNEL_PAGE.params(channel),
@@ -283,6 +246,56 @@ class _ChannelPageState extends State<ChannelPage> {
283246
);
284247
}
285248

249+
Future<void> _editReminder(
250+
Message message,
251+
MessageReminder reminder,
252+
) async {
253+
final option = await showDialog<ReminderOption>(
254+
context: context,
255+
builder: (_) => EditReminderDialog(
256+
isBookmarkReminder: reminder.remindAt == null,
257+
),
258+
);
259+
260+
if (option == null) return;
261+
final client = StreamChat.of(context).client;
262+
final messageId = message.id;
263+
final remindAt = option.remindAt;
264+
265+
return client.updateReminder(messageId, remindAt: remindAt).ignore();
266+
}
267+
268+
Future<void> _removeReminder(
269+
Message message,
270+
MessageReminder reminder,
271+
) async {
272+
final client = StreamChat.of(context).client;
273+
final messageId = message.id;
274+
275+
return client.deleteReminder(messageId).ignore();
276+
}
277+
278+
Future<void> _createReminder(Message message) async {
279+
final reminder = await showDialog<ScheduledReminder>(
280+
context: context,
281+
builder: (_) => const CreateReminderDialog(),
282+
);
283+
284+
if (reminder == null) return;
285+
final client = StreamChat.of(context).client;
286+
final messageId = message.id;
287+
final remindAt = reminder.remindAt;
288+
289+
return client.createReminder(messageId, remindAt: remindAt).ignore();
290+
}
291+
292+
Future<void> _createBookmark(Message message) async {
293+
final client = StreamChat.of(context).client;
294+
final messageId = message.id;
295+
296+
return client.createReminder(messageId).ignore();
297+
}
298+
286299
bool defaultFilter(Message m) {
287300
final currentUser = StreamChat.of(context).currentUser;
288301
final isMyMessage = m.user?.id == currentUser?.id;
@@ -291,3 +304,40 @@ class _ChannelPageState extends State<ChannelPage> {
291304
return true;
292305
}
293306
}
307+
308+
class ReminderMessageAction extends CustomMessageAction {
309+
const ReminderMessageAction({
310+
required super.message,
311+
this.reminder,
312+
});
313+
314+
final MessageReminder? reminder;
315+
}
316+
317+
final class CreateReminder extends ReminderMessageAction {
318+
const CreateReminder({required super.message});
319+
}
320+
321+
final class CreateBookmark extends ReminderMessageAction {
322+
const CreateBookmark({required super.message});
323+
}
324+
325+
final class EditReminder extends ReminderMessageAction {
326+
const EditReminder({
327+
required super.message,
328+
required this.reminder,
329+
}) : super(reminder: reminder);
330+
331+
@override
332+
final MessageReminder reminder;
333+
}
334+
335+
final class RemoveReminder extends ReminderMessageAction {
336+
const RemoveReminder({
337+
required super.message,
338+
required this.reminder,
339+
}) : super(reminder: reminder);
340+
341+
@override
342+
final MessageReminder reminder;
343+
}

0 commit comments

Comments
 (0)