97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:island/database/message.dart';
 | |
| import 'package:styled_widget/styled_widget.dart';
 | |
| 
 | |
| class MessageIndicators extends StatelessWidget {
 | |
|   final DateTime? editedAt;
 | |
|   final MessageStatus? status;
 | |
|   final bool isCurrentUser;
 | |
|   final Color textColor;
 | |
|   final EdgeInsets padding;
 | |
| 
 | |
|   const MessageIndicators({
 | |
|     super.key,
 | |
|     this.editedAt,
 | |
|     this.status,
 | |
|     required this.isCurrentUser,
 | |
|     required this.textColor,
 | |
|     this.padding = const EdgeInsets.only(left: 6),
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     final children = <Widget>[];
 | |
| 
 | |
|     if (editedAt != null) {
 | |
|       children.add(
 | |
|         Text(
 | |
|           'edited'.tr().toLowerCase(),
 | |
|           style: TextStyle(fontSize: 11, color: textColor.withOpacity(0.7)),
 | |
|         ),
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     if (isCurrentUser && status != null && status != MessageStatus.sent) {
 | |
|       children.add(
 | |
|         _buildStatusIcon(
 | |
|           context,
 | |
|           status!,
 | |
|           textColor.withOpacity(0.7),
 | |
|         ).padding(bottom: 2),
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     if (children.isEmpty) {
 | |
|       return const SizedBox.shrink();
 | |
|     }
 | |
| 
 | |
|     return Padding(
 | |
|       padding: padding,
 | |
|       child: Row(
 | |
|         spacing: 4,
 | |
|         mainAxisSize: MainAxisSize.min,
 | |
|         children: children,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildStatusIcon(
 | |
|     BuildContext context,
 | |
|     MessageStatus status,
 | |
|     Color textColor,
 | |
|   ) {
 | |
|     switch (status) {
 | |
|       case MessageStatus.pending:
 | |
|         return SizedBox(
 | |
|           width: 10,
 | |
|           height: 10,
 | |
|           child: CircularProgressIndicator(
 | |
|             padding: EdgeInsets.zero,
 | |
|             strokeWidth: 2,
 | |
|             valueColor: AlwaysStoppedAnimation(textColor),
 | |
|           ),
 | |
|         ).padding(bottom: 2);
 | |
|       case MessageStatus.sent:
 | |
|         // Sent status is hidden
 | |
|         return const SizedBox.shrink();
 | |
|       case MessageStatus.failed:
 | |
|         return Consumer(
 | |
|           builder:
 | |
|               (context, ref, _) => GestureDetector(
 | |
|                 onTap: () {
 | |
|                   // This would need to be passed in or accessed differently
 | |
|                   // For now, just show the error icon
 | |
|                 },
 | |
|                 child: const Icon(
 | |
|                   Icons.error_outline,
 | |
|                   size: 12,
 | |
|                   color: Colors.red,
 | |
|                 ),
 | |
|               ),
 | |
|         );
 | |
|     }
 | |
|   }
 | |
| }
 |