/// Providers: Project Submissions /// /// Riverpod providers for managing project submissions state. library; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:worker/features/projects/data/datasources/submissions_remote_datasource.dart'; import 'package:worker/features/projects/data/repositories/submissions_repository_impl.dart'; import 'package:worker/features/projects/domain/entities/project_submission.dart'; import 'package:worker/features/projects/domain/repositories/submissions_repository.dart'; import 'package:worker/features/projects/domain/usecases/get_submissions.dart'; part 'submissions_provider.g.dart'; /// Submissions Remote Data Source Provider @riverpod SubmissionsRemoteDataSource submissionsRemoteDataSource(Ref ref) { return SubmissionsRemoteDataSourceImpl(); } /// Submissions Repository Provider @riverpod SubmissionsRepository submissionsRepository(Ref ref) { final remoteDataSource = ref.watch(submissionsRemoteDataSourceProvider); return SubmissionsRepositoryImpl(remoteDataSource); } /// Get Submissions Use Case Provider @riverpod GetSubmissions getSubmissions(Ref ref) { final repository = ref.watch(submissionsRepositoryProvider); return GetSubmissions(repository); } /// All Submissions Provider /// /// Fetches and manages submissions data from remote. @riverpod class AllSubmissions extends _$AllSubmissions { @override Future> build() async { final useCase = ref.watch(getSubmissionsProvider); return await useCase(); } /// Refresh submissions from remote Future refresh() async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final useCase = ref.read(getSubmissionsProvider); return await useCase(); }); } } /// Submissions Filter State /// /// Manages search and status filter state. @riverpod class SubmissionsFilter extends _$SubmissionsFilter { @override ({String searchQuery, SubmissionStatus? selectedStatus}) build() { return (searchQuery: '', selectedStatus: null); } /// Update search query void updateSearchQuery(String query) { state = (searchQuery: query, selectedStatus: state.selectedStatus); } /// Select a status filter void selectStatus(SubmissionStatus? status) { state = (searchQuery: state.searchQuery, selectedStatus: status); } /// Clear status filter void clearStatusFilter() { state = (searchQuery: state.searchQuery, selectedStatus: null); } /// Clear search query void clearSearchQuery() { state = (searchQuery: '', selectedStatus: state.selectedStatus); } /// Clear all filters void clearAllFilters() { state = (searchQuery: '', selectedStatus: null); } } /// Filtered Submissions Provider /// /// Combines submissions data with filter state to return filtered results. @riverpod AsyncValue> filteredSubmissions(Ref ref) { final dataAsync = ref.watch(allSubmissionsProvider); final filter = ref.watch(submissionsFilterProvider); return dataAsync.whenData((submissions) { var filtered = submissions; // Filter by status if (filter.selectedStatus != null) { filtered = filtered.where((s) => s.status == filter.selectedStatus).toList(); } // Filter by search query if (filter.searchQuery.isNotEmpty) { final query = filter.searchQuery.toLowerCase(); filtered = filtered.where((s) { return s.submissionId.toLowerCase().contains(query) || s.projectName.toLowerCase().contains(query); }).toList(); } // Sort by submitted date (newest first) filtered.sort((a, b) => b.submittedAt.compareTo(a.submittedAt)); return filtered; }); }