@@ -667,32 +667,20 @@ class _SendButtonState extends State<_SendButton> {
667
667
}
668
668
}
669
669
670
- /// A compose box for use in a stream narrow.
671
- ///
672
- /// This offers a text input for the topic to send to,
673
- /// in addition to a text input for the message content.
674
- class _StreamComposeBox extends StatefulWidget {
675
- const _StreamComposeBox ({required this .narrow});
676
-
677
- /// The narrow on view in the message list.
678
- final StreamNarrow narrow;
679
-
680
- @override
681
- State <_StreamComposeBox > createState () => _StreamComposeBoxState ();
682
- }
683
-
684
- class _StreamComposeBoxState extends State <_StreamComposeBox > {
685
- final _topicController = ComposeTopicController ();
686
- final _contentController = ComposeContentController ();
687
- final _contentFocusNode = FocusNode ();
670
+ class _ComposeBoxLayout extends StatelessWidget {
671
+ const _ComposeBoxLayout ({
672
+ required this .topicInput,
673
+ required this .contentInput,
674
+ required this .sendButton,
675
+ required this .contentController,
676
+ required this .contentFocusNode,
677
+ });
688
678
689
- @override
690
- void dispose () {
691
- _topicController.dispose ();
692
- _contentController.dispose ();
693
- _contentFocusNode.dispose ();
694
- super .dispose ();
695
- }
679
+ final Widget ? topicInput;
680
+ final Widget contentInput;
681
+ final Widget sendButton;
682
+ final ComposeContentController contentController;
683
+ final FocusNode contentFocusNode;
696
684
697
685
@override
698
686
Widget build (BuildContext context) {
@@ -713,12 +701,6 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
713
701
),
714
702
);
715
703
716
- final topicInput = TextField (
717
- controller: _topicController,
718
- style: TextStyle (color: colorScheme.onSurface),
719
- decoration: const InputDecoration (hintText: 'Topic' ),
720
- );
721
-
722
704
return Material (
723
705
color: colorScheme.surfaceVariant,
724
706
child: SafeArea (
@@ -731,31 +713,75 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
731
713
child: Theme (
732
714
data: inputThemeData,
733
715
child: Column (children: [
734
- topicInput,
735
- const SizedBox (height: 8 ),
736
- _StreamContentInput (
737
- narrow: widget.narrow,
738
- topicController: _topicController,
739
- controller: _contentController,
740
- focusNode: _contentFocusNode),
716
+ if (topicInput != null ) topicInput! ,
717
+ if (topicInput != null ) const SizedBox (height: 8 ),
718
+ contentInput,
741
719
]))),
742
720
const SizedBox (width: 8 ),
743
- _SendButton (
744
- topicController: _topicController,
745
- contentController: _contentController,
746
- getDestination: () => StreamDestination (
747
- widget.narrow.streamId, _topicController.textNormalized),
748
- ),
721
+ sendButton,
749
722
]),
750
723
Theme (
751
724
data: themeData.copyWith (
752
725
iconTheme: themeData.iconTheme.copyWith (color: colorScheme.onSurfaceVariant)),
753
726
child: Row (children: [
754
- _AttachFileButton (contentController: _contentController , contentFocusNode: _contentFocusNode ),
755
- _AttachMediaButton (contentController: _contentController , contentFocusNode: _contentFocusNode ),
756
- _AttachFromCameraButton (contentController: _contentController , contentFocusNode: _contentFocusNode ),
727
+ _AttachFileButton (contentController: contentController , contentFocusNode: contentFocusNode ),
728
+ _AttachMediaButton (contentController: contentController , contentFocusNode: contentFocusNode ),
729
+ _AttachFromCameraButton (contentController: contentController , contentFocusNode: contentFocusNode ),
757
730
])),
758
- ]))));
731
+ ])))); }
732
+ }
733
+
734
+ /// A compose box for use in a stream narrow.
735
+ ///
736
+ /// This offers a text input for the topic to send to,
737
+ /// in addition to a text input for the message content.
738
+ class _StreamComposeBox extends StatefulWidget {
739
+ const _StreamComposeBox ({required this .narrow});
740
+
741
+ /// The narrow on view in the message list.
742
+ final StreamNarrow narrow;
743
+
744
+ @override
745
+ State <_StreamComposeBox > createState () => _StreamComposeBoxState ();
746
+ }
747
+
748
+ class _StreamComposeBoxState extends State <_StreamComposeBox > {
749
+ final _topicController = ComposeTopicController ();
750
+ final _contentController = ComposeContentController ();
751
+ final _contentFocusNode = FocusNode ();
752
+
753
+ @override
754
+ void dispose () {
755
+ _topicController.dispose ();
756
+ _contentController.dispose ();
757
+ _contentFocusNode.dispose ();
758
+ super .dispose ();
759
+ }
760
+
761
+ @override
762
+ Widget build (BuildContext context) {
763
+ final colorScheme = Theme .of (context).colorScheme;
764
+
765
+ return _ComposeBoxLayout (
766
+ contentController: _contentController,
767
+ contentFocusNode: _contentFocusNode,
768
+ topicInput: TextField (
769
+ controller: _topicController,
770
+ style: TextStyle (color: colorScheme.onSurface),
771
+ decoration: const InputDecoration (hintText: 'Topic' ),
772
+ ),
773
+ contentInput: _StreamContentInput (
774
+ narrow: widget.narrow,
775
+ topicController: _topicController,
776
+ controller: _contentController,
777
+ focusNode: _contentFocusNode,
778
+ ),
779
+ sendButton: _SendButton (
780
+ topicController: _topicController,
781
+ contentController: _contentController,
782
+ getDestination: () => StreamDestination (
783
+ widget.narrow.streamId, _topicController.textNormalized),
784
+ ));
759
785
}
760
786
}
761
787
0 commit comments