// ignore_for_file: deprecated_member_use import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../core/widgets/app_scaffold.dart'; import '../../profile/application/profile_controller.dart'; class PrivacySettingsScreen extends ConsumerStatefulWidget { const PrivacySettingsScreen({super.key}); @override ConsumerState createState() => _PrivacySettingsScreenState(); } class _PrivacySettingsScreenState extends ConsumerState { bool _isLoading = false; @override Widget build(BuildContext context) { final profileState = ref.watch(profileControllerProvider); final user = profileState.user; return AppScaffold( body: ListView( children: [ _buildSection( context, title: 'Profile Visibility', children: [ if (user != null) _VisibilityTile( title: 'Make Profile Public', subtitle: user.isPublicProfile ? 'Your profile is visible to other users' : 'Your profile is private and only visible to you', isPublic: user.isPublicProfile, onChanged: _isLoading ? null : (value) => _toggleProfileVisibility(value, user.id), ), const _InfoTile( icon: Icons.info_outline, title: 'What does public mean?', description: 'When your profile is public, other users can see your username, avatar, and high-level stats. Your goals and detailed progress remain private.', ), ], ), _buildSection( context, title: 'Data & Privacy', children: [ _SettingsTile( icon: Icons.download, title: 'Export My Data', subtitle: 'Download a copy of your personal data', onTap: () => _showExportDataDialog(context), ), _SettingsTile( icon: Icons.block, title: 'Blocked Users', subtitle: 'Manage users you have blocked', onTap: () => context.push('/settings/privacy/blocked'), ), ], ), _buildSection( context, title: 'Account Control', children: [ _SettingsTile( icon: Icons.delete_forever, title: 'Delete Account', subtitle: 'Permanently delete your account and all data', onTap: () => _showDeleteAccountDialog(context), isDestructive: true, ), ], ), const SizedBox(height: 24), ], ), ); } Widget _buildSection(BuildContext context, { required String title, required List children, }) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.fromLTRB(16, 24, 16, 8), child: Text( title, style: Theme.of(context).textTheme.titleSmall?.copyWith( color: Theme.of(context).colorScheme.primary, fontWeight: FontWeight.bold, ), ), ), ...children, ], ); } Future _toggleProfileVisibility(bool isPublic, String userId) async { setState(() => _isLoading = true); try { await ref.read(profileControllerProvider.notifier).toggleProfileVisibility(userId); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(isPublic ? 'Your profile is now public' : 'Your profile is now private'), ), ); } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Failed to update visibility: $e')), ); } } finally { if (mounted) { setState(() => _isLoading = false); } } } void _showExportDataDialog(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Export My Data'), content: const Text( 'We will prepare a downloadable file containing your profile information, goals, and progress. This may take a few moments.', ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Cancel'), ), FilledButton( onPressed: () { Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Data export request submitted. You will receive an email when ready.'), ), ); }, child: const Text('Request Export'), ), ], ), ); } void _showDeleteAccountDialog(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Delete Account'), content: const Text( 'Are you sure you want to delete your account? This action cannot be undone and all your data will be permanently lost.', ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Cancel'), ), TextButton( onPressed: () { Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Account deletion requires email confirmation'), ), ); }, style: TextButton.styleFrom( foregroundColor: Theme.of(context).colorScheme.error, ), child: const Text('Delete'), ), ], ), ); } } class _VisibilityTile extends StatelessWidget { final String title; final String subtitle; final bool isPublic; final ValueChanged? onChanged; const _VisibilityTile({ required this.title, required this.subtitle, required this.isPublic, required this.onChanged, }); @override Widget build(BuildContext context) { return SwitchListTile( title: Text(title), subtitle: Text( subtitle, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), value: isPublic, onChanged: onChanged, secondary: Icon( isPublic ? Icons.public : Icons.lock, color: isPublic ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onSurfaceVariant, ), ); } } class _InfoTile extends StatelessWidget { final IconData icon; final String title; final String description; const _InfoTile({ required this.icon, required this.title, required this.description, }); @override Widget build(BuildContext context) { return ListTile( leading: Icon( icon, color: Theme.of(context).colorScheme.primary.withOpacity(0.7), ), title: Text( title, style: Theme.of(context).textTheme.titleSmall?.copyWith( fontWeight: FontWeight.w500, ), ), subtitle: Text( description, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), ); } } class _SettingsTile extends StatelessWidget { final IconData icon; final String title; final String subtitle; final VoidCallback onTap; final bool isDestructive; const _SettingsTile({ required this.icon, required this.title, required this.subtitle, required this.onTap, this.isDestructive = false, }); @override Widget build(BuildContext context) { return ListTile( leading: Icon( icon, color: isDestructive ? Theme.of(context).colorScheme.error : Theme.of(context).colorScheme.primary, ), title: Text( title, style: TextStyle( color: isDestructive ? Theme.of(context).colorScheme.error : null, ), ), subtitle: Text( subtitle, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), trailing: const Icon(Icons.chevron_right), onTap: onTap, ); } }