fix: invalidate agent cache on profile update and add expandable list support for expertise and certifications

This commit is contained in:
pradeepkumar
2026-04-15 19:02:49 +05:30
parent 2424743226
commit 3a86758561
2 changed files with 102 additions and 43 deletions

View File

@@ -8,6 +8,8 @@ import 'package:go_router/go_router.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:real_estate_mobile/core/constants/app_colors.dart';
import 'package:real_estate_mobile/features/agents/presentation/providers/agent_detail_provider.dart';
import 'package:real_estate_mobile/features/auth/presentation/providers/auth_provider.dart';
import 'package:real_estate_mobile/features/profile/data/profile_repository.dart';
// ---------------------------------------------------------------------------
@@ -385,6 +387,14 @@ class _AgentEditProfileScreenState
}
}
// Invalidate the agent detail provider so the dashboard refetches
// field values after save (was showing stale cached data).
final userId = ref.read(authProvider).user?.id;
if (userId != null) {
ref.invalidate(agentDetailProvider(userId));
}
ref.invalidate(_editProfileDataProvider);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(

View File

@@ -869,11 +869,15 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
color: AppColors.primaryDark)),
),
const SizedBox(height: 8),
_buildTagsWrap(state.expertiseYears
_buildTagsWrap(
state.expertiseYears
.map((e) => e['years']!.isNotEmpty
? '${e['area']} ${e['years']}'
: e['area']!)
.toList(), sectionKey: 'expertise'),
.toList(),
sectionKey: 'expertise',
initialCount: 4,
),
],
if (state.certifications.isNotEmpty) ...[
const SizedBox(height: 16),
@@ -887,7 +891,22 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
color: AppColors.primaryDark)),
),
const SizedBox(height: 8),
...state.certifications.map((cert) => Padding(
_buildCertificationsList(state.certifications),
],
],
),
);
}
// Certifications list with "+N More" (initial 2, matching web)
Widget _buildCertificationsList(List<Map<String, String>> certs) {
const initialCount = 2;
final sectionKey = 'certifications';
final isExpanded = _expandedTagSections.contains(sectionKey);
final display = isExpanded ? certs : certs.take(initialCount).toList();
final remaining = certs.length - initialCount;
Widget certRow(Map<String, String> cert) => Padding(
padding: const EdgeInsets.only(bottom: 12, left: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -896,8 +915,7 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
children: [
const Text('\u2022 ',
style: TextStyle(
fontSize: 14,
color: AppColors.primaryDark)),
fontSize: 14, color: AppColors.primaryDark)),
Expanded(
child: Text(cert['name']!,
style: const TextStyle(
@@ -907,7 +925,7 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
),
],
),
if (cert['org']!.isNotEmpty)
if ((cert['org'] ?? '').isNotEmpty)
Padding(
padding: const EdgeInsets.only(left: 16),
child: Opacity(
@@ -921,10 +939,36 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
),
],
),
)),
],
],
);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
...display.map(certRow),
if (remaining > 0)
Padding(
padding: const EdgeInsets.only(left: 8, top: 4),
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => setState(() {
if (isExpanded) {
_expandedTagSections.remove(sectionKey);
} else {
_expandedTagSections.add(sectionKey);
}
}),
child: Text(
isExpanded ? 'Show Less' : '+$remaining More',
style: const TextStyle(
fontFamily: 'SourceSerif4',
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColors.accentOrange,
),
),
),
),
],
);
}
@@ -959,10 +1003,15 @@ class _AgentHomeContentState extends ConsumerState<_AgentHomeContent> {
);
}
Widget _buildTagsWrap(List<String> tags, {required String sectionKey}) {
Widget _buildTagsWrap(
List<String> tags, {
required String sectionKey,
int initialCount = 6,
}) {
final isExpanded = _expandedTagSections.contains(sectionKey);
final displayTags = isExpanded ? tags : tags.take(6).toList();
final remaining = tags.length - 6;
final displayTags =
isExpanded ? tags : tags.take(initialCount).toList();
final remaining = tags.length - initialCount;
return Wrap(
spacing: 8,