Added ignored domains list config

This commit is contained in:
Juan Gilsanz Polo 2024-01-24 15:14:19 +01:00
parent 211eab9f44
commit c12e8c5ad3
6 changed files with 218 additions and 31 deletions

View file

@ -1,6 +1,9 @@
import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/settings/logs_settings/logs_settings.dart';
import 'package:adguard_home_manager/widgets/section_label.dart';
import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart';
class LogsConfigOptions extends StatelessWidget {
@ -13,6 +16,8 @@ class LogsConfigOptions extends StatelessWidget {
final void Function(double?) updateRetentionTime;
final void Function() onClear;
final void Function() onConfirm;
final List<DomainListItemController> ignoredDomainsControllers;
final void Function(List<DomainListItemController>) updateIgnoredDomainsControllers;
const LogsConfigOptions({
super.key,
@ -24,11 +29,15 @@ class LogsConfigOptions extends StatelessWidget {
required this.retentionTime,
required this.updateRetentionTime,
required this.onClear,
required this.onConfirm
required this.onConfirm,
required this.ignoredDomainsControllers,
required this.updateIgnoredDomainsControllers
});
@override
Widget build(BuildContext context) {
const Uuid uuid = Uuid();
final List<String> dropdownItemTranslation = [
AppLocalizations.of(context)!.hours6,
AppLocalizations.of(context)!.hours24,
@ -37,7 +46,28 @@ class LogsConfigOptions extends StatelessWidget {
AppLocalizations.of(context)!.days90,
];
return Column(
void validateDomain(String value, String id) {
final domainRegex = RegExp(r'^([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+$');
bool error = false;
if (domainRegex.hasMatch(value)) {
error = false;
}
else {
error = true;
}
updateIgnoredDomainsControllers(
ignoredDomainsControllers.map((entry) {
if (entry.id != id) return entry;
return DomainListItemController(
id: id,
controller: entry.controller,
error: error
);
}).toList()
);
}
return ListView(
children: [
const SizedBox(height: 16),
Padding(
@ -100,12 +130,83 @@ class LogsConfigOptions extends StatelessWidget {
borderRadius: BorderRadius.circular(20),
),
),
const SizedBox(height: 24),
ElevatedButton.icon(
onPressed: onClear,
icon: const Icon(Icons.delete_rounded),
label: Text(AppLocalizations.of(context)!.clearLogs),
)
Padding(
padding: const EdgeInsets.only(top: 24, bottom: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SectionLabel(
label: AppLocalizations.of(context)!.ignoredDomains,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 0),
),
Padding(
padding: const EdgeInsets.only(right: 10),
child: IconButton(
onPressed: () => updateIgnoredDomainsControllers([
...ignoredDomainsControllers,
DomainListItemController(
id: uuid.v4(),
controller: TextEditingController(),
error: false
),
]),
icon: const Icon(Icons.add)
),
)
],
),
),
if (ignoredDomainsControllers.isNotEmpty) ...ignoredDomainsControllers.map((controller) => Padding(
padding: const EdgeInsets.only(
top: 12, bottom: 12, left: 24, right: 10
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: TextFormField(
controller: controller.controller,
onChanged: (v) => validateDomain(v, controller.id),
decoration: InputDecoration(
prefixIcon: const Icon(Icons.link_rounded),
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(10)
)
),
labelText: AppLocalizations.of(context)!.domain,
errorText: controller.error
? AppLocalizations.of(context)!.invalidDomain
: null
),
),
),
const SizedBox(width: 12),
Padding(
padding: controller.error
? const EdgeInsets.only(bottom: 24)
: const EdgeInsets.all(0),
child: IconButton(
onPressed: () => updateIgnoredDomainsControllers(
ignoredDomainsControllers.where((e) => e.id != controller.id).toList()
),
icon: const Icon(Icons.remove_circle_outline_outlined)
),
)
],
),
)),
if (ignoredDomainsControllers.isEmpty) Container(
padding: const EdgeInsets.symmetric(vertical: 16),
child: Text(
AppLocalizations.of(context)!.noIgnoredDomainsAdded,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18,
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
),
],
);
}