This commit is contained in:
Chen Li
2025-08-12 13:36:42 +08:00
parent 8191bef32e
commit 130755f9e1
47 changed files with 3728 additions and 761 deletions

View File

@@ -0,0 +1,91 @@
import 'package:basic_intl/intl.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import '../services/message_service.dart';
import '../utils/common_util.dart';
import 'voice_animation.dart';
class ChatFooter extends StatelessWidget {
final VoidCallback? onClear;
const ChatFooter({super.key, this.onClear});
@override
Widget build(BuildContext context) {
return Container(
color: Colors.transparent,
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(left: 12, bottom: 12),
child: IconButton(
icon: const Icon(Icons.delete_outline,
color: CommonUtil.commonColor),
iconSize: 30,
tooltip: '清除会话',
onPressed: onClear,
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(bottom: 12),
child: Consumer<MessageService>(
builder: (context, messageService, child) {
return GestureDetector(
onTap: () {
HapticFeedback.heavyImpact();
messageService.abortReply();
},
onLongPress: () {
HapticFeedback.mediumImpact();
Future.delayed(const Duration(milliseconds: 100), () {
HapticFeedback.heavyImpact();
});
messageService.startVoiceInput();
},
onLongPressUp: () {
HapticFeedback.lightImpact();
messageService.stopAndProcessVoiceInput();
},
child: AnimatedContainer(
duration: const Duration(milliseconds: 150),
height: 48,
width: double.infinity,
alignment: Alignment.center,
decoration: BoxDecoration(
color: messageService.isRecording
? Color(0xFF8E24AA).withValues(alpha: 0.42)
: Colors.white.withValues(alpha: 0.12),
borderRadius: BorderRadius.circular(12),
),
child: messageService.isRecording
? const VoiceWaveAnimation()
: Text(
Intl.getCurrentLocale().startsWith('zh')
? '按 住 说 话'
: 'Hold to Speak',
style: TextStyle(
color: CommonUtil.commonColor,
fontSize: 18,
fontWeight: FontWeight.bold),
),
),
);
},
),
),
),
Padding(
padding: const EdgeInsets.only(bottom: 12, right: 12),
child: IconButton(
icon: const Icon(Icons.keyboard, color: CommonUtil.commonColor),
iconSize: 30,
onPressed: () {},
),
),
],
),
);
}
}