diff --git a/app/lib/desktop/pages/conversations/desktop_conversations_page.dart b/app/lib/desktop/pages/conversations/desktop_conversations_page.dart index 6718e5ccd8..446d4b0aaa 100644 --- a/app/lib/desktop/pages/conversations/desktop_conversations_page.dart +++ b/app/lib/desktop/pages/conversations/desktop_conversations_page.dart @@ -21,6 +21,7 @@ import 'widgets/desktop_conversation_card.dart'; import 'widgets/desktop_daily_score_widget.dart'; import 'widgets/desktop_empty_conversations.dart'; import 'widgets/desktop_goals_widget.dart'; +import 'widgets/desktop_processing_conversation_widget.dart'; import 'widgets/desktop_recording_widget.dart'; import 'widgets/desktop_search_result_header.dart'; import 'widgets/desktop_search_widget.dart'; @@ -311,9 +312,18 @@ class _DesktopConversationsPageState extends State opacity: _fadeAnimation, child: Container( padding: const EdgeInsets.fromLTRB(32, 24, 32, 24), - child: DesktopRecordingWidget( - hasConversations: true, - onStartRecording: _showExpandedRecordingView, + child: Column( + children: [ + DesktopRecordingWidget( + hasConversations: true, + onStartRecording: _showExpandedRecordingView, + ), + if (convoProvider.processingConversations.isNotEmpty) ...[ + const SizedBox(height: 16), + getDesktopProcessingConversationsWidget( + convoProvider.processingConversations), + ], + ], ), ), ), diff --git a/app/lib/desktop/pages/conversations/widgets/desktop_processing_conversation_widget.dart b/app/lib/desktop/pages/conversations/widgets/desktop_processing_conversation_widget.dart new file mode 100644 index 0000000000..d74aa8f8f6 --- /dev/null +++ b/app/lib/desktop/pages/conversations/widgets/desktop_processing_conversation_widget.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; + +import 'package:intl/intl.dart'; + +import 'package:omi/backend/schema/conversation.dart'; +import 'package:omi/utils/l10n_extensions.dart'; +import 'package:omi/utils/responsive/responsive_helper.dart'; + +class DesktopProcessingConversationWidget extends StatelessWidget { + final ServerConversation conversation; + + const DesktopProcessingConversationWidget({ + super.key, + required this.conversation, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFF1F1F25), + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: ResponsiveHelper.backgroundTertiary.withValues(alpha: 0.5), + width: 1, + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header row + Row( + children: [ + // Icon circle + Container( + width: 28, + height: 28, + decoration: BoxDecoration( + color: ResponsiveHelper.backgroundQuaternary, + borderRadius: BorderRadius.circular(14), + ), + ), + const SizedBox(width: 12), + // Processing label + Container( + decoration: BoxDecoration( + color: const Color(0xFF35343B), + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + child: Text( + context.l10n.processing, + style: const TextStyle( + color: Colors.white, + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + ), + const Spacer(), + // Timestamp + Text( + DateFormat.jm(Localizations.localeOf(context).languageCode) + .format(conversation.startedAt ?? conversation.createdAt), + style: const TextStyle( + color: ResponsiveHelper.textTertiary, + fontSize: 13, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + const SizedBox(height: 14), + // Title placeholder bar + Container( + width: double.maxFinite, + height: 12, + decoration: BoxDecoration( + color: ResponsiveHelper.backgroundQuaternary, + borderRadius: BorderRadius.circular(6), + ), + ), + ], + ), + ); + } +} + +/// Widget to display processing conversations in a list +Widget getDesktopProcessingConversationsWidget(List conversations) { + if (conversations.isEmpty) { + return const SizedBox.shrink(); + } + + // Show only the first (most recent) processing conversation + return DesktopProcessingConversationWidget(conversation: conversations.first); +}