Files
worker/lib/features/loyalty/presentation/providers/gifts_provider.dart
Phuoc Nguyen 860a8788b6 loyalty
2025-10-24 17:35:39 +07:00

177 lines
4.8 KiB
Dart

/// Gifts Catalog Provider
///
/// State management for gift catalog and filtering.
library;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:worker/features/loyalty/domain/entities/gift_catalog.dart';
part 'gifts_provider.g.dart';
/// Gift catalog provider
///
/// Provides the complete list of available gifts.
/// Currently returns mock data matching the HTML design.
@riverpod
class Gifts extends _$Gifts {
@override
List<GiftCatalog> build() {
// Mock gift catalog matching HTML design
return _getMockGifts();
}
/// Refresh gift catalog
Future<void> refresh() async {
// TODO: Fetch from API
state = _getMockGifts();
}
/// Get mock gifts data
List<GiftCatalog> _getMockGifts() {
final now = DateTime.now();
return [
GiftCatalog(
catalogId: 'gift_001',
name: 'Voucher 500.000đ',
description: 'Áp dụng cho đơn từ 5 triệu',
imageUrl:
'https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?w=300&h=200&fit=crop',
category: GiftCategory.voucher,
pointsCost: 2500,
cashValue: 500000,
quantityAvailable: 100,
quantityRedeemed: 20,
isActive: true,
createdAt: now,
updatedAt: now,
),
GiftCatalog(
catalogId: 'gift_002',
name: 'Bộ keo chà ron cao cấp',
description: 'Weber.color comfort',
imageUrl:
'https://images.unsplash.com/photo-1607082348824-0a96f2a4b9da?w=300&h=200&fit=crop',
category: GiftCategory.product,
pointsCost: 3000,
quantityAvailable: 50,
quantityRedeemed: 15,
isActive: true,
createdAt: now,
updatedAt: now,
),
GiftCatalog(
catalogId: 'gift_003',
name: 'Tư vấn thiết kế miễn phí',
description: '1 buổi tư vấn tại nhà',
imageUrl:
'https://images.unsplash.com/photo-1540932239986-30128078f3c5?w=300&h=200&fit=crop',
category: GiftCategory.service,
pointsCost: 5000,
quantityAvailable: 30,
quantityRedeemed: 8,
isActive: true,
createdAt: now,
updatedAt: now,
),
GiftCatalog(
catalogId: 'gift_004',
name: 'Gạch trang trí Premium',
description: 'Bộ 10m² gạch cao cấp',
imageUrl:
'https://images.unsplash.com/photo-1615874694520-474822394e73?w=300&h=200&fit=crop',
category: GiftCategory.product,
pointsCost: 8000,
quantityAvailable: 25,
quantityRedeemed: 5,
isActive: true,
createdAt: now,
updatedAt: now,
),
GiftCatalog(
catalogId: 'gift_005',
name: 'Áo thun EuroTile',
description: 'Limited Edition 2023',
imageUrl:
'https://images.unsplash.com/photo-1523381210434-271e8be1f52b?w=300&h=200&fit=crop',
category: GiftCategory.product,
pointsCost: 1500,
quantityAvailable: 200,
quantityRedeemed: 50,
isActive: true,
createdAt: now,
updatedAt: now,
),
GiftCatalog(
catalogId: 'gift_006',
name: 'Nâng hạng thẻ Platinum',
description: 'Ưu đãi cao cấp 1 năm',
imageUrl:
'https://images.unsplash.com/photo-1556742400-b5b7a512f3d7?w=300&h=200&fit=crop',
category: GiftCategory.other,
pointsCost: 15000,
quantityAvailable: 10,
quantityRedeemed: 2,
isActive: true,
createdAt: now,
updatedAt: now,
),
];
}
}
/// Selected gift category state provider
@riverpod
class SelectedGiftCategory extends _$SelectedGiftCategory {
@override
GiftCategory? build() {
// null means "All" is selected
return null;
}
/// Set selected category
void setCategory(GiftCategory? category) {
state = category;
}
/// Clear selection (show all)
void clearSelection() {
state = null;
}
}
/// Filtered gifts provider
///
/// Filters gifts based on selected category.
@riverpod
List<GiftCatalog> filteredGifts(Ref ref) {
final allGifts = ref.watch(giftsProvider);
final selectedCategory = ref.watch(selectedGiftCategoryProvider);
// If no category selected, return all gifts
if (selectedCategory == null) {
return allGifts;
}
// Filter by selected category
return allGifts.where((gift) => gift.category == selectedCategory).toList();
}
/// Vietnamese category display names
extension GiftCategoryVi on GiftCategory {
String get displayNameVi {
switch (this) {
case GiftCategory.voucher:
return 'Voucher';
case GiftCategory.product:
return 'Sản phẩm';
case GiftCategory.service:
return 'Dịch vụ';
case GiftCategory.discount:
return 'Ưu đãi đặc biệt';
case GiftCategory.other:
return 'Khác';
}
}
}