feat: 增强日历功能并集成 AgentScope 代理服务

This commit is contained in:
qzl
2026-03-11 15:28:29 +08:00
parent e55e445906
commit e20e7d2a02
85 changed files with 5175 additions and 885 deletions
@@ -5,10 +5,12 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:lucide_icons/lucide_icons.dart';
import '../../../../core/api/api_exception.dart';
import '../../../../core/di/injection.dart';
import '../../../../core/theme/design_tokens.dart';
import '../../../chat/data/models/chat_list_item.dart';
import '../../../chat/presentation/bloc/chat_bloc.dart';
import '../../../chat/data/tools/route_navigation_tool.dart';
import '../../../messages/data/inbox_api.dart';
import '../../data/voice_recorder.dart';
import '../../../chat/ui/widgets/ui_schema_renderer.dart';
import '../../../../shared/widgets/toast/toast.dart';
@@ -64,11 +66,13 @@ class _HomeScreenState extends State<HomeScreen>
final ScrollController _scrollController = ScrollController();
late final ChatBloc _chatBloc;
late final VoiceRecorder _voiceRecorder;
late final InboxApi _inboxApi;
late final Future<String> Function(String filePath) _transcribeAudio;
late final Future<void> Function(String transcript) _autoSendTranscript;
late final AnimationController _listeningAnimationController;
bool _isRecording = false;
bool _isTranscribing = false;
int _unreadCount = 0;
bool get _hasMessage => _messageController.text.trim().isNotEmpty;
@@ -78,6 +82,7 @@ class _HomeScreenState extends State<HomeScreen>
_messageController.addListener(_onMessageChanged);
_chatBloc = widget.chatBloc ?? ChatBloc();
_voiceRecorder = widget.voiceRecorder ?? RecordVoiceRecorder();
_inboxApi = sl<InboxApi>();
_transcribeAudio =
widget.onTranscribeAudio ?? _chatBloc.transcribeAudioFile;
_autoSendTranscript = widget.onAutoSendTranscript ?? _chatBloc.sendMessage;
@@ -88,6 +93,18 @@ class _HomeScreenState extends State<HomeScreen>
if (widget.autoLoadHistory) {
_chatBloc.loadHistory();
}
_loadUnreadCount();
}
Future<void> _loadUnreadCount() async {
try {
final messages = await _inboxApi.getMessages(isRead: false);
if (mounted) {
setState(() => _unreadCount = messages.length);
}
} catch (_) {
// Ignore errors
}
}
@override
@@ -175,10 +192,45 @@ class _HomeScreenState extends State<HomeScreen>
),
const SizedBox(width: _itemSpacing),
IconButton(
icon: const Icon(
LucideIcons.messageSquare,
size: _iconSize,
color: AppColors.slate900,
icon: Stack(
clipBehavior: Clip.none,
children: [
const Icon(
LucideIcons.messageSquare,
size: _iconSize,
color: AppColors.slate900,
),
if (_unreadCount > 0)
Positioned(
right: -4,
top: -4,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 4,
vertical: 2,
),
decoration: BoxDecoration(
color: AppColors.red500,
borderRadius: BorderRadius.circular(8),
),
constraints: const BoxConstraints(
minWidth: 16,
minHeight: 16,
),
child: Text(
_unreadCount > 99
? '99+'
: _unreadCount.toString(),
style: const TextStyle(
fontSize: 10,
fontWeight: FontWeight.w600,
color: AppColors.white,
),
textAlign: TextAlign.center,
),
),
),
],
),
onPressed: () => context.push('/messages/invites'),
),