diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 87231b034..283d959e3 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -421,7 +421,9 @@ class ChatController extends State inputFocus = FocusNode(onKeyEvent: _customEnterKeyHandling); scrollController.addListener(_updateScrollController); - inputFocus.addListener(_inputFocusListener); + // #Pangea + // inputFocus.addListener(_inputFocusListener); + // Pangea# _loadDraft(); WidgetsBinding.instance.addPostFrameCallback(_shareItems); @@ -779,7 +781,9 @@ class ChatController extends State void dispose() { timeline?.cancelSubscriptions(); timeline = null; - inputFocus.removeListener(_inputFocusListener); + // #Pangea + // inputFocus.removeListener(_inputFocusListener); + // Pangea# onFocusSub?.cancel(); //#Pangea choreographer.dispose(); @@ -1238,11 +1242,13 @@ class ChatController extends State setState(() => showEmojiPicker = !showEmojiPicker); } - void _inputFocusListener() { - if (showEmojiPicker && inputFocus.hasFocus) { - setState(() => showEmojiPicker = false); - } - } + // #Pangea + // void _inputFocusListener() { + // if (showEmojiPicker && inputFocus.hasFocus) { + // setState(() => showEmojiPicker = false); + // } + // } + // Pangea# void sendLocationAction() async { await showAdaptiveDialog( diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index 6edd534ac..ee2f84a25 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -427,9 +427,7 @@ class InputBar extends StatelessWidget { } // #Pangea - void onInputTap(BuildContext context, {required FocusNode fNode}) { - fNode.requestFocus(); - + void onInputTap(BuildContext context) { // show the paywall if appropriate final choreographer = controller!.choreographer; if (MatrixState @@ -525,12 +523,7 @@ class InputBar extends StatelessWidget { style: controller?.exceededMaxLength ?? false ? const TextStyle(color: Colors.red) : null, - onTap: () { - onInputTap( - context, - fNode: focusNode, - ); - }, + onTap: () => onInputTap(context), decoration: decoration!, onChanged: (text) { // fix for the library for now diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index b53c6862f..86220ce3c 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -50,7 +50,6 @@ class Choreographer extends ChangeNotifier { Timer? _debounceTimer; String? _lastChecked; ChoreoMode _choreoMode = ChoreoMode.igc; - final ValueNotifier _sourceText = ValueNotifier(null); StreamSubscription? _languageStream; StreamSubscription? _settingsUpdateStream; @@ -62,8 +61,6 @@ class Choreographer extends ChangeNotifier { int get timesClicked => _timesClicked; ValueNotifier get isFetching => _isFetching; ChoreoMode get choreoMode => _choreoMode; - - ValueNotifier get sourceText => _sourceText; String get currentText => textController.text; void _initialize() { @@ -96,8 +93,8 @@ class Choreographer extends ChangeNotifier { _timesClicked = 0; _isFetching.value = false; _choreoRecord = null; - _sourceText.value = null; itController.clear(); + itController.clearSourceText(); igc.clear(); _resetDebounceTimer(); } @@ -250,8 +247,11 @@ class Choreographer extends ChangeNotifier { if (errorService.isError) return; igc.clear(); - _resetDebounceTimer(); + if (textController.editType == EditType.keyboard) { + itController.clearSourceText(); + } + _resetDebounceTimer(); _debounceTimer ??= Timer( const Duration(milliseconds: ChoreoConstants.msBeforeIGCStart), () => _getLanguageAssistance(), @@ -298,10 +298,11 @@ class Choreographer extends ChangeNotifier { final message = chatController.sendController.text; final fakeEventId = chatController.sendFakeMessage(); final PangeaRepresentation? originalWritten = - _choreoRecord?.includedIT == true && _sourceText.value != null + _choreoRecord?.includedIT == true && + itController.sourceText.value != null ? PangeaRepresentation( langCode: l1LangCode ?? LanguageKeys.unknownLanguage, - text: _sourceText.value!, + text: itController.sourceText.value!, originalWritten: true, originalSent: false, ) @@ -371,10 +372,8 @@ class Choreographer extends ChangeNotifier { chatController.inputFocus.unfocus(); setChoreoMode(ChoreoMode.it); - _sourceText.value = textController.text; + itController.openIT(textController.text); textController.setSystemText("", EditType.it); - - itController.openIT(); igc.clear(); _initChoreoRecord(); @@ -413,17 +412,12 @@ class Choreographer extends ChangeNotifier { notifyListeners(); } - void setSourceText(String? text) { - _sourceText.value = text; - } - void setEditingSourceText(bool value) { itController.setEditing(value); notifyListeners(); } void submitSourceTextEdits(String text) { - _sourceText.value = text; textController.setSystemText("", EditType.it); itController.onSubmitEdits(); notifyListeners(); diff --git a/lib/pangea/choreographer/controllers/extensions/choreographer_state_extension.dart b/lib/pangea/choreographer/controllers/extensions/choreographer_state_extension.dart index 9c97fdf0e..40451a1d9 100644 --- a/lib/pangea/choreographer/controllers/extensions/choreographer_state_extension.dart +++ b/lib/pangea/choreographer/controllers/extensions/choreographer_state_extension.dart @@ -21,7 +21,7 @@ extension ChoregrapherUserSettingsExtension on Choreographer { AssistanceState get assistanceState { final isSubscribed = pangeaController.subscriptionController.isSubscribed; if (isSubscribed == false) return AssistanceState.noSub; - if (currentText.isEmpty && sourceText.value == null) { + if (currentText.isEmpty && itController.sourceText.value == null) { return AssistanceState.noMessage; } diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 70cdf2505..8b9187cb7 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -20,6 +20,7 @@ import 'choreographer.dart'; class ITController { final Choreographer _choreographer; + final ValueNotifier _sourceText = ValueNotifier(null); final ValueNotifier _currentITStep = ValueNotifier(null); final Queue> _queue = Queue(); @@ -33,10 +34,9 @@ class ITController { ValueNotifier get open => _open; ValueNotifier get editing => _editing; - bool get dismissed => _dismissed; ValueNotifier get currentITStep => _currentITStep; - - ValueNotifier get _sourceText => _choreographer.sourceText; + ValueNotifier get sourceText => _sourceText; + bool get dismissed => _dismissed; ITRequestModel _request(String textInput) { assert(_sourceText.value != null); @@ -74,15 +74,20 @@ class ITController { _goldRouteTracker = null; _choreographer.setChoreoMode(ChoreoMode.igc); - _choreographer.setSourceText(null); + } + + void clearSourceText() { + _sourceText.value = null; } void dispose() { _currentITStep.dispose(); _editing.dispose(); + _sourceText.dispose(); } - void openIT() { + void openIT(String sourceText) { + _sourceText.value = sourceText; _open.value = true; continueIT(); } @@ -171,8 +176,7 @@ class ITController { } Future _initTranslationData() async { - final String currentText = _choreographer.currentText; - final res = await _safeRequest(currentText); + final res = await _safeRequest(""); if (_sourceText.value == null || !_open.value) return; if (res.isError || res.result?.goldContinuances == null) { _choreographer.errorService.setErrorAndLock( @@ -189,7 +193,7 @@ class ITController { _currentITStep.value = ITStep.fromResponse( sourceText: _sourceText.value!, - currentText: currentText, + currentText: "", responseModel: res.result!, storedGoldContinuances: _goldRouteTracker!.continuances, ); diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 4d3bb4fc3..0a5e86223 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -36,6 +36,7 @@ class ITBarState extends State with SingleTickerProviderStateMixin { final TextEditingController _sourceTextController = TextEditingController(); Timer? _successTimer; + bool _visible = false; @override void initState() { @@ -46,14 +47,8 @@ class ITBarState extends State with SingleTickerProviderStateMixin { vsync: this, ); _animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOut); - _open.value ? _controller.forward() : _controller.reverse(); - _open.addListener(() { - final nextText = _sourceText.value ?? widget.choreographer.currentText; - if (_sourceTextController.text != nextText) { - _sourceTextController.text = nextText; - } - _open.value ? _controller.forward() : _controller.reverse(); - }); + _openListener(); + _open.addListener(_openListener); } @override @@ -61,10 +56,31 @@ class ITBarState extends State with SingleTickerProviderStateMixin { _controller.dispose(); _sourceTextController.dispose(); _successTimer?.cancel(); + _open.removeListener(_openListener); super.dispose(); } - ValueNotifier get _sourceText => widget.choreographer.sourceText; + void _openListener() { + if (!mounted) return; + + final nextText = _sourceText.value ?? widget.choreographer.currentText; + if (_sourceTextController.text != nextText) { + _sourceTextController.text = nextText; + } + + if (_open.value) { + setState(() => _visible = true); + _controller.forward(); + } else { + _controller.reverse().then((value) { + if (!mounted) return; + setState(() => _visible = false); + }); + } + } + + ValueNotifier get _sourceText => + widget.choreographer.itController.sourceText; ValueNotifier get _open => widget.choreographer.itController.open; void _showFeedbackCard( @@ -165,6 +181,10 @@ class ITBarState extends State with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { + if (!_visible) { + return const SizedBox.shrink(); + } + return AnimatedBuilder( animation: _animation, builder: (context, child) => SizeTransition(