diff --git a/lib/dashbot/features/chat/view/pages/dashbot_chat_page.dart b/lib/dashbot/features/chat/view/pages/dashbot_chat_page.dart index b71e3ea2..849699a1 100644 --- a/lib/dashbot/features/chat/view/pages/dashbot_chat_page.dart +++ b/lib/dashbot/features/chat/view/pages/dashbot_chat_page.dart @@ -1,3 +1,4 @@ +import 'package:apidash/dashbot/features/chat/view/widgets/dashbot_task_buttons.dart'; import 'package:apidash_design_system/apidash_design_system.dart'; import '../../models/chat_models.dart'; @@ -17,6 +18,7 @@ class ChatScreen extends ConsumerStatefulWidget { class _ChatScreenState extends ConsumerState { final TextEditingController _textController = TextEditingController(); + bool _showTaskSuggestions = false; @override void initState() { @@ -34,6 +36,12 @@ class _ChatScreenState extends ConsumerState { @override Widget build(BuildContext context) { + ref.listen(chatViewmodelProvider, (prev, next) { + if (next.isGenerating) { + _showTaskSuggestions = false; + } + }); + return Scaffold( body: Column( children: [ @@ -72,10 +80,19 @@ class _ChatScreenState extends ConsumerState { height: 5, thickness: 6, ), + if (_showTaskSuggestions) DashbotTaskButtons(), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ + ADIconButton( + icon: Icons.help_outline_rounded, + tooltip: 'Show tasks', + onPressed: ref.watch(chatViewmodelProvider).isGenerating + ? null + : () => setState( + () => _showTaskSuggestions = !_showTaskSuggestions), + ), ADIconButton( icon: Icons.clear_all_rounded, tooltip: 'Clear chat', diff --git a/lib/dashbot/features/chat/view/widgets/dashbot_task_buttons.dart b/lib/dashbot/features/chat/view/widgets/dashbot_task_buttons.dart new file mode 100644 index 00000000..411fd6f2 --- /dev/null +++ b/lib/dashbot/features/chat/view/widgets/dashbot_task_buttons.dart @@ -0,0 +1,146 @@ +import 'package:apidash/dashbot/features/chat/viewmodel/chat_viewmodel.dart'; +import 'package:apidash/providers/collection_providers.dart'; +import 'package:apidash/screens/common_widgets/agentic_ui_features/ai_ui_designer/generate_ui_dialog.dart'; +import 'package:apidash/screens/common_widgets/agentic_ui_features/tool_generation/generate_tool_dialog.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../../models/chat_models.dart'; +import '../../../home/view/widgets/home_screen_task_button.dart'; +import '../../../../core/providers/dashbot_window_notifier.dart'; + +class DashbotTaskButtons extends ConsumerWidget { + const DashbotTaskButtons({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final vm = ref.read(chatViewmodelProvider.notifier); + return Padding( + padding: const EdgeInsets.fromLTRB(12, 8, 12, 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Do you want assistance with any of these tasks?', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(height: 12), + Wrap( + alignment: WrapAlignment.center, + spacing: 8, + runSpacing: 8, + children: [ + HomeScreenTaskButton( + label: '🔎 Explain me this response', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.explainResponse, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '🐞 Help me debug this error', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.debugError, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '📄 Generate documentation', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.generateDoc, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '📝 Generate Tests', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.generateTest, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '🧩 Generate Code', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.generateCode, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '📥 Import cURL', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.importCurl, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '📄 Import OpenAPI', + onPressed: () { + vm.sendMessage( + text: '', + type: ChatMessageType.importOpenApi, + countAsUser: false, + ); + }, + ), + HomeScreenTaskButton( + label: '🛠️ Generate Tool', + onPressed: () async { + final notifier = + ref.read(dashbotWindowNotifierProvider.notifier); + notifier.hide(); + await GenerateToolDialog.show(context, ref); + notifier.show(); + }, + ), + HomeScreenTaskButton( + label: '📱 Generate UI', + onPressed: () async { + final notifier = + ref.read(dashbotWindowNotifierProvider.notifier); + notifier.hide(); + final model = ref.watch(selectedRequestModelProvider + .select((value) => value?.httpResponseModel)); + if (model != null) { + String data = ''; + if (model.sseOutput != null) { + data = model.sseOutput!.join(''); + } else { + data = model.formattedBody ?? '<>'; + } + await showCustomDialog( + context, + GenerateUIDialog(content: data), + useRootNavigator: true, + ); + } + notifier.show(); + }, + ), + ], + ), + ], + ), + ); + } +}