refactor: remove briefing digest card, show full message list directly

The summary card duplicated the first assistant message and consumed
screen real estate without benefit on small screens. Replaced with:
- Full message list via ChatMessageBubble from the top
- SliverFillRemaining empty state ("No briefing yet today" + generate button)
  when no messages exist

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 19:08:21 -04:00
parent 844f68d376
commit 0971433c7a
+27 -44
View File
@@ -2,9 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/exceptions.dart';
import '../../data/models/message.dart';
import '../../providers/briefing_provider.dart';
import '../../widgets/briefing_digest_card.dart';
import '../../widgets/chat_message_bubble.dart';
import 'briefing_history_screen.dart';
@@ -146,59 +144,44 @@ class _BriefingScreenState extends ConsumerState<BriefingScreen> {
),
),
data: (conv) {
// First assistant message for the digest card (null if none yet)
final Message? firstAssistant = conv.messages
.where((m) => m.role == MessageRole.assistant)
.toList()
.firstOrNull;
return Column(
children: [
// Digest card + messages share one scroll view so expanding the
// card doesn't trap the user — the whole page just becomes taller.
Expanded(
child: CustomScrollView(
controller: _scrollController,
slivers: [
SliverToBoxAdapter(
child: BriefingDigestCard(
message: firstAssistant,
onGenerateNow: _refresh,
),
),
if (conv.messages.isNotEmpty)
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Row(children: [
const Expanded(child: Divider()),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10),
child: Text(
'Conversation',
if (conv.messages.isEmpty)
SliverFillRemaining(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'No briefing yet today.',
style: Theme.of(context)
.textTheme
.labelSmall
?.copyWith(
color: scheme.onSurfaceVariant),
.bodyMedium
?.copyWith(color: scheme.onSurfaceVariant),
),
),
const Expanded(child: Divider()),
]),
const SizedBox(height: 12),
FilledButton.tonal(
onPressed: _refresh,
child: const Text('Generate now'),
),
],
),
),
)
else
SliverPadding(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 8),
sliver: SliverList.builder(
itemCount: conv.messages.length,
itemBuilder: (_, i) =>
ChatMessageBubble(message: conv.messages[i]),
),
),
SliverPadding(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 8),
sliver: SliverList.builder(
itemCount: conv.messages.length,
itemBuilder: (_, i) =>
ChatMessageBubble(message: conv.messages[i]),
),
),
],
),
),