feat: gate News tab and briefing news cards on server rss_enabled setting
Fetch server-side settings on app launch via new serverSettingsProvider. Hide News from bottom sheet and NavigationRail when RSS is disabled. Skip news card rendering in briefing messages when disabled. Refactor tab navigation to use dynamic tabs list and route-based refresh. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ import '../../widgets/chat_message_bubble.dart';
|
||||
import '../../widgets/weather_card.dart';
|
||||
import '../../widgets/news_card.dart';
|
||||
import 'briefing_history_screen.dart';
|
||||
import '../../providers/settings_provider.dart';
|
||||
import '../../providers/voice_provider.dart';
|
||||
import '../../widgets/voice_mic_button.dart';
|
||||
|
||||
@@ -313,6 +314,7 @@ class _BriefingScreenState extends ConsumerState<BriefingScreen>
|
||||
reactions: _reactions,
|
||||
onReaction: _handleReaction,
|
||||
onDiscuss: _handleDiscuss,
|
||||
rssEnabled: ref.watch(rssEnabledProvider),
|
||||
);
|
||||
},
|
||||
),
|
||||
@@ -428,6 +430,7 @@ class _BriefingMessageItem extends StatelessWidget {
|
||||
final Map<int, String?> reactions;
|
||||
final void Function(int itemId, String reaction) onReaction;
|
||||
final void Function(int convId, int itemId) onDiscuss;
|
||||
final bool rssEnabled;
|
||||
|
||||
const _BriefingMessageItem({
|
||||
required this.message,
|
||||
@@ -435,6 +438,7 @@ class _BriefingMessageItem extends StatelessWidget {
|
||||
required this.reactions,
|
||||
required this.onReaction,
|
||||
required this.onDiscuss,
|
||||
this.rssEnabled = false,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -446,11 +450,12 @@ class _BriefingMessageItem extends StatelessWidget {
|
||||
final bool hasWeatherKey = isAssistant && meta != null && meta.containsKey('weather');
|
||||
final weatherData = hasWeatherKey ? meta['weather'] as Map<String, dynamic>? : null;
|
||||
|
||||
// RSS news cards — cap at 3
|
||||
final rssItemsRaw = isAssistant && meta != null
|
||||
? (meta['rss_items'] as List<dynamic>?)?.cast<Map<String, dynamic>>() ?? []
|
||||
: <Map<String, dynamic>>[];
|
||||
final rssItems = rssItemsRaw.map(RssItemMeta.fromJson).take(3).toList();
|
||||
// RSS news cards — cap at 3 (only when RSS is enabled)
|
||||
final rssItems = <RssItemMeta>[];
|
||||
if (rssEnabled && isAssistant && meta != null) {
|
||||
final raw = (meta['rss_items'] as List<dynamic>?)?.cast<Map<String, dynamic>>() ?? [];
|
||||
rssItems.addAll(raw.map(RssItemMeta.fromJson).take(3));
|
||||
}
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
|
||||
Reference in New Issue
Block a user