Files
enaklo-flutter/lib/presentation/components/card/product_card.dart
T

154 lines
5.1 KiB
Dart
Raw Normal View History

2026-01-16 13:27:09 +07:00
import 'package:flutter/material.dart';
import '../../../common/extension/extension.dart';
import '../../../common/theme/theme.dart';
import '../../../sample/product_sample_data.dart';
class ProductCard extends StatelessWidget {
final Product product;
2026-01-16 14:41:09 +07:00
final Function()? onTap;
const ProductCard({super.key, required this.product, this.onTap});
2026-01-16 13:27:09 +07:00
@override
Widget build(BuildContext context) {
2026-01-16 14:41:09 +07:00
return InkWell(
onTap: onTap,
child: Container(
decoration: BoxDecoration(
color: AppColor.surface,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: AppColor.black.withOpacity(0.06),
blurRadius: 8,
offset: Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Product image
Expanded(
flex: 3,
child: Stack(
children: [
2026-01-16 13:27:09 +07:00
Container(
width: double.infinity,
decoration: BoxDecoration(
2026-01-16 14:41:09 +07:00
color: AppColor.backgroundLight,
2026-01-16 13:27:09 +07:00
borderRadius: BorderRadius.vertical(
top: Radius.circular(12),
),
),
child: Center(
2026-01-16 14:41:09 +07:00
child: Icon(
Icons.fastfood,
size: 40,
color: AppColor.textLight,
2026-01-16 13:27:09 +07:00
),
),
),
2026-01-16 14:41:09 +07:00
// Availability overlay
if (!product.isAvailable)
Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: AppColor.black.withOpacity(0.6),
borderRadius: BorderRadius.vertical(
top: Radius.circular(12),
),
),
child: Center(
child: Text(
"HABIS",
style: AppStyle.sm.copyWith(
color: AppColor.textWhite,
fontWeight: FontWeight.bold,
2026-01-16 13:27:09 +07:00
),
),
),
2026-01-16 14:41:09 +07:00
),
// Rating badge
Positioned(
top: 8,
right: 8,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 6, vertical: 3),
decoration: BoxDecoration(
color: AppColor.surface,
borderRadius: BorderRadius.circular(8),
2026-01-16 13:27:09 +07:00
),
2026-01-16 14:41:09 +07:00
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.star, size: 12, color: AppColor.warning),
SizedBox(width: 2),
Text(
"${product.rating}",
style: AppStyle.xs.copyWith(
color: AppColor.textPrimary,
fontWeight: FontWeight.w600,
),
),
],
),
),
2026-01-16 13:27:09 +07:00
),
],
),
),
2026-01-16 14:41:09 +07:00
// Product info
Expanded(
flex: 2,
child: Padding(
padding: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.name,
style: AppStyle.md.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.textPrimary,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
Spacer(),
// Price and sold count
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Rp ${product.price.currencyFormatRp}",
style: AppStyle.md.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.primary,
),
),
Text(
"${product.soldCount} terjual",
style: AppStyle.xs.copyWith(
color: AppColor.textSecondary,
),
),
],
),
],
),
),
),
],
),
2026-01-16 13:27:09 +07:00
),
);
}
}