wrap chat input row in stateful widget and rebuild on choreo update to keep hint text and send button up-to-date

pull/1384/head
ggurdin 1 year ago
parent 5c7a1f554b
commit cace965456
No known key found for this signature in database
GPG Key ID: A01CB41737CBB478

@ -1,9 +1,8 @@
import 'package:animations/animations.dart'; import 'package:animations/animations.dart';
import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pages/chat/input_bar.dart';
import 'package:fluffychat/pangea/choreographer/widgets/send_button.dart'; import 'package:fluffychat/pangea/choreographer/widgets/send_button.dart';
import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/widgets/chat/input_bar_wrapper.dart';
import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
@ -34,7 +33,7 @@ class ChatInputRow extends StatelessWidget {
controller.pangeaController.languageController.activeL2Model(); controller.pangeaController.languageController.activeL2Model();
String hintText() { String hintText() {
if (controller.choreographer.choreoMode == ChoreoMode.it) { if (controller.choreographer.itController.willOpen) {
return L10n.of(context)!.buildTranslation; return L10n.of(context)!.buildTranslation;
} }
return activel1 != null && return activel1 != null &&
@ -322,10 +321,7 @@ class ChatInputRow extends StatelessWidget {
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 0.0), padding: const EdgeInsets.symmetric(vertical: 0.0),
// #Pangea child: InputBar(
// child: InputBar(
child: InputBarWrapper(
// Pangea#
room: controller.room, room: controller.room,
minLines: 1, minLines: 1,
maxLines: 8, maxLines: 8,

@ -5,7 +5,6 @@ import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart';
import 'package:fluffychat/pages/chat/chat_app_bar_title.dart'; import 'package:fluffychat/pages/chat/chat_app_bar_title.dart';
import 'package:fluffychat/pages/chat/chat_emoji_picker.dart'; import 'package:fluffychat/pages/chat/chat_emoji_picker.dart';
import 'package:fluffychat/pages/chat/chat_event_list.dart'; import 'package:fluffychat/pages/chat/chat_event_list.dart';
import 'package:fluffychat/pages/chat/chat_input_row.dart';
import 'package:fluffychat/pages/chat/pinned_events.dart'; import 'package:fluffychat/pages/chat/pinned_events.dart';
import 'package:fluffychat/pages/chat/reactions_picker.dart'; import 'package:fluffychat/pages/chat/reactions_picker.dart';
import 'package:fluffychat/pages/chat/reply_display.dart'; import 'package:fluffychat/pages/chat/reply_display.dart';
@ -13,6 +12,7 @@ import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart';
import 'package:fluffychat/pangea/choreographer/widgets/start_igc_button.dart'; import 'package:fluffychat/pangea/choreographer/widgets/start_igc_button.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart';
import 'package:fluffychat/pangea/widgets/chat/chat_floating_action_button.dart'; import 'package:fluffychat/pangea/widgets/chat/chat_floating_action_button.dart';
import 'package:fluffychat/pangea/widgets/chat/input_bar_wrapper.dart';
import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart';
import 'package:fluffychat/widgets/connection_status_header.dart'; import 'package:fluffychat/widgets/connection_status_header.dart';
@ -498,7 +498,9 @@ class ChatView extends StatelessWidget {
), ),
ReactionsPicker(controller), ReactionsPicker(controller),
ReplyDisplay(controller), ReplyDisplay(controller),
ChatInputRow(controller), ChatInputRowWrapper(
controller: controller,
),
ChatEmojiPicker(controller), ChatEmojiPicker(controller),
], ],
), ),

@ -1,48 +1,23 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:fluffychat/pages/chat/input_bar.dart'; import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/chat_input_row.dart';
import 'package:fluffychat/pangea/widgets/igc/pangea_text_controller.dart'; import 'package:fluffychat/pangea/widgets/igc/pangea_text_controller.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
class InputBarWrapper extends StatefulWidget { class ChatInputRowWrapper extends StatefulWidget {
final Room room; final ChatController controller;
final int? minLines;
final int? maxLines;
final TextInputType? keyboardType;
final TextInputAction? textInputAction;
final ValueChanged<String>? onSubmitted;
final ValueChanged<Uint8List?>? onSubmitImage;
final FocusNode? focusNode;
final PangeaTextController? controller;
final InputDecoration? decoration;
final ValueChanged<String>? onChanged;
final bool? autofocus;
final bool readOnly;
const InputBarWrapper({ const ChatInputRowWrapper({
required this.room, required this.controller,
this.minLines,
this.maxLines,
this.keyboardType,
this.onSubmitted,
this.onSubmitImage,
this.focusNode,
this.controller,
this.decoration,
this.onChanged,
this.autofocus,
this.textInputAction,
this.readOnly = false,
super.key, super.key,
}); });
@override @override
State<InputBarWrapper> createState() => InputBarWrapperState(); State<ChatInputRowWrapper> createState() => ChatInputRowWrapperState();
} }
class InputBarWrapperState extends State<InputBarWrapper> { class ChatInputRowWrapperState extends State<ChatInputRowWrapper> {
StreamSubscription? _choreoSub; StreamSubscription? _choreoSub;
String _currentText = ''; String _currentText = '';
@ -50,7 +25,7 @@ class InputBarWrapperState extends State<InputBarWrapper> {
void initState() { void initState() {
// Rebuild the widget each time there's an update from choreo // Rebuild the widget each time there's an update from choreo
_choreoSub = _choreoSub =
widget.controller?.choreographer.stateListener.stream.listen((_) { widget.controller.choreographer.stateListener.stream.listen((_) {
setState(() {}); setState(() {});
}); });
super.initState(); super.initState();
@ -63,10 +38,6 @@ class InputBarWrapperState extends State<InputBarWrapper> {
} }
void refreshOnChange(String text) { void refreshOnChange(String text) {
if (widget.onChanged != null) {
widget.onChanged!(text);
}
final bool decreasedFromMaxLength = final bool decreasedFromMaxLength =
_currentText.length >= PangeaTextController.maxLength && _currentText.length >= PangeaTextController.maxLength &&
text.length < PangeaTextController.maxLength; text.length < PangeaTextController.maxLength;
@ -81,21 +52,5 @@ class InputBarWrapperState extends State<InputBarWrapper> {
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) => ChatInputRow(widget.controller);
return InputBar(
room: widget.room,
minLines: widget.minLines,
maxLines: widget.maxLines,
keyboardType: widget.keyboardType,
onSubmitted: widget.onSubmitted,
onSubmitImage: widget.onSubmitImage,
focusNode: widget.focusNode,
controller: widget.controller,
decoration: widget.decoration,
onChanged: refreshOnChange,
autofocus: widget.autofocus,
textInputAction: widget.textInputAction,
readOnly: widget.readOnly,
);
}
} }

Loading…
Cancel
Save