import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../auth/application/auth_notifier.dart'; import '../application/suggestions_notifier.dart'; import 'widgets/suggestion_form.dart'; import 'widgets/suggestion_list_tile.dart'; /// Top-level Suggestions screen. /// /// Top half is the always-visible [SuggestionForm]. Bottom half lists the /// signed-in user's past suggestions via [userSuggestionsProvider], or a /// gentle sign-in prompt when there's no current user. class SuggestionsScreen extends ConsumerWidget { const SuggestionsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final colors = theme.colorScheme; final authUser = ref.watch(authNotifierProvider).valueOrNull; final suggestionsAsync = ref.watch(userSuggestionsProvider); return Scaffold( appBar: AppBar(title: const Text('Suggestions')), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.fromLTRB(16, 16, 16, 32), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SuggestionForm(), const SizedBox(height: 24), const Divider(), const SizedBox(height: 16), Text( 'Your Suggestions', style: theme.textTheme.titleLarge, ), const SizedBox(height: 12), if (authUser == null) _SignInPrompt(colors: colors, textTheme: theme.textTheme) else suggestionsAsync.when( loading: () => const Padding( padding: EdgeInsets.symmetric(vertical: 24), child: Center(child: CircularProgressIndicator()), ), error: (err, _) => _ErrorState( message: 'Could not load your suggestions.', detail: '$err', colors: colors, textTheme: theme.textTheme, ), data: (suggestions) { if (suggestions.isEmpty) { return _EmptyState( colors: colors, textTheme: theme.textTheme, ); } return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ for (final s in suggestions) SuggestionListTile(suggestion: s), ], ); }, ), ], ), ), ), ); } } class _SignInPrompt extends StatelessWidget { const _SignInPrompt({required this.colors, required this.textTheme}); final ColorScheme colors; final TextTheme textTheme; @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: colors.surfaceContainerHighest, borderRadius: BorderRadius.circular(12), ), child: Row( children: [ Icon(Icons.lock_outline, color: colors.onSurfaceVariant), const SizedBox(width: 12), Expanded( child: Text( 'Sign in to view your past suggestions.', style: textTheme.bodyMedium?.copyWith( color: colors.onSurfaceVariant, ), ), ), ], ), ); } } class _EmptyState extends StatelessWidget { const _EmptyState({required this.colors, required this.textTheme}); final ColorScheme colors; final TextTheme textTheme; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 24), child: Column( children: [ Icon( Icons.lightbulb_outline, size: 36, color: colors.onSurfaceVariant, ), const SizedBox(height: 8), Text( 'No suggestions yet — share your first idea above.', textAlign: TextAlign.center, style: textTheme.bodyMedium?.copyWith( color: colors.onSurfaceVariant, ), ), ], ), ); } } class _ErrorState extends StatelessWidget { const _ErrorState({ required this.message, required this.detail, required this.colors, required this.textTheme, }); final String message; final String detail; final ColorScheme colors; final TextTheme textTheme; @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: colors.errorContainer, borderRadius: BorderRadius.circular(12), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon(Icons.error_outline, color: colors.onErrorContainer), const SizedBox(width: 8), Expanded( child: Text( message, style: textTheme.bodyMedium?.copyWith( color: colors.onErrorContainer, fontWeight: FontWeight.w600, ), ), ), ], ), const SizedBox(height: 4), Text( detail, style: textTheme.bodySmall?.copyWith( color: colors.onErrorContainer, ), ), ], ), ); } }