feat(ai-scribe): Add Enter to send prompt directly and Shift + Enter to add new line

This commit is contained in:
dab246
2025-12-18 16:33:32 +07:00
committed by Dat H. Pham
parent 54ca4595ad
commit d62b3db985
@@ -1,6 +1,7 @@
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:scribe/scribe.dart'; import 'package:scribe/scribe.dart';
typedef OnCustomPromptCallback = void Function(String customPrompt); typedef OnCustomPromptCallback = void Function(String customPrompt);
@@ -22,6 +23,7 @@ class AIScribeBar extends StatefulWidget {
class _AIScribeBarState extends State<AIScribeBar> { class _AIScribeBarState extends State<AIScribeBar> {
final TextEditingController _controller = TextEditingController(); final TextEditingController _controller = TextEditingController();
final ValueNotifier<bool> _isButtonEnabled = ValueNotifier(false); final ValueNotifier<bool> _isButtonEnabled = ValueNotifier(false);
final FocusNode _focusNode = FocusNode();
@override @override
void initState() { void initState() {
@@ -34,6 +36,7 @@ class _AIScribeBarState extends State<AIScribeBar> {
_controller.removeListener(_onTextChanged); _controller.removeListener(_onTextChanged);
_controller.dispose(); _controller.dispose();
_isButtonEnabled.dispose(); _isButtonEnabled.dispose();
_focusNode.dispose();
super.dispose(); super.dispose();
} }
@@ -68,6 +71,9 @@ class _AIScribeBarState extends State<AIScribeBar> {
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: KeyboardListener(
focusNode: _focusNode,
onKeyEvent: _handleKeyboardEvent,
child: TextField( child: TextField(
controller: _controller, controller: _controller,
decoration: InputDecoration( decoration: InputDecoration(
@@ -81,7 +87,7 @@ class _AIScribeBarState extends State<AIScribeBar> {
maxLines: null, maxLines: null,
keyboardType: TextInputType.multiline, keyboardType: TextInputType.multiline,
cursorHeight: 16, cursorHeight: 16,
onSubmitted: (_) => _onSendPressed(), ),
), ),
), ),
const SizedBox(width: AIScribeSizes.fieldSpacing), const SizedBox(width: AIScribeSizes.fieldSpacing),
@@ -104,4 +110,16 @@ class _AIScribeBarState extends State<AIScribeBar> {
), ),
); );
} }
void _handleKeyboardEvent(KeyEvent event) {
if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.enter) {
final keys = HardwareKeyboard.instance.logicalKeysPressed;
final isShiftPressed = keys.contains(LogicalKeyboardKey.shiftLeft) ||
keys.contains(LogicalKeyboardKey.shiftRight);
if (!isShiftPressed) {
_onSendPressed();
}
}
}
} }