diff --git a/app/lib/features/search_browser/presentation/widgets/speech_to_text_button.dart b/app/lib/features/search_browser/presentation/widgets/speech_to_text_button.dart new file mode 100644 index 00000000..0115f268 --- /dev/null +++ b/app/lib/features/search_browser/presentation/widgets/speech_to_text_button.dart @@ -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), + ); + } +} diff --git a/app/lib/features/search_browser/presentation/widgets/tabs/assistant_tab.dart b/app/lib/features/search_browser/presentation/widgets/tabs/assistant_tab.dart index 6562748a..7a158b5b 100644 --- a/app/lib/features/search_browser/presentation/widgets/tabs/assistant_tab.dart +++ b/app/lib/features/search_browser/presentation/widgets/tabs/assistant_tab.dart @@ -1,5 +1,6 @@ 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/speech_to_text_button.dart'; import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' as uri_builder; import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.dart'; @@ -126,11 +127,15 @@ class AssistantTab extends HookConsumerWidget { ), TextFormField( controller: textController, - decoration: const InputDecoration( - // border: OutlineInputBorder(), - label: Text('Prompt'), + decoration: InputDecoration( + label: const Text('Prompt'), hintText: 'Enter your prompt...', floatingLabelBehavior: FloatingLabelBehavior.always, + suffixIcon: SpeechToTextButton( + onTextReceived: (data) { + textController.text = data.toString(); + }, + ), ), maxLines: null, validator: (value) { diff --git a/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart b/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart index aa80893e..3bfe6251 100644 --- a/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart +++ b/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart @@ -1,15 +1,14 @@ 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/speech_to_text_button.dart'; import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' as uri_builder; import 'package:bang_navigator/features/share_intent/domain/entities/shared_content.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_hooks/flutter_hooks.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.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. class _AutocompleteOptions extends StatelessWidget { @@ -159,27 +158,10 @@ class SearchTab extends HookConsumerWidget { label: const Text('Query'), hintText: 'Ask anything...', floatingLabelBehavior: FloatingLabelBehavior.always, - suffixIcon: IconButton( - onPressed: () async { - final isServiceAvailable = - 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', - ); - } - } + suffixIcon: SpeechToTextButton( + onTextReceived: (data) { + textEditingController.text = data.toString(); }, - icon: const Icon(Icons.mic), ), ), autovalidateMode: AutovalidateMode.onUserInteraction,