import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ionicons/ionicons.dart'; import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/ui/components/brand_cards/filled_card.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; class MorePage extends StatelessWidget { const MorePage({super.key}); @override Widget build(final BuildContext context) { final bool isReady = context.watch().state is ServerInstallationFinished; final bool? usesBinds = context.watch().state.usesBinds; return Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52), child: BrandHeader( title: 'basis.more'.tr(), ), ), body: ListView( children: [ Padding( padding: paddingH15V0, child: Column( children: [ if (isReady && usesBinds != null && !usesBinds) _MoreMenuItem( title: 'storage.start_migration_button'.tr(), iconData: Icons.drive_file_move_outline, goToPath: '/migrations/binds', goToExtra: context .read() .state .services .where( (final service) => service.id == 'bitwarden' || service.id == 'gitea' || service.id == 'pleroma' || service.id == 'mailserver' || service.id == 'nextcloud', ) .toList(), subtitle: 'storage.data_migration_notice'.tr(), accent: true, ), if (!isReady) _MoreMenuItem( title: 'more_page.configuration_wizard'.tr(), iconData: Icons.change_history_outlined, goToPath: '/initial-setup', subtitle: 'not_ready_card.in_menu'.tr(), accent: true, ), if (isReady) _MoreMenuItem( title: 'more_page.create_ssh_key'.tr(), iconData: Ionicons.key_outline, goToPath: '/users/root', ), if (isReady) _MoreMenuItem( iconData: Icons.password_outlined, goToPath: '/recovery-key', title: 'recovery_key.key_main_header'.tr(), ), if (isReady) _MoreMenuItem( iconData: Icons.devices_outlined, goToPath: '/devices', title: 'devices.main_screen.header'.tr(), ), _MoreMenuItem( title: 'more_page.application_settings'.tr(), iconData: Icons.settings_outlined, goToPath: '/settings', ), _MoreMenuItem( title: 'more_page.about_application'.tr(), iconData: BrandIcons.engineer, goToPath: '/about', ), if (!isReady) _MoreMenuItem( title: 'more_page.onboarding'.tr(), iconData: BrandIcons.start, goToPath: '/onboarding', ), _MoreMenuItem( title: 'more_page.console'.tr(), iconData: BrandIcons.terminal, goToPath: '/console', ), ], ), ) ], ), ); } } class _MoreMenuItem extends StatelessWidget { const _MoreMenuItem({ required this.iconData, required this.title, this.subtitle, this.goToPath, this.goToExtra, this.accent = false, }); final IconData iconData; final String title; final String? goToPath; final Object? goToExtra; final String? subtitle; final bool accent; @override Widget build(final BuildContext context) { final Color color = accent ? Theme.of(context).colorScheme.onTertiaryContainer : Theme.of(context).colorScheme.onSurface; return FilledCard( tertiary: accent, child: ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), // onTap: goTo != null ? () => Navigator.of(context).push(materialRoute(goTo!)) : null, onTap: goToPath != null ? () => context.go(goToPath!, extra: goToExtra) : null, leading: Icon( iconData, size: 24, color: color, ), title: Text( title, style: Theme.of(context).textTheme.titleMedium?.copyWith( color: color, ), ), subtitle: subtitle != null ? Text( subtitle!, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: color, ), ) : null, ), ); } }