enable voice input for assistant

This commit is contained in:
Fabian Freund
2024-06-07 07:07:45 +02:00
parent 47e8a71113
commit fa5b65eec7
3 changed files with 44 additions and 25 deletions
@@ -0,0 +1,32 @@
import 'package:bang_navigator/utils/ui_helper.dart' as ui_helper;
import 'package:flutter/material.dart';
import 'package:speech_to_text_google_dialog/speech_to_text_google_dialog.dart';
class SpeechToTextButton extends StatelessWidget {
final Function(dynamic data) onTextReceived;
const SpeechToTextButton({required this.onTextReceived, super.key});
@override
Widget build(BuildContext context) {
return IconButton(
onPressed: () async {
final isServiceAvailable =
await SpeechToTextGoogleDialog.getInstance().showGoogleDialog(
onTextReceived: onTextReceived,
// locale: "en-US",
);
if (!isServiceAvailable) {
if (context.mounted) {
ui_helper.showErrorMessage(
context,
'Service is not available',
);
}
}
},
icon: const Icon(Icons.mic),
);
}
}
@@ -1,5 +1,6 @@
import 'package:bang_navigator/features/search_browser/domain/entities/modes.dart'; import 'package:bang_navigator/features/search_browser/domain/entities/modes.dart';
import 'package:bang_navigator/features/search_browser/presentation/widgets/sheets/shared_content_sheet.dart'; import 'package:bang_navigator/features/search_browser/presentation/widgets/sheets/shared_content_sheet.dart';
import 'package:bang_navigator/features/search_browser/presentation/widgets/speech_to_text_button.dart';
import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' import 'package:bang_navigator/features/search_browser/utils/url_builder.dart'
as uri_builder; as uri_builder;
import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.dart'; import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.dart';
@@ -126,11 +127,15 @@ class AssistantTab extends HookConsumerWidget {
), ),
TextFormField( TextFormField(
controller: textController, controller: textController,
decoration: const InputDecoration( decoration: InputDecoration(
// border: OutlineInputBorder(), label: const Text('Prompt'),
label: Text('Prompt'),
hintText: 'Enter your prompt...', hintText: 'Enter your prompt...',
floatingLabelBehavior: FloatingLabelBehavior.always, floatingLabelBehavior: FloatingLabelBehavior.always,
suffixIcon: SpeechToTextButton(
onTextReceived: (data) {
textController.text = data.toString();
},
),
), ),
maxLines: null, maxLines: null,
validator: (value) { validator: (value) {
@@ -1,15 +1,14 @@
import 'package:bang_navigator/features/kagi/domain/repositories/autosuggest.dart'; import 'package:bang_navigator/features/kagi/domain/repositories/autosuggest.dart';
import 'package:bang_navigator/features/search_browser/presentation/widgets/sheets/shared_content_sheet.dart'; import 'package:bang_navigator/features/search_browser/presentation/widgets/sheets/shared_content_sheet.dart';
import 'package:bang_navigator/features/search_browser/presentation/widgets/speech_to_text_button.dart';
import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' import 'package:bang_navigator/features/search_browser/utils/url_builder.dart'
as uri_builder; as uri_builder;
import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.dart'; import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.dart';
import 'package:bang_navigator/presentation/widgets/autocomplete.dart'; import 'package:bang_navigator/presentation/widgets/autocomplete.dart';
import 'package:bang_navigator/utils/ui_helper.dart' as ui_helper;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:speech_to_text_google_dialog/speech_to_text_google_dialog.dart';
// The default Material-style Autocomplete options. // The default Material-style Autocomplete options.
class _AutocompleteOptions<T extends Object> extends StatelessWidget { class _AutocompleteOptions<T extends Object> extends StatelessWidget {
@@ -159,27 +158,10 @@ class SearchTab extends HookConsumerWidget {
label: const Text('Query'), label: const Text('Query'),
hintText: 'Ask anything...', hintText: 'Ask anything...',
floatingLabelBehavior: FloatingLabelBehavior.always, floatingLabelBehavior: FloatingLabelBehavior.always,
suffixIcon: IconButton( suffixIcon: SpeechToTextButton(
onPressed: () async { onTextReceived: (data) {
final isServiceAvailable = textEditingController.text = data.toString();
await SpeechToTextGoogleDialog.getInstance()
.showGoogleDialog(
onTextReceived: (data) {
textEditingController.text = data.toString();
},
// locale: "en-US",
);
if (!isServiceAvailable) {
if (context.mounted) {
ui_helper.showErrorMessage(
context,
'Service is not available',
);
}
}
}, },
icon: const Icon(Icons.mic),
), ),
), ),
autovalidateMode: AutovalidateMode.onUserInteraction, autovalidateMode: AutovalidateMode.onUserInteraction,