enable voice input for assistant
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user