feat: implement dynamic field labels for agent profile sections using backend-provided slugs
This commit is contained in:
@@ -292,6 +292,26 @@ class AgentDetailState {
|
||||
return '${'*' * (digits.length - 4)}${digits.substring(digits.length - 4)}';
|
||||
}
|
||||
|
||||
// ── Dynamic labels (fieldName from backend, with fallback) ──
|
||||
|
||||
String _labelForSlug(String slug, String fallback) {
|
||||
for (final fv in fieldValues) {
|
||||
if (fv.fieldSlug == slug && fv.fieldName.isNotEmpty) {
|
||||
return fv.fieldName;
|
||||
}
|
||||
}
|
||||
return fallback;
|
||||
}
|
||||
|
||||
String get availabilityLabel =>
|
||||
_labelForSlug('availability', 'Availability');
|
||||
|
||||
String get workEnvironmentLabel =>
|
||||
_labelForSlug('preferred_work_environment', 'Preferred Work Environment');
|
||||
|
||||
String get bestExperienceLabel =>
|
||||
_labelForSlug('best_experience', 'Best Experience');
|
||||
|
||||
// ── Availability ──
|
||||
|
||||
String get availabilityType {
|
||||
|
||||
@@ -999,7 +999,7 @@ class _AgentDetailScreenState extends ConsumerState<AgentDetailScreen> {
|
||||
// Availability card (always show)
|
||||
_buildInfoCard(
|
||||
icon: Icons.access_time_filled,
|
||||
title: 'Availability',
|
||||
title: state.availabilityLabel,
|
||||
subtitle: state.availabilityType.isNotEmpty
|
||||
? state.availabilityType
|
||||
: 'Not specified',
|
||||
@@ -1012,7 +1012,7 @@ class _AgentDetailScreenState extends ConsumerState<AgentDetailScreen> {
|
||||
// Work environment (always show)
|
||||
_buildInfoCard(
|
||||
icon: Icons.landscape_outlined,
|
||||
title: 'Work Environment',
|
||||
title: state.workEnvironmentLabel,
|
||||
subtitle: '',
|
||||
description: workEnv.isNotEmpty ? workEnv : 'Not specified',
|
||||
isEmpty: workEnv.isEmpty,
|
||||
@@ -1021,7 +1021,7 @@ class _AgentDetailScreenState extends ConsumerState<AgentDetailScreen> {
|
||||
// Best experience (always show)
|
||||
_buildInfoCard(
|
||||
icon: Icons.star_rounded,
|
||||
title: 'Best Experience',
|
||||
title: state.bestExperienceLabel,
|
||||
subtitle: '',
|
||||
description: bestExp.isNotEmpty ? bestExp : 'Not specified',
|
||||
isEmpty: bestExp.isEmpty,
|
||||
|
||||
@@ -1052,7 +1052,7 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
|
||||
// Availability card (with title — matches web)
|
||||
_buildInfoCard(
|
||||
icon: Icons.access_time_filled,
|
||||
title: 'Availability',
|
||||
title: state.availabilityLabel,
|
||||
subtitle: state.availabilityType.isNotEmpty
|
||||
? state.availabilityType
|
||||
: 'Not specified',
|
||||
@@ -1062,18 +1062,18 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
|
||||
isEmpty: state.availabilityType.isEmpty,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Work environment (no title — matches web)
|
||||
// Work environment
|
||||
_buildInfoCard(
|
||||
icon: Icons.landscape_outlined,
|
||||
title: '',
|
||||
title: state.workEnvironmentLabel,
|
||||
subtitle: '',
|
||||
description: workEnv,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Testimonial preview (no title — matches web)
|
||||
// Testimonial preview
|
||||
_buildInfoCard(
|
||||
icon: Icons.star_rounded,
|
||||
title: '',
|
||||
title: state.bestExperienceLabel,
|
||||
subtitle: '',
|
||||
description: testimonialText.isNotEmpty
|
||||
? '\u201C$testimonialText\u201D'
|
||||
|
||||
Reference in New Issue
Block a user