diff --git a/apps/lib/features/messages/ui/widgets/message_action_sheet.dart b/apps/lib/features/messages/ui/widgets/message_action_sheet.dart new file mode 100644 index 0000000..f53f467 --- /dev/null +++ b/apps/lib/features/messages/ui/widgets/message_action_sheet.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import '../../../../core/theme/design_tokens.dart'; +import '../../../../shared/widgets/app_button.dart'; + +class MessageActionSheet extends StatelessWidget { + final String title; + final String? description; + final String? statusText; + final bool isReadOnly; + final VoidCallback? onAccept; + final VoidCallback? onDecline; + final IconData? icon; + final Color? iconColor; + + const MessageActionSheet({ + super.key, + required this.title, + this.description, + this.statusText, + this.isReadOnly = false, + this.onAccept, + this.onDecline, + this.icon, + this.iconColor, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.fromLTRB(24, 20, 24, 0), + decoration: const BoxDecoration( + color: AppColors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColors.slate300, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(height: 20), + if (icon != null) ...[ + Container( + width: 72, + height: 72, + decoration: BoxDecoration( + color: (iconColor ?? AppColors.blue500).withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Icon( + icon, + size: 32, + color: iconColor ?? AppColors.blue500, + ), + ), + const SizedBox(height: 16), + ], + Text( + title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: AppColors.slate900, + ), + textAlign: TextAlign.center, + ), + if (description != null && description!.isNotEmpty) ...[ + const SizedBox(height: 8), + Text( + description!, + style: const TextStyle(fontSize: 14, color: AppColors.slate500), + textAlign: TextAlign.center, + ), + ], + if (statusText != null) ...[ + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: AppColors.slate100, + borderRadius: BorderRadius.circular(16), + ), + child: Text( + statusText!, + style: const TextStyle(fontSize: 14, color: AppColors.slate600), + ), + ), + ], + const SizedBox(height: 24), + if (!isReadOnly) ...[ + Row( + children: [ + Expanded( + child: AppButton( + text: '拒绝', + isOutlined: true, + onPressed: () { + Navigator.pop(context); + onDecline?.call(); + }, + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: AppButton( + text: '接受', + onPressed: () { + Navigator.pop(context); + onAccept?.call(); + }, + ), + ), + ], + ), + ], + SizedBox(height: MediaQuery.of(context).padding.bottom + 12), + ], + ), + ); + } +}