feat: scope filterable fields to agent type and update active filters on selection change
This commit is contained in:
@@ -89,10 +89,16 @@ class AgentsRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get filterable profile fields: GET /profile-fields/filterable
|
/// Get filterable profile fields: GET /profile-fields/filterable
|
||||||
|
/// When `agentTypeId` is provided, backend scopes filters to that agent type + globals.
|
||||||
/// Response: { success, data: [...] }
|
/// Response: { success, data: [...] }
|
||||||
Future<List<FilterableField>> getFilterableFields() async {
|
Future<List<FilterableField>> getFilterableFields({String? agentTypeId}) async {
|
||||||
try {
|
try {
|
||||||
final response = await _dio.get(ApiConstants.filterableFields);
|
final response = await _dio.get(
|
||||||
|
ApiConstants.filterableFields,
|
||||||
|
queryParameters: agentTypeId != null && agentTypeId.isNotEmpty
|
||||||
|
? {'agentTypeId': agentTypeId}
|
||||||
|
: null,
|
||||||
|
);
|
||||||
final data = response.data['data'] as List<dynamic>;
|
final data = response.data['data'] as List<dynamic>;
|
||||||
return data
|
return data
|
||||||
.map((e) => FilterableField.fromJson(e as Map<String, dynamic>))
|
.map((e) => FilterableField.fromJson(e as Map<String, dynamic>))
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class SearchAgentsNotifier extends StateNotifier<SearchAgentsState> {
|
|||||||
try {
|
try {
|
||||||
final results = await Future.wait([
|
final results = await Future.wait([
|
||||||
_repository.getAgentTypes(),
|
_repository.getAgentTypes(),
|
||||||
_repository.getFilterableFields(),
|
_repository.getFilterableFields(agentTypeId: state.selectedAgentTypeId),
|
||||||
]);
|
]);
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
state = state.copyWith(
|
state = state.copyWith(
|
||||||
@@ -92,6 +92,28 @@ class SearchAgentsNotifier extends StateNotifier<SearchAgentsState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Re-fetch filterable fields scoped to the currently selected agent type.
|
||||||
|
/// Called whenever the user switches agent types so irrelevant filters disappear.
|
||||||
|
Future<void> _refreshFilterFields(String? agentTypeId) async {
|
||||||
|
try {
|
||||||
|
final fields =
|
||||||
|
await _repository.getFilterableFields(agentTypeId: agentTypeId);
|
||||||
|
if (!mounted) return;
|
||||||
|
// Drop any active filter slugs that no longer exist in the new list.
|
||||||
|
final validSlugs = fields.map((f) => f.slug).toSet();
|
||||||
|
final culled = <String, List<String>>{};
|
||||||
|
state.activeFilters.forEach((k, v) {
|
||||||
|
if (validSlugs.contains(k)) culled[k] = v;
|
||||||
|
});
|
||||||
|
state = state.copyWith(
|
||||||
|
filterFields: fields,
|
||||||
|
activeFilters: culled,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
// Keep existing fields if the refresh fails; user can retry.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _fetchAgents({required int page, bool append = false}) async {
|
Future<void> _fetchAgents({required int page, bool append = false}) async {
|
||||||
try {
|
try {
|
||||||
final response = await _repository.searchAgents(
|
final response = await _repository.searchAgents(
|
||||||
@@ -135,6 +157,7 @@ class SearchAgentsNotifier extends StateNotifier<SearchAgentsState> {
|
|||||||
isLoading: true,
|
isLoading: true,
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
);
|
);
|
||||||
|
_refreshFilterFields(agentTypeId);
|
||||||
_fetchAgents(page: 1);
|
_fetchAgents(page: 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user