// Author: fruit.com.cn import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../core/data/models/comment.dart'; import '../../../core/data/models/drama.dart'; import '../../../core/data/repositories/comment_repository.dart'; import '../../../core/data/repositories/interaction_repository.dart'; import '../../../core/data/services/comment_controller.dart'; import '../../../core/theme/app_colors.dart'; import '../../../l10n/app_localizations.dart'; class PlayerFeaturedComment extends StatefulWidget { const PlayerFeaturedComment({ super.key, required this.drama, required this.onViewAll, }); final Drama drama; final VoidCallback onViewAll; @override State createState() => _PlayerFeaturedCommentState(); } class _PlayerFeaturedCommentState extends State { late final CommentController _controller; @override void initState() { super.initState(); _controller = CommentController( comments: context.read(), interactions: context.read(), dramaId: widget.drama.id, ); unawaited(_controller.load()); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return ListenableBuilder( listenable: _controller, builder: (context, _) { if (_controller.comments.isEmpty) return const SizedBox.shrink(); return _card(context, _controller.comments.first); }, ); } Widget _card(BuildContext context, DramaComment comment) { final l10n = AppLocalizations.of(context)!; final time = _time(l10n, comment.createdAt); return InkWell( key: const Key('player-featured-comment'), onTap: widget.onViewAll, borderRadius: BorderRadius.circular(10), child: Container( width: double.infinity, padding: const EdgeInsets.all(9), decoration: BoxDecoration( color: AppColors.card, borderRadius: BorderRadius.circular(10), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Container( width: 18, height: 18, alignment: Alignment.center, decoration: BoxDecoration( shape: BoxShape.circle, color: AppColors.secondary.withValues(alpha: 0.2), ), child: Text( _initial(comment.nickname), style: const TextStyle( color: AppColors.onSurface, fontSize: 8, fontWeight: FontWeight.w700, ), ), ), const SizedBox(width: 6), Expanded( child: Row( children: [ Flexible( child: Text( comment.nickname.isEmpty ? l10n.localViewer : comment.nickname, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.onSurface, fontSize: 10, fontWeight: FontWeight.w700, ), ), ), if (time != null) ...[ const SizedBox(width: 4), Text( 'ยท $time', style: const TextStyle( color: Color(0xFF777777), fontSize: 9, ), ), ], ], ), ), ], ), const SizedBox(height: 5), Text( comment.content, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle( color: Color(0xFFDDDDDD), fontSize: 10, height: 1.5, ), ), ], ), ), ); } String? _time(AppLocalizations l10n, DateTime? createdAt) { if (createdAt == null) return null; final diff = DateTime.now().difference(createdAt); if (diff.inMinutes < 1) return null; return l10n.minutesAgo(diff.inMinutes); } String _initial(String nickname) { final trimmed = nickname.trim(); return trimmed.isEmpty ? '?' : trimmed.substring(0, 1).toUpperCase(); } }