Files
worker/lib/features/showrooms/presentation/providers/sample_project_provider.dart
Phuoc Nguyen 440b474504 sample project
2025-11-28 15:01:51 +07:00

59 lines
2.1 KiB
Dart

/// Providers: Sample Project
///
/// Riverpod providers for managing sample/model house projects state.
library;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:worker/core/network/dio_client.dart';
import 'package:worker/features/showrooms/data/datasources/sample_project_remote_datasource.dart';
import 'package:worker/features/showrooms/data/repositories/sample_project_repository_impl.dart';
import 'package:worker/features/showrooms/domain/entities/sample_project.dart';
import 'package:worker/features/showrooms/domain/repositories/sample_project_repository.dart';
part 'sample_project_provider.g.dart';
/// Sample Project Remote Data Source Provider
@riverpod
Future<SampleProjectRemoteDataSource> sampleProjectRemoteDataSource(Ref ref) async {
final dioClient = await ref.watch(dioClientProvider.future);
return SampleProjectRemoteDataSourceImpl(dioClient);
}
/// Sample Project Repository Provider
@riverpod
Future<SampleProjectRepository> sampleProjectRepository(Ref ref) async {
final remoteDataSource = await ref.watch(sampleProjectRemoteDataSourceProvider.future);
return SampleProjectRepositoryImpl(remoteDataSource);
}
/// Sample Projects List Provider
///
/// Fetches and manages sample/model house projects from API.
@riverpod
class SampleProjectsList extends _$SampleProjectsList {
@override
Future<List<SampleProject>> build() async {
final repository = await ref.watch(sampleProjectRepositoryProvider.future);
return repository.getSampleProjects();
}
/// Refresh sample projects from remote
Future<void> refresh() async {
state = const AsyncValue.loading();
state = await AsyncValue.guard(() async {
final repository = await ref.read(sampleProjectRepositoryProvider.future);
return repository.getSampleProjects();
});
}
}
/// Sample Project Detail Provider
///
/// Fetches detail of a specific sample project by name.
/// Uses family modifier to cache by project name.
@riverpod
Future<SampleProject> sampleProjectDetail(Ref ref, String name) async {
final repository = await ref.watch(sampleProjectRepositoryProvider.future);
return repository.getSampleProjectDetail(name);
}