Skip to content

Commit d8084bb

Browse files
committed
compose [nfc]: Extract _ComposeBoxLayout
This separates the layout of the compose box from the setup of its state, which will let us share the former with compose boxes for other types of narrows.
1 parent 5714bb9 commit d8084bb

File tree

1 file changed

+74
-48
lines changed

1 file changed

+74
-48
lines changed

lib/widgets/compose_box.dart

+74-48
Original file line numberDiff line numberDiff line change
@@ -667,32 +667,20 @@ class _SendButtonState extends State<_SendButton> {
667667
}
668668
}
669669

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+
});
688678

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;
696684

697685
@override
698686
Widget build(BuildContext context) {
@@ -713,12 +701,6 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
713701
),
714702
);
715703

716-
final topicInput = TextField(
717-
controller: _topicController,
718-
style: TextStyle(color: colorScheme.onSurface),
719-
decoration: const InputDecoration(hintText: 'Topic'),
720-
);
721-
722704
return Material(
723705
color: colorScheme.surfaceVariant,
724706
child: SafeArea(
@@ -731,31 +713,75 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
731713
child: Theme(
732714
data: inputThemeData,
733715
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,
741719
]))),
742720
const SizedBox(width: 8),
743-
_SendButton(
744-
topicController: _topicController,
745-
contentController: _contentController,
746-
getDestination: () => StreamDestination(
747-
widget.narrow.streamId, _topicController.textNormalized),
748-
),
721+
sendButton,
749722
]),
750723
Theme(
751724
data: themeData.copyWith(
752725
iconTheme: themeData.iconTheme.copyWith(color: colorScheme.onSurfaceVariant)),
753726
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),
757730
])),
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+
));
759785
}
760786
}
761787

0 commit comments

Comments
 (0)