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

206 lines
7.2 KiB
Dart
Raw Normal View History

2023-01-15 21:34:19 +01:00
// ignore_for_file: use_build_context_synchronously
2023-05-01 03:48:23 +02:00
import 'dart:io';
2023-05-24 20:40:45 +02:00
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/dns_provider.dart';
2022-10-19 14:12:53 +02:00
import 'package:flutter/material.dart';
2023-05-01 03:48:23 +02:00
import 'package:flutter_split_view/flutter_split_view.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';
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-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 {
2022-10-19 14:12:53 +02:00
const DnsSettings({Key? key}) : super(key: key);
@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-05-01 03:48:23 +02:00
void navigate(Widget widget) {
if (width > 900 || !(Platform.isAndroid || Platform.isIOS)) {
2023-05-01 03:48:23 +02:00
SplitView.of(context).push(widget);
}
else {
Navigator.push(context, MaterialPageRoute(
builder: (context) => widget
));
}
}
2022-10-19 20:26:40 +02:00
Widget generateBody() {
2023-05-24 20:40:45 +02:00
switch (dnsProvider.loadStatus) {
case LoadStatus.loading:
2022-10-19 20:26:40 +02:00
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,
2023-01-29 21:52:37 +01:00
style: TextStyle(
2022-10-19 20:26:40 +02:00
fontSize: 22,
2023-01-29 21:52:37 +01:00
color: Theme.of(context).colorScheme.onSurfaceVariant,
2022-10-19 20:26:40 +02:00
),
)
],
)
);
2023-05-24 20:40:45 +02:00
case LoadStatus.loaded:
2022-10-19 20:26:40 +02:00
return ListView(
children: [
2022-10-20 02:42:25 +02:00
CustomListTile(
title: AppLocalizations.of(context)!.upstreamDns,
subtitle: AppLocalizations.of(context)!.upstreamDnsDescription,
2023-05-24 20:40:45 +02:00
onTap: () => navigate(const UpstreamDnsScreen()),
2022-10-20 02:42:25 +02:00
icon: Icons.upload_rounded,
2022-10-19 14:12:53 +02:00
),
2022-10-20 02:42:25 +02:00
CustomListTile(
title: AppLocalizations.of(context)!.bootstrapDns,
subtitle: AppLocalizations.of(context)!.bootstrapDnsDescription,
2023-05-24 20:40:45 +02:00
onTap: () => navigate(const BootstrapDnsScreen()),
2022-10-20 02:42:25 +02:00
icon: Icons.dns_rounded,
2022-10-19 15:33:15 +02:00
),
2022-10-20 02:42:25 +02:00
CustomListTile(
title: AppLocalizations.of(context)!.privateReverseDnsServers,
subtitle: AppLocalizations.of(context)!.privateReverseDnsDescription,
2023-05-24 20:40:45 +02:00
onTap: () => navigate(const PrivateReverseDnsServersScreen()),
2022-10-20 02:42:25 +02:00
icon: Icons.person_rounded,
2022-10-19 15:33:15 +02:00
),
2022-10-20 02:42:25 +02:00
CustomListTile(
title: AppLocalizations.of(context)!.dnsServerSettings,
subtitle: AppLocalizations.of(context)!.dnsServerSettingsDescription,
2023-05-24 20:40:45 +02:00
onTap: () => navigate(const DnsServerSettingsScreen()),
2022-10-20 02:42:25 +02:00
icon: Icons.settings,
2022-10-19 15:33:15 +02:00
),
2022-10-20 02:42:25 +02:00
CustomListTile(
title: AppLocalizations.of(context)!.dnsCacheConfig,
subtitle: AppLocalizations.of(context)!.dnsCacheConfigDescription,
2023-05-24 20:40:45 +02:00
onTap: () => navigate(const CacheConfigDnsScreen()),
2022-10-20 02:42:25 +02:00
icon: Icons.storage_rounded,
2022-10-19 19:29:05 +02:00
),
2022-10-19 20:26:40 +02:00
],
);
2023-05-24 20:40:45 +02:00
case LoadStatus.error:
2022-10-19 20:26:40 +02:00
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,
2023-01-29 21:52:37 +01:00
style: TextStyle(
2022-10-19 20:26:40 +02:00
fontSize: 22,
2023-01-29 21:52:37 +01:00
color: Theme.of(context).colorScheme.onSurfaceVariant,
2022-10-19 20:26:40 +02:00
),
)
],
2022-10-19 19:29:05 +02:00
),
2022-10-19 20:26:40 +02:00
);
default:
return const SizedBox();
}
}
2023-01-15 21:34:19 +01:00
void clearCache() async {
final result = await clearDnsCache(context, serversProvider.selectedServer!);
if (result == true) {
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsCacheCleared,
color: Colors.green
);
}
else {
showSnacbkar(
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),
2022-10-20 02:46:05 +02:00
actions: [
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
),
2022-10-19 20:26:40 +02:00
body: generateBody(),
2022-10-19 14:12:53 +02:00
);
}
}