Skip to content

Commit 8d9b03b

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 515d841 commit 8d9b03b

File tree

1 file changed

+70
-44
lines changed

1 file changed

+70
-44
lines changed

lib/widgets/compose_box.dart

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -667,28 +667,20 @@ class _SendButtonState extends State<_SendButton> {
667667
}
668668
}
669669

670-
/// The compose box for writing a stream message.
671-
class _StreamComposeBox extends StatefulWidget {
672-
const _StreamComposeBox({required this.narrow});
673-
674-
final StreamNarrow narrow;
675-
676-
@override
677-
State<_StreamComposeBox> createState() => _StreamComposeBoxState();
678-
}
679-
680-
class _StreamComposeBoxState extends State<_StreamComposeBox> {
681-
final _topicController = ComposeTopicController();
682-
final _contentController = ComposeContentController();
683-
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+
});
684678

685-
@override
686-
void dispose() {
687-
_topicController.dispose();
688-
_contentController.dispose();
689-
_contentFocusNode.dispose();
690-
super.dispose();
691-
}
679+
final Widget? topicInput;
680+
final Widget contentInput;
681+
final Widget sendButton;
682+
final ComposeContentController contentController;
683+
final FocusNode contentFocusNode;
692684

693685
@override
694686
Widget build(BuildContext context) {
@@ -709,12 +701,6 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
709701
),
710702
);
711703

712-
final topicInput = TextField(
713-
controller: _topicController,
714-
style: TextStyle(color: colorScheme.onSurface),
715-
decoration: const InputDecoration(hintText: 'Topic'),
716-
);
717-
718704
return Material(
719705
color: colorScheme.surfaceVariant,
720706
child: SafeArea(
@@ -727,31 +713,71 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
727713
child: Theme(
728714
data: inputThemeData,
729715
child: Column(children: [
730-
topicInput,
731-
const SizedBox(height: 8),
732-
_StreamContentInput(
733-
narrow: widget.narrow,
734-
topicController: _topicController,
735-
controller: _contentController,
736-
focusNode: _contentFocusNode),
716+
if (topicInput != null) topicInput!,
717+
if (topicInput != null) const SizedBox(height: 8),
718+
contentInput,
737719
]))),
738720
const SizedBox(width: 8),
739-
_SendButton(
740-
topicController: _topicController,
741-
contentController: _contentController,
742-
getDestination: () => StreamDestination(
743-
widget.narrow.streamId, _topicController.textNormalized),
744-
),
721+
sendButton,
745722
]),
746723
Theme(
747724
data: themeData.copyWith(
748725
iconTheme: themeData.iconTheme.copyWith(color: colorScheme.onSurfaceVariant)),
749726
child: Row(children: [
750-
_AttachFileButton(contentController: _contentController, contentFocusNode: _contentFocusNode),
751-
_AttachMediaButton(contentController: _contentController, contentFocusNode: _contentFocusNode),
752-
_AttachFromCameraButton(contentController: _contentController, contentFocusNode: _contentFocusNode),
727+
_AttachFileButton(contentController: contentController, contentFocusNode: contentFocusNode),
728+
_AttachMediaButton(contentController: contentController, contentFocusNode: contentFocusNode),
729+
_AttachFromCameraButton(contentController: contentController, contentFocusNode: contentFocusNode),
753730
])),
754-
]))));
731+
])))); }
732+
}
733+
734+
/// The compose box for writing a stream message.
735+
class _StreamComposeBox extends StatefulWidget {
736+
const _StreamComposeBox({required this.narrow});
737+
738+
final StreamNarrow narrow;
739+
740+
@override
741+
State<_StreamComposeBox> createState() => _StreamComposeBoxState();
742+
}
743+
744+
class _StreamComposeBoxState extends State<_StreamComposeBox> {
745+
final _topicController = ComposeTopicController();
746+
final _contentController = ComposeContentController();
747+
final _contentFocusNode = FocusNode();
748+
749+
@override
750+
void dispose() {
751+
_topicController.dispose();
752+
_contentController.dispose();
753+
_contentFocusNode.dispose();
754+
super.dispose();
755+
}
756+
757+
@override
758+
Widget build(BuildContext context) {
759+
final colorScheme = Theme.of(context).colorScheme;
760+
761+
return _ComposeBoxLayout(
762+
contentController: _contentController,
763+
contentFocusNode: _contentFocusNode,
764+
topicInput: TextField(
765+
controller: _topicController,
766+
style: TextStyle(color: colorScheme.onSurface),
767+
decoration: const InputDecoration(hintText: 'Topic'),
768+
),
769+
contentInput: _StreamContentInput(
770+
narrow: widget.narrow,
771+
topicController: _topicController,
772+
controller: _contentController,
773+
focusNode: _contentFocusNode,
774+
),
775+
sendButton: _SendButton(
776+
topicController: _topicController,
777+
contentController: _contentController,
778+
getDestination: () => StreamDestination(
779+
widget.narrow.streamId, _topicController.textNormalized),
780+
));
755781
}
756782
}
757783

0 commit comments

Comments
 (0)