This commit is contained in:
2025-10-28 00:43:32 +07:00
parent de49f564b1
commit df99d0c9e3
19 changed files with 1000 additions and 1453 deletions

View File

@@ -7,8 +7,11 @@ import '../../features/auth/domain/usecases/login_usecase.dart';
import '../../features/auth/presentation/providers/auth_provider.dart';
import '../../features/products/data/datasources/products_remote_datasource.dart';
import '../../features/products/data/repositories/products_repository_impl.dart';
import '../../features/products/domain/entities/product_stage_entity.dart';
import '../../features/products/domain/repositories/products_repository.dart';
import '../../features/products/domain/usecases/get_product_detail_usecase.dart';
import '../../features/products/domain/usecases/get_products_usecase.dart';
import '../../features/products/presentation/providers/product_detail_provider.dart';
import '../../features/products/presentation/providers/products_provider.dart';
import '../../features/warehouse/data/datasources/warehouse_remote_datasource.dart';
import '../../features/warehouse/data/repositories/warehouse_repository_impl.dart';
@@ -269,6 +272,13 @@ final getProductsUseCaseProvider = Provider<GetProductsUseCase>((ref) {
return GetProductsUseCase(repository);
});
/// Get product detail use case provider
/// Encapsulates product detail fetching business logic
final getProductDetailUseCaseProvider = Provider<GetProductDetailUseCase>((ref) {
final repository = ref.watch(productsRepositoryProvider);
return GetProductDetailUseCase(repository);
});
// Presentation Layer
/// Products state notifier provider
@@ -340,6 +350,48 @@ final productsErrorProvider = Provider<String?>((ref) {
return productsState.error;
});
/// Product detail state notifier provider
/// Manages product detail state for a specific product in a warehouse
/// This needs to be a family provider to support multiple product details
final productDetailProvider =
StateNotifierProvider.family<ProductDetailNotifier, ProductDetailState, String>(
(ref, _) {
final getProductDetailUseCase = ref.watch(getProductDetailUseCaseProvider);
return ProductDetailNotifier(getProductDetailUseCase);
},
);
/// Convenient providers for product detail state
/// Provider to get product stages list
/// Usage: ref.watch(productStagesProvider(key))
final productStagesProvider = Provider.family<List<ProductStageEntity>, String>((ref, key) {
final state = ref.watch(productDetailProvider(key));
return state.stages;
});
/// Provider to get selected product stage
/// Usage: ref.watch(selectedProductStageProvider(key))
final selectedProductStageProvider = Provider.family<ProductStageEntity?, String>((ref, key) {
final state = ref.watch(productDetailProvider(key));
return state.selectedStage;
});
/// Provider to check if product detail is loading
/// Usage: ref.watch(isProductDetailLoadingProvider(key))
final isProductDetailLoadingProvider = Provider.family<bool, String>((ref, key) {
final state = ref.watch(productDetailProvider(key));
return state.isLoading;
});
/// Provider to get product detail error
/// Returns null if no error
/// Usage: ref.watch(productDetailErrorProvider(key))
final productDetailErrorProvider = Provider.family<String?, String>((ref, key) {
final state = ref.watch(productDetailProvider(key));
return state.error;
});
/// ========================================================================
/// USAGE EXAMPLES
/// ========================================================================