@@ -152,38 +152,15 @@ class _ChannelPageState extends State<ChannelPage> {
152
152
color: colorTheme.textLowEmphasis,
153
153
),
154
154
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),
172
156
),
173
157
StreamMessageAction (
174
158
leading: StreamSvgIcon (
175
159
icon: StreamSvgIcons .checkAll,
176
160
color: colorTheme.textLowEmphasis,
177
161
),
178
162
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),
187
164
),
188
165
] else ...[
189
166
StreamMessageAction (
@@ -192,36 +169,15 @@ class _ChannelPageState extends State<ChannelPage> {
192
169
color: colorTheme.textLowEmphasis,
193
170
),
194
171
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),
210
173
),
211
174
StreamMessageAction (
212
175
leading: Icon (
213
176
Icons .bookmark_border,
214
177
color: colorTheme.textLowEmphasis,
215
178
),
216
179
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),
225
181
),
226
182
],
227
183
]
@@ -263,6 +219,13 @@ class _ChannelPageState extends State<ChannelPage> {
263
219
defaultMessageWidget.copyWith (
264
220
onReplyTap: _reply,
265
221
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
+ },
266
229
onShowMessage: (message, channel) => GoRouter .of (context).goNamed (
267
230
Routes .CHANNEL_PAGE .name,
268
231
pathParameters: Routes .CHANNEL_PAGE .params (channel),
@@ -283,6 +246,56 @@ class _ChannelPageState extends State<ChannelPage> {
283
246
);
284
247
}
285
248
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
+
286
299
bool defaultFilter (Message m) {
287
300
final currentUser = StreamChat .of (context).currentUser;
288
301
final isMyMessage = m.user? .id == currentUser? .id;
@@ -291,3 +304,40 @@ class _ChannelPageState extends State<ChannelPage> {
291
304
return true ;
292
305
}
293
306
}
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