adguard-home-manager/lib/screens/settings/dns/dns.dart

231 lines
8.9 KiB
Dart
Raw Normal View History

2023-01-15 21:34:19 +01:00
// ignore_for_file: use_build_context_synchronously
2022-10-19 14:12:53 +02:00
import 'package:flutter/material.dart';
2022-10-19 20:26:40 +02:00
import 'package:provider/provider.dart';
2022-10-19 14:12:53 +02:00
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2024-03-10 21:15:24 +01:00
import 'package:adguard_home_manager/screens/settings/settings.dart';
2023-12-11 22:03:36 +01:00
import 'package:adguard_home_manager/screens/settings/dns/fallback_dns.dart';
2023-12-11 14:29:08 +01:00
import 'package:adguard_home_manager/screens/settings/dns/test_upstream_dns_modal.dart';
2023-01-15 21:34:19 +01:00
import 'package:adguard_home_manager/screens/settings/dns/clear_dns_cache_dialog.dart';
2022-10-19 19:29:05 +02:00
import 'package:adguard_home_manager/screens/settings/dns/cache_config.dart';
2022-10-19 18:34:11 +02:00
import 'package:adguard_home_manager/screens/settings/dns/dns_server_settings.dart';
import 'package:adguard_home_manager/screens/settings/dns/bootstrap_dns.dart';
import 'package:adguard_home_manager/screens/settings/dns/private_reverse_servers.dart';
import 'package:adguard_home_manager/screens/settings/dns/upstream_dns.dart';
2022-10-20 02:42:25 +02:00
import 'package:adguard_home_manager/widgets/custom_list_tile.dart';
2022-10-19 14:12:53 +02:00
2023-10-29 02:47:14 +01:00
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/functions/desktop_mode.dart';
import 'package:adguard_home_manager/providers/dns_provider.dart';
2023-01-15 21:34:19 +01:00
import 'package:adguard_home_manager/functions/clear_dns_cache.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
2022-10-19 20:26:40 +02:00
import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
2023-05-24 20:40:45 +02:00
class DnsSettings extends StatefulWidget {
2023-10-29 02:47:14 +01:00
final bool splitView;
const DnsSettings({
2023-12-09 04:04:14 +01:00
super.key,
2023-10-29 02:47:14 +01:00
required this.splitView,
2023-12-09 04:04:14 +01:00
});
2022-10-19 14:12:53 +02:00
@override
2023-05-24 20:40:45 +02:00
State<DnsSettings> createState() => _DnsSettingsState();
2022-10-19 20:26:40 +02:00
}
2023-05-24 20:40:45 +02:00
class _DnsSettingsState extends State<DnsSettings> {
2022-10-19 20:26:40 +02:00
@override
void initState() {
Provider.of<DnsProvider>(context, listen: false).fetchDnsData(showLoading: true);
2022-10-19 20:26:40 +02:00
super.initState();
}
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
2023-05-24 20:40:45 +02:00
final dnsProvider = Provider.of<DnsProvider>(context);
2023-01-15 21:34:19 +01:00
final appConfigProvider = Provider.of<AppConfigProvider>(context);
2022-10-19 20:26:40 +02:00
final width = MediaQuery.of(context).size.width;
2023-10-29 02:47:14 +01:00
void navigate(Widget w) {
if (widget.splitView) {
2024-03-10 21:15:24 +01:00
Navigator.of(settingsNavigatorKey.currentContext!).push(MaterialPageRoute(builder: (ctx) => w));
2023-05-01 03:48:23 +02:00
}
else {
2023-10-29 15:38:17 +01:00
Navigator.of(context).push(
2023-10-29 14:31:11 +01:00
MaterialPageRoute(
builder: (context) => w
)
);
2023-05-01 03:48:23 +02:00
}
}
2023-01-15 21:34:19 +01:00
void clearCache() async {
final result = await clearDnsCache(context, serversProvider.selectedServer!);
2023-11-19 22:52:40 +01:00
if (result.successful == true) {
2024-09-11 18:13:26 +02:00
showSnackbar(
2023-01-15 21:34:19 +01:00
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsCacheCleared,
color: Colors.green
);
}
else {
2024-09-11 18:13:26 +02:00
showSnackbar(
2023-01-15 21:34:19 +01:00
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsCacheNotCleared,
color: Colors.red
);
}
}
2022-10-19 20:26:40 +02:00
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.dnsSettings),
2023-10-29 02:47:14 +01:00
surfaceTintColor: isDesktop(width) ? Colors.transparent : null,
2022-10-20 02:46:05 +02:00
actions: [
2023-12-11 14:29:08 +01:00
IconButton(
onPressed: () => showDialog(
context: context,
builder: (ctx) => const TestUpstreamDnsModal()
),
icon: const Icon(Icons.upload_rounded),
tooltip: AppLocalizations.of(context)!.testUpstreamDnsServers,
),
2023-01-15 21:34:19 +01:00
PopupMenuButton(
itemBuilder: (context) => [
PopupMenuItem(
onTap: () => dnsProvider.fetchDnsData(),
2023-01-15 21:34:19 +01:00
child: Row(
children: [
const Icon(Icons.refresh_rounded),
const SizedBox(width: 10),
Text(AppLocalizations.of(context)!.refresh)
],
)
),
PopupMenuItem(
onTap: () => Future.delayed(
const Duration(seconds: 0), () => showDialog(
context: context,
builder: (context) => ClearDnsCacheDialog(
onConfirm: clearCache
)
)
),
child: Row(
children: [
const Icon(Icons.delete_rounded),
const SizedBox(width: 10),
Text(AppLocalizations.of(context)!.clearDnsCache)
],
)
),
]
),
2022-10-20 02:46:05 +02:00
const SizedBox(width: 10)
],
2022-10-19 14:12:53 +02:00
),
2023-12-09 04:04:14 +01:00
body: SafeArea(
child: Builder(
builder: (context) {
switch (dnsProvider.loadStatus) {
case LoadStatus.loading:
return SizedBox(
width: double.maxFinite,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const CircularProgressIndicator(),
const SizedBox(height: 30),
Text(
AppLocalizations.of(context)!.loadingDnsConfig,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 22,
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
)
],
)
);
case LoadStatus.loaded:
return ListView(
2023-10-29 02:47:14 +01:00
children: [
2023-12-09 04:04:14 +01:00
CustomListTile(
title: AppLocalizations.of(context)!.upstreamDns,
subtitle: AppLocalizations.of(context)!.upstreamDnsDescription,
onTap: () => navigate(const UpstreamDnsScreen()),
icon: Icons.upload_rounded,
),
CustomListTile(
title: AppLocalizations.of(context)!.bootstrapDns,
subtitle: AppLocalizations.of(context)!.bootstrapDnsDescription,
onTap: () => navigate(const BootstrapDnsScreen()),
icon: Icons.dns_rounded,
),
2023-12-11 22:03:36 +01:00
if (dnsProvider.dnsInfo!.fallbackDns != null) CustomListTile(
title: AppLocalizations.of(context)!.fallbackDnsServers,
subtitle: AppLocalizations.of(context)!.fallbackDnsServersDescription,
onTap: () => navigate(const FallbackDnsScreen()),
icon: Icons.alt_route_rounded,
),
2023-12-09 04:04:14 +01:00
CustomListTile(
title: AppLocalizations.of(context)!.privateReverseDnsServers,
subtitle: AppLocalizations.of(context)!.privateReverseDnsDescription,
onTap: () => navigate(const PrivateReverseDnsServersScreen()),
icon: Icons.person_rounded,
),
CustomListTile(
title: AppLocalizations.of(context)!.dnsServerSettings,
subtitle: AppLocalizations.of(context)!.dnsServerSettingsDescription,
onTap: () => navigate(const DnsServerSettingsScreen()),
icon: Icons.settings,
),
CustomListTile(
title: AppLocalizations.of(context)!.dnsCacheConfig,
subtitle: AppLocalizations.of(context)!.dnsCacheConfigDescription,
onTap: () => navigate(const CacheConfigDnsScreen()),
icon: Icons.storage_rounded,
2023-10-29 02:47:14 +01:00
),
],
2023-12-09 04:04:14 +01:00
);
case LoadStatus.error:
return SizedBox(
width: double.maxFinite,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Icon(
Icons.error,
color: Colors.red,
size: 50,
),
const SizedBox(height: 30),
Text(
AppLocalizations.of(context)!.dnsConfigNotLoaded,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 22,
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
)
],
),
);
default:
return const SizedBox();
}
},
),
2023-10-29 02:47:14 +01:00
)
2022-10-19 14:12:53 +02:00
);
}
}