feat: add HomeController for state management
This commit is contained in:
99
lib/src/controllers/home_controller.dart
Normal file
99
lib/src/controllers/home_controller.dart
Normal file
@@ -0,0 +1,99 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:mom_kitchen/src/controllers/base/base_controller.dart';
|
||||
|
||||
class ProductModel {
|
||||
final String name;
|
||||
final double price;
|
||||
final String image;
|
||||
final String category;
|
||||
|
||||
ProductModel({
|
||||
required this.name,
|
||||
required this.price,
|
||||
required this.image,
|
||||
required this.category,
|
||||
});
|
||||
|
||||
factory ProductModel.fromMap(Map<String, dynamic> map) {
|
||||
return ProductModel(
|
||||
name: map['name'] ?? '',
|
||||
price: (map['price'] as num?)?.toDouble() ?? 0.0,
|
||||
image: map['image'] ?? '📦',
|
||||
category: map['category'] ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'name': name,
|
||||
'price': price,
|
||||
'image': image,
|
||||
'category': category,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class HomeController extends BaseController {
|
||||
final products = <ProductModel>[].obs;
|
||||
final categories = <String>[].obs;
|
||||
final selectedCategory = ''.obs;
|
||||
final searchQuery = ''.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
loadProducts();
|
||||
}
|
||||
|
||||
Future<void> loadProducts() async {
|
||||
await runWithLoading(() async {
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
|
||||
final mockProducts = [
|
||||
ProductModel(name: 'Organic Apples', price: 4.99, image: '🍎', category: 'Fruits'),
|
||||
ProductModel(name: 'Fresh Milk', price: 3.49, image: '🥛', category: 'Dairy'),
|
||||
ProductModel(name: 'Whole Wheat Bread', price: 2.99, image: '🍞', category: 'Bakery'),
|
||||
ProductModel(name: 'Free Range Eggs', price: 5.99, image: '🥚', category: 'Dairy'),
|
||||
ProductModel(name: 'Organic Tomatoes', price: 3.99, image: '🍅', category: 'Vegetables'),
|
||||
ProductModel(name: 'Fresh Salmon', price: 12.99, image: '🐟', category: 'Seafood'),
|
||||
];
|
||||
|
||||
products.value = mockProducts;
|
||||
|
||||
final categorySet = <String>{};
|
||||
for (var product in mockProducts) {
|
||||
categorySet.add(product.category);
|
||||
}
|
||||
categories.value = categorySet.toList();
|
||||
});
|
||||
}
|
||||
|
||||
List<ProductModel> get filteredProducts {
|
||||
var result = products.toList();
|
||||
|
||||
if (selectedCategory.value.isNotEmpty) {
|
||||
result = result.where((p) => p.category == selectedCategory.value).toList();
|
||||
}
|
||||
|
||||
if (searchQuery.value.isNotEmpty) {
|
||||
result = result.where((p) =>
|
||||
p.name.toLowerCase().contains(searchQuery.value.toLowerCase())
|
||||
).toList();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void selectCategory(String category) {
|
||||
selectedCategory.value = category;
|
||||
}
|
||||
|
||||
void search(String query) {
|
||||
searchQuery.value = query;
|
||||
}
|
||||
|
||||
void clearFilters() {
|
||||
selectedCategory.value = '';
|
||||
searchQuery.value = '';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user