Refine backendless share intake

This commit is contained in:
Rijad Zuzo
2026-05-18 20:33:54 +02:00
parent f655adfbea
commit 42a59e959f
37 changed files with 1467 additions and 824 deletions
@@ -391,11 +391,11 @@ class _PersonDetail extends ConsumerWidget {
]
: sharedMessages
.take(compact ? 3 : 5)
.map(
.map<Widget>(
(SharedMessageEntry entry) => _PeopleInsightRow(
title:
entry.sourceDisplayName?.trim().isNotEmpty == true
? entry.sourceDisplayName!.trim()
? 'Detected in text: ${entry.sourceDisplayName!.trim()}'
: 'Shared from ${entry.sourceApp}',
subtitle: entry.messageText.trim().isEmpty
? 'Imported message content is empty'
@@ -404,6 +404,23 @@ class _PersonDetail extends ConsumerWidget {
'${entry.resolvedAutomatically ? 'AUTO-LINKED' : 'MANUAL-LINK'}${_shortDateTimeLabel(entry.sharedAt)}',
),
)
.followedBy(<Widget>[
if (sharedMessages.length > (compact ? 3 : 5))
Align(
alignment: Alignment.centerLeft,
child: TextButton.icon(
onPressed: () => _showSharedMessageHistory(
context,
person: person,
sharedMessages: sharedMessages,
),
icon: const Icon(Icons.list_alt_rounded),
label: Text(
'View all ${sharedMessages.length} shared texts',
),
),
),
])
.toList(growable: false),
),
],
@@ -411,6 +428,70 @@ class _PersonDetail extends ConsumerWidget {
}
}
Future<void> _showSharedMessageHistory(
BuildContext context, {
required PersonProfile person,
required List<SharedMessageEntry> sharedMessages,
}) {
return showModalBottomSheet<void>(
context: context,
useSafeArea: true,
isScrollControlled: true,
showDragHandle: true,
builder: (BuildContext context) {
return DraggableScrollableSheet(
expand: false,
initialChildSize: 0.82,
minChildSize: 0.45,
maxChildSize: 0.95,
builder: (BuildContext context, ScrollController scrollController) {
return Padding(
padding: const EdgeInsets.fromLTRB(16, 8, 16, 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Shared texts',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 4),
Text(
'${person.name}${sharedMessages.length} item${sharedMessages.length == 1 ? '' : 's'}',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: AppTheme.textSecondary,
),
),
const SizedBox(height: 12),
Expanded(
child: ListView.separated(
controller: scrollController,
itemCount: sharedMessages.length,
separatorBuilder: (_, _) => const SizedBox(height: 10),
itemBuilder: (BuildContext context, int index) {
final SharedMessageEntry entry = sharedMessages[index];
return _PeopleInsightRow(
title:
entry.sourceDisplayName?.trim().isNotEmpty == true
? 'Detected in text: ${entry.sourceDisplayName!.trim()}'
: 'Shared from ${entry.sourceApp}',
subtitle: entry.messageText.trim().isEmpty
? entry.url ?? 'Imported message content is empty'
: entry.messageText.trim(),
meta:
'${entry.sourceApp.toUpperCase()}${entry.resolvedAutomatically ? 'AUTO-LINKED' : 'MANUAL-LINK'}${_shortDateTimeLabel(entry.sharedAt)}',
);
},
),
),
],
),
);
},
);
},
);
}
Future<void> _showPeoplePreferenceEvidence(
BuildContext context, {
required PersonPreferenceSignal signal,