Files
unionflow-mobile-apps/lib/shared/widgets/action_row.dart
dahoud d094d6db9c Initial commit: unionflow-mobile-apps
Application Flutter complète (sans build artifacts).

Signed-off-by: lions dev Team
2026-03-15 16:30:08 +00:00

124 lines
3.9 KiB
Dart

import 'package:flutter/material.dart';
import '../design_system/tokens/app_colors.dart';
import '../design_system/tokens/app_typography.dart';
/// UnionFlow Mobile - Composant DRY : ActionRow
/// Centralise les interactions (J'aime, Commenter, Partager, etc.) sous une barre compacte.
class ActionRow extends StatelessWidget {
final int? likesCount;
final int? commentsCount;
final VoidCallback? onLike;
final VoidCallback? onComment;
final VoidCallback? onShare;
final bool isLiked; // Permet de teinter l'icône Like
// Peut être personnalisé pour des actions spécifiques (ex: Payer)
final String? customActionLabel;
final VoidCallback? onCustomAction;
final IconData? customActionIcon;
const ActionRow({
Key? key,
this.likesCount,
this.commentsCount,
this.onLike,
this.onComment,
this.onShare,
this.isLiked = false,
this.customActionLabel,
this.onCustomAction,
this.customActionIcon,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
final iconColor = isDark ? AppColors.textSecondaryDark : AppColors.textSecondaryLight;
return Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// Actions standards (Like/Comment/Share)
Row(
children: [
if (onLike != null)
_buildActionIcon(
icon: isLiked ? Icons.favorite : Icons.favorite_border,
color: isLiked ? AppColors.error : iconColor,
count: likesCount,
onTap: onLike!,
),
if (onLike != null && onComment != null) const SizedBox(width: 24),
if (onComment != null)
_buildActionIcon(
icon: Icons.chat_bubble_outline,
color: iconColor,
count: commentsCount,
onTap: onComment!,
),
if (onComment != null && onShare != null) const SizedBox(width: 24),
if (onShare != null)
_buildActionIcon(
icon: Icons.share_outlined,
color: iconColor,
onTap: onShare!,
),
],
),
// Action personnalisée à droite (ex: Payer la cotisation)
if (onCustomAction != null)
GestureDetector(
onTap: onCustomAction,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(
color: AppColors.primaryGreen.withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
if (customActionIcon != null) ...[
Icon(customActionIcon, size: 14, color: AppColors.primaryGreen),
const SizedBox(width: 4),
],
Text(
customActionLabel ?? '',
style: AppTypography.badgeText.copyWith(color: AppColors.primaryGreen),
),
],
),
),
),
],
),
);
}
Widget _buildActionIcon({
required IconData icon,
required Color color,
required VoidCallback onTap,
int? count,
}) {
return GestureDetector(
onTap: onTap,
behavior: HitTestBehavior.opaque,
child: Row(
children: [
Icon(icon, size: 16, color: color),
if (count != null && count > 0) ...[
const SizedBox(width: 4),
Text(
count.toString(),
style: AppTypography.subtitleSmall.copyWith(color: color),
),
]
],
),
);
}
}