Skip to content

Commit d124755

Browse files
committed
compose [nfc]: Refactor _{Stream,FixedDestination}ComposeBoxBody
As mentioned in a previous commit, these have become thin, stateless wrappers that configure _ComposeBoxBody. Factor them as subclasses, which feels neater and should help keep their implementations from diverging unintentionally.
1 parent 009e415 commit d124755

File tree

1 file changed

+51
-70
lines changed

1 file changed

+51
-70
lines changed

lib/widgets/compose_box.dart

+51-70
Original file line numberDiff line numberDiff line change
@@ -1030,23 +1030,16 @@ class _ComposeBoxContainer extends StatelessWidget {
10301030
}
10311031
}
10321032

1033-
class _ComposeBoxBody extends StatelessWidget {
1034-
const _ComposeBoxBody({
1035-
required this.narrow,
1036-
required this.controller,
1037-
required this.topicInput,
1038-
required this.contentInput,
1039-
required this.sendButton,
1040-
});
1041-
1033+
/// The text inputs, compose-button row, and send button for the compose box.
1034+
abstract class _ComposeBoxBody extends StatelessWidget {
10421035
/// The narrow on view in the message list.
1043-
final Narrow narrow;
1036+
Narrow get narrow;
10441037

1045-
final ComposeBoxController controller;
1038+
ComposeBoxController get controller;
10461039

1047-
final Widget? topicInput;
1048-
final Widget contentInput;
1049-
final Widget sendButton;
1040+
Widget? buildTopicInput();
1041+
Widget buildContentInput();
1042+
Widget buildSendButton();
10501043

10511044
@override
10521045
Widget build(BuildContext context) {
@@ -1079,15 +1072,16 @@ class _ComposeBoxBody extends StatelessWidget {
10791072
_AttachFromCameraButton(contentController: content, contentFocusNode: contentFocusNode),
10801073
];
10811074

1075+
final topicInput = buildTopicInput();
10821076
return _ComposeBoxContainer(
10831077
child: Column(children: [
10841078
Padding(
10851079
padding: const EdgeInsets.symmetric(horizontal: 8),
10861080
child: Theme(
10871081
data: inputThemeData,
10881082
child: Column(children: [
1089-
if (topicInput != null) topicInput!,
1090-
contentInput,
1083+
if (topicInput != null) topicInput,
1084+
buildContentInput(),
10911085
]))),
10921086
SizedBox(
10931087
height: _composeButtonSize,
@@ -1097,7 +1091,7 @@ class _ComposeBoxBody extends StatelessWidget {
10971091
mainAxisAlignment: MainAxisAlignment.spaceBetween,
10981092
children: [
10991093
Row(children: composeButtons),
1100-
sendButton,
1094+
buildSendButton(),
11011095
]))),
11021096
]));
11031097
}
@@ -1138,42 +1132,35 @@ class FixedDestinationComposeBoxController extends ComposeBoxController {}
11381132
///
11391133
/// This offers a text input for the topic to send to,
11401134
/// in addition to a text input for the message content.
1141-
class _StreamComposeBoxBody extends StatelessWidget {
1142-
const _StreamComposeBoxBody({required this.narrow, required this.controller});
1135+
class _StreamComposeBoxBody extends _ComposeBoxBody {
1136+
_StreamComposeBoxBody({required this.narrow, required this.controller});
11431137

1144-
/// The narrow on view in the message list.
1138+
@override
11451139
final ChannelNarrow narrow;
11461140

1147-
final StreamComposeBoxController controller;
1148-
11491141
@override
1150-
Widget build(BuildContext context) {
1151-
final StreamComposeBoxController(
1152-
:topic, :content, :topicFocusNode, :contentFocusNode,
1153-
) = controller;
1142+
final StreamComposeBoxController controller;
11541143

1155-
return _ComposeBoxBody(
1156-
narrow: narrow,
1157-
controller: controller,
1158-
topicInput: _TopicInput(
1159-
streamId: narrow.streamId,
1160-
controller: topic,
1161-
focusNode: topicFocusNode,
1162-
contentFocusNode: contentFocusNode,
1163-
),
1164-
contentInput: _StreamContentInput(
1165-
narrow: narrow,
1166-
topicController: topic,
1167-
controller: content,
1168-
focusNode: contentFocusNode,
1169-
),
1170-
sendButton: _SendButton(
1171-
topicController: topic,
1172-
contentController: content,
1173-
getDestination: () => StreamDestination(
1174-
narrow.streamId, topic.textNormalized),
1175-
));
1176-
}
1144+
@override Widget buildTopicInput() => _TopicInput(
1145+
streamId: narrow.streamId,
1146+
controller: controller.topic,
1147+
focusNode: controller.topicFocusNode,
1148+
contentFocusNode: controller.contentFocusNode,
1149+
);
1150+
1151+
@override Widget buildContentInput() => _StreamContentInput(
1152+
narrow: narrow,
1153+
topicController: controller.topic,
1154+
controller: controller.content,
1155+
focusNode: controller.contentFocusNode,
1156+
);
1157+
1158+
@override Widget buildSendButton() => _SendButton(
1159+
topicController: controller.topic,
1160+
contentController: controller.content,
1161+
getDestination: () => StreamDestination(
1162+
narrow.streamId, controller.topic.textNormalized),
1163+
);
11771164
}
11781165

11791166
class _ErrorBanner extends StatelessWidget {
@@ -1197,34 +1184,28 @@ class _ErrorBanner extends StatelessWidget {
11971184
}
11981185
}
11991186

1200-
class _FixedDestinationComposeBoxBody extends StatelessWidget {
1201-
const _FixedDestinationComposeBoxBody({required this.narrow, required this.controller});
1187+
class _FixedDestinationComposeBoxBody extends _ComposeBoxBody {
1188+
_FixedDestinationComposeBoxBody({required this.narrow, required this.controller});
12021189

1190+
@override
12031191
final SendableNarrow narrow;
12041192

1193+
@override
12051194
final FixedDestinationComposeBoxController controller;
12061195

1207-
@override
1208-
Widget build(BuildContext context) {
1209-
final FixedDestinationComposeBoxController(
1210-
:content, :contentFocusNode,
1211-
) = controller;
1196+
@override Widget? buildTopicInput() => null;
12121197

1213-
return _ComposeBoxBody(
1214-
narrow: narrow,
1215-
controller: controller,
1216-
topicInput: null,
1217-
contentInput: _FixedDestinationContentInput(
1218-
narrow: narrow,
1219-
controller: content,
1220-
focusNode: contentFocusNode,
1221-
),
1222-
sendButton: _SendButton(
1223-
topicController: null,
1224-
contentController: content,
1225-
getDestination: () => narrow.destination,
1226-
));
1227-
}
1198+
@override Widget buildContentInput() => _FixedDestinationContentInput(
1199+
narrow: narrow,
1200+
controller: controller.content,
1201+
focusNode: controller.contentFocusNode,
1202+
);
1203+
1204+
@override Widget buildSendButton() => _SendButton(
1205+
topicController: null,
1206+
contentController: controller.content,
1207+
getDestination: () => narrow.destination,
1208+
);
12281209
}
12291210

12301211
class ComposeBox extends StatefulWidget {

0 commit comments

Comments
 (0)