@@ -271,16 +271,21 @@ class _ContentInput extends StatelessWidget {
271
271
required this .controller,
272
272
required this .focusNode,
273
273
required this .hintText,
274
+ this .enabled = true ,
274
275
});
275
276
276
277
final Narrow narrow;
277
278
final ComposeContentController controller;
278
279
final FocusNode focusNode;
279
280
final String hintText;
281
+ final bool enabled;
280
282
281
283
@override
282
284
Widget build (BuildContext context) {
283
285
ColorScheme colorScheme = Theme .of (context).colorScheme;
286
+ if (! enabled) {
287
+ controller.clear ();
288
+ }
284
289
285
290
return InputDecorator (
286
291
decoration: const InputDecoration (),
@@ -303,6 +308,7 @@ class _ContentInput extends StatelessWidget {
303
308
decoration: InputDecoration .collapsed (hintText: hintText),
304
309
maxLines: null ,
305
310
textCapitalization: TextCapitalization .sentences,
311
+ enabled: enabled,
306
312
);
307
313
}),
308
314
));
@@ -377,31 +383,36 @@ class _FixedDestinationContentInput extends StatelessWidget {
377
383
required this .narrow,
378
384
required this .controller,
379
385
required this .focusNode,
386
+ required this .enabled,
380
387
});
381
388
382
389
final SendableNarrow narrow;
383
390
final ComposeContentController controller;
384
391
final FocusNode focusNode;
392
+ final bool enabled;
385
393
386
394
String _hintText (BuildContext context) {
387
395
final zulipLocalizations = ZulipLocalizations .of (context);
388
- switch (narrow) {
389
- case TopicNarrow (: final streamId, : final topic):
396
+ switch (( narrow, enabled) ) {
397
+ case ( TopicNarrow (: final streamId, : final topic), _ ):
390
398
final store = PerAccountStoreWidget .of (context);
391
399
final streamName = store.streams[streamId]? .name
392
400
?? zulipLocalizations.composeBoxUnknownChannelName;
393
401
return zulipLocalizations.composeBoxChannelContentHint (streamName, topic);
394
402
395
- case DmNarrow (otherRecipientIds: []): // The self-1:1 thread.
403
+ case ( DmNarrow (otherRecipientIds: []), _ ): // The self-1:1 thread.
396
404
return zulipLocalizations.composeBoxSelfDmContentHint;
397
405
398
- case DmNarrow (otherRecipientIds: [final otherUserId]):
406
+ case ( DmNarrow (otherRecipientIds: [final otherUserId]), true ):
399
407
final store = PerAccountStoreWidget .of (context);
400
408
final fullName = store.users[otherUserId]? .fullName;
401
409
if (fullName == null ) return zulipLocalizations.composeBoxGenericContentHint;
402
410
return zulipLocalizations.composeBoxDmContentHint (fullName);
403
411
404
- case DmNarrow (): // A group DM thread.
412
+ case (DmNarrow (: final otherRecipientIds), false ):
413
+ return zulipLocalizations.composeBoxDeactivatedDmContentHint (otherRecipientIds.length);
414
+
415
+ case (DmNarrow (), true ): // A group DM thread.
405
416
return zulipLocalizations.composeBoxGroupDmContentHint;
406
417
}
407
418
}
@@ -412,7 +423,8 @@ class _FixedDestinationContentInput extends StatelessWidget {
412
423
narrow: narrow,
413
424
controller: controller,
414
425
focusNode: focusNode,
415
- hintText: _hintText (context));
426
+ hintText: _hintText (context),
427
+ enabled: enabled);
416
428
}
417
429
}
418
430
@@ -492,10 +504,15 @@ Future<void> _uploadFiles({
492
504
}
493
505
494
506
abstract class _AttachUploadsButton extends StatelessWidget {
495
- const _AttachUploadsButton ({required this .contentController, required this .contentFocusNode});
507
+ const _AttachUploadsButton ({
508
+ required this .contentController,
509
+ required this .contentFocusNode,
510
+ required this .enabled,
511
+ });
496
512
497
513
final ComposeContentController contentController;
498
514
final FocusNode contentFocusNode;
515
+ final bool enabled;
499
516
500
517
IconData get icon;
501
518
String tooltip (ZulipLocalizations zulipLocalizations);
@@ -534,7 +551,7 @@ abstract class _AttachUploadsButton extends StatelessWidget {
534
551
return IconButton (
535
552
icon: Icon (icon),
536
553
tooltip: tooltip (zulipLocalizations),
537
- onPressed: () => _handlePress (context));
554
+ onPressed: enabled ? () => _handlePress (context) : null );
538
555
}
539
556
}
540
557
@@ -578,7 +595,11 @@ Future<Iterable<_File>> _getFilePickerFiles(BuildContext context, FileType type)
578
595
}
579
596
580
597
class _AttachFileButton extends _AttachUploadsButton {
581
- const _AttachFileButton ({required super .contentController, required super .contentFocusNode});
598
+ const _AttachFileButton ({
599
+ required super .contentController,
600
+ required super .contentFocusNode,
601
+ required super .enabled,
602
+ });
582
603
583
604
@override
584
605
IconData get icon => Icons .attach_file;
@@ -594,7 +615,11 @@ class _AttachFileButton extends _AttachUploadsButton {
594
615
}
595
616
596
617
class _AttachMediaButton extends _AttachUploadsButton {
597
- const _AttachMediaButton ({required super .contentController, required super .contentFocusNode});
618
+ const _AttachMediaButton ({
619
+ required super .contentController,
620
+ required super .contentFocusNode,
621
+ required super .enabled,
622
+ });
598
623
599
624
@override
600
625
IconData get icon => Icons .image;
@@ -611,7 +636,11 @@ class _AttachMediaButton extends _AttachUploadsButton {
611
636
}
612
637
613
638
class _AttachFromCameraButton extends _AttachUploadsButton {
614
- const _AttachFromCameraButton ({required super .contentController, required super .contentFocusNode});
639
+ const _AttachFromCameraButton ({
640
+ required super .contentController,
641
+ required super .contentFocusNode,
642
+ required super .enabled,
643
+ });
615
644
616
645
@override
617
646
IconData get icon => Icons .camera_alt;
@@ -667,11 +696,13 @@ class _SendButton extends StatefulWidget {
667
696
required this .topicController,
668
697
required this .contentController,
669
698
required this .getDestination,
699
+ this .enabled = true ,
670
700
});
671
701
672
702
final ComposeTopicController ? topicController;
673
703
final ComposeContentController contentController;
674
704
final MessageDestination Function () getDestination;
705
+ final bool enabled;
675
706
676
707
@override
677
708
State <_SendButton > createState () => _SendButtonState ();
@@ -776,7 +807,7 @@ class _SendButtonState extends State<_SendButton> {
776
807
),
777
808
color: foregroundColor,
778
809
icon: const Icon (Icons .send),
779
- onPressed: _send));
810
+ onPressed: widget.enabled ? _send : null ));
780
811
}
781
812
}
782
813
@@ -787,13 +818,15 @@ class _ComposeBoxLayout extends StatelessWidget {
787
818
required this .sendButton,
788
819
required this .contentController,
789
820
required this .contentFocusNode,
821
+ this .enabled = true ,
790
822
});
791
823
792
824
final Widget ? topicInput;
793
825
final Widget contentInput;
794
826
final Widget sendButton;
795
827
final ComposeContentController contentController;
796
828
final FocusNode contentFocusNode;
829
+ final bool enabled;
797
830
798
831
@override
799
832
Widget build (BuildContext context) {
@@ -837,9 +870,21 @@ class _ComposeBoxLayout extends StatelessWidget {
837
870
data: themeData.copyWith (
838
871
iconTheme: themeData.iconTheme.copyWith (color: colorScheme.onSurfaceVariant)),
839
872
child: Row (children: [
840
- _AttachFileButton (contentController: contentController, contentFocusNode: contentFocusNode),
841
- _AttachMediaButton (contentController: contentController, contentFocusNode: contentFocusNode),
842
- _AttachFromCameraButton (contentController: contentController, contentFocusNode: contentFocusNode),
873
+ _AttachFileButton (
874
+ contentController: contentController,
875
+ contentFocusNode: contentFocusNode,
876
+ enabled: enabled,
877
+ ),
878
+ _AttachMediaButton (
879
+ contentController: contentController,
880
+ contentFocusNode: contentFocusNode,
881
+ enabled: enabled,
882
+ ),
883
+ _AttachFromCameraButton (
884
+ contentController: contentController,
885
+ contentFocusNode: contentFocusNode,
886
+ enabled: enabled,
887
+ ),
843
888
])),
844
889
])))); }
845
890
}
@@ -937,19 +982,28 @@ class _FixedDestinationComposeBoxState extends State<_FixedDestinationComposeBox
937
982
938
983
@override
939
984
Widget build (BuildContext context) {
985
+ final store = PerAccountStoreWidget .of (context);
986
+ final bool enabled = switch (widget.narrow) {
987
+ DmNarrow (: final otherRecipientIds) => otherRecipientIds.every ((id) =>
988
+ store.users[id]? .isActive ?? true ),
989
+ TopicNarrow () => true ,
990
+ };
940
991
return _ComposeBoxLayout (
941
992
contentController: _contentController,
942
993
contentFocusNode: _contentFocusNode,
943
994
topicInput: null ,
995
+ enabled: enabled,
944
996
contentInput: _FixedDestinationContentInput (
945
997
narrow: widget.narrow,
946
998
controller: _contentController,
947
999
focusNode: _contentFocusNode,
1000
+ enabled: enabled,
948
1001
),
949
1002
sendButton: _SendButton (
950
1003
topicController: null ,
951
1004
contentController: _contentController,
952
1005
getDestination: () => widget.narrow.destination,
1006
+ enabled: enabled,
953
1007
));
954
1008
}
955
1009
}
0 commit comments