Added option to block and unblock domains from log details

This commit is contained in:
Juan Gilsanz Polo 2022-10-01 03:13:50 +02:00
parent 68d7b34880
commit 84df416011
8 changed files with 364 additions and 15 deletions

View file

@ -8,14 +8,31 @@ import 'package:adguard_home_manager/models/logs.dart';
class LogDetailsModal extends StatelessWidget {
final Log log;
final void Function(Log, String) blockUnblock;
const LogDetailsModal({
Key? key,
required this.log
required this.log,
required this.blockUnblock
}) : super(key: key);
@override
Widget build(BuildContext context) {
bool isLogBlocked() {
switch (log.reason) {
case 'NotFilteredNotFound':
return false;
case 'NotFilteredWhiteList':
return true;
case 'FilteredBlackList':
return true;
default:
return true;
}
}
Widget getResult() {
switch (log.reason) {
@ -193,21 +210,37 @@ class LogDetailsModal extends StatelessWidget {
),
LogListTile(
icon: Icons.smartphone_rounded,
title: AppLocalizations.of(context)!.device,
title: AppLocalizations.of(context)!.deviceIp,
subtitle: log.client
),
if (log.clientInfo.name != '') LogListTile(
icon: Icons.abc_rounded,
title: AppLocalizations.of(context)!.deviceName,
subtitle: log.clientInfo.name
),
],
)
),
Padding(
padding: const EdgeInsets.all(20),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
onPressed: () {
blockUnblock(log, isLogBlocked() == true ? 'unblock' : 'block');
Navigator.pop(context);
},
child: Text(
isLogBlocked() == true
? AppLocalizations.of(context)!.unblockDomain
: AppLocalizations.of(context)!.blockDomain
)
),
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(AppLocalizations.of(context)!.close)
)
),
],
),
)

View file

@ -1,8 +1,15 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/logs/log_details_modal.dart';
import 'package:adguard_home_manager/models/filtering_status.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/logs.dart';
import 'package:adguard_home_manager/functions/format_time.dart';
@ -20,6 +27,8 @@ class LogTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final width = MediaQuery.of(context).size.width;
Widget logStatusWidget({
@ -78,12 +87,63 @@ class LogTile extends StatelessWidget {
);
}
}
void blockUnblock(Log log, String newStatus) async {
FilteringStatus oldStatus = serversProvider.filteringStatus!;
List<String> newRules = serversProvider.filteringStatus!.userRules.where((domain) => !domain.contains(log.question.name)).toList();
if (newStatus == 'block') {
newRules.add("||${log.question.name}^");
}
else if (newStatus == 'unblock') {
newRules.add("@@||${log.question.name}^");
}
FilteringStatus newObj = serversProvider.filteringStatus!;
newObj.userRules = newRules;
serversProvider.setFilteringStatus(newObj);
String formattedFilters = "";
for (var rule in newObj.userRules) {
if (formattedFilters == "") {
formattedFilters = "$formattedFilters$rule";
}
else {
formattedFilters = "$formattedFilters\n$rule";
}
}
final ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingUserFilters);
final result = await postFilteringRules(server: serversProvider.selectedServer!, data: formattedFilters);
processModal.close();
if (result['result'] == 'success') {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated),
backgroundColor: Colors.green,
)
);
}
else {
serversProvider.setFilteringStatus(oldStatus);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated),
backgroundColor: Colors.red,
)
);
}
}
void openLogDetailsModal() {
showModalBottomSheet(
context: context,
builder: (context) => LogDetailsModal(
log: log
builder: (ctx) => LogDetailsModal(
log: log,
blockUnblock: blockUnblock,
),
backgroundColor: Colors.transparent,
isScrollControlled: true

View file

@ -1,9 +1,12 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/logs/log_tile.dart';
import 'package:adguard_home_manager/models/filtering_status.dart';
import 'package:adguard_home_manager/models/app_log.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
@ -21,7 +24,8 @@ class Logs extends StatelessWidget {
return LogsWidget(
server: serversProvider.selectedServer!,
createLog: appConfigProvider.addLog
createLog: appConfigProvider.addLog,
setFilteringStatus: serversProvider.setFilteringStatus,
);
}
}
@ -29,11 +33,13 @@ class Logs extends StatelessWidget {
class LogsWidget extends StatefulWidget {
final Server server;
final void Function(AppLog) createLog;
final void Function(FilteringStatus) setFilteringStatus;
const LogsWidget({
Key? key,
required this.server,
required this.createLog
required this.createLog,
required this.setFilteringStatus,
}) : super(key: key);
@override
@ -89,6 +95,21 @@ class _LogsWidgetState extends State<LogsWidget> {
}
}
void fetchFilteringRules() async {
final result = await getFilteringRules(server: widget.server);
if (result['result'] == 'success') {
widget.setFilteringStatus(result['data']);
}
else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(AppLocalizations.of(context)!.couldntGetFilteringStatus),
backgroundColor: Colors.red,
)
);
}
}
void scrollListener() {
if (scrollController.position.extentAfter < 500 && isLoadingMore == false) {
fetchLogs(loadingMore: true);
@ -99,6 +120,7 @@ class _LogsWidgetState extends State<LogsWidget> {
void initState() {
scrollController = ScrollController()..addListener(scrollListener);
fetchLogs(inOffset: 0);
fetchFilteringRules();
super.initState();
}