Extracted dhcp to external provider

This commit is contained in:
Juan Gilsanz Polo 2023-05-24 18:22:13 +02:00
parent cd4a8aaf4f
commit 9460da6dcb
8 changed files with 83 additions and 96 deletions

View file

@ -21,6 +21,7 @@ import 'package:adguard_home_manager/providers/logs_provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/providers/clients_provider.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/providers/dhcp_provider.dart';
import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/constants/colors.dart';
@ -30,7 +31,6 @@ import 'package:adguard_home_manager/config/theme.dart';
import 'package:adguard_home_manager/classes/http_override.dart';
import 'package:adguard_home_manager/services/db/database.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@ -50,6 +50,7 @@ void main() async {
StatusProvider statusProvider = StatusProvider();
ClientsProvider clientsProvider = ClientsProvider();
FilteringProvider filtersProvider = FilteringProvider();
DhcpProvider dhcpProvider = DhcpProvider();
LogsProvider logsProvider = LogsProvider();
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
@ -97,6 +98,9 @@ void main() async {
ChangeNotifierProvider(
create: ((context) => serversProvider)
),
ChangeNotifierProvider(
create: ((context) => appConfigProvider)
),
ChangeNotifierProvider(
create: ((context) => statusProvider)
),
@ -110,7 +114,7 @@ void main() async {
create: ((context) => filtersProvider)
),
ChangeNotifierProvider(
create: ((context) => appConfigProvider)
create: ((context) => dhcpProvider)
),
ChangeNotifierProxyProvider<StatusProvider, FilteringProvider>(
create: (context) => filtersProvider,
@ -181,15 +185,15 @@ class _MainState extends State<Main> {
builder: (lightDynamic, darkDynamic) => MaterialApp(
title: 'AdGuard Home Manager',
theme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31
? appConfigProvider.useDynamicColor == true
? lightTheme(lightDynamic)
: lightThemeOldVersions(colors[appConfigProvider.staticColor])
: lightThemeOldVersions(colors[appConfigProvider.staticColor]),
darkTheme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31
? appConfigProvider.useDynamicColor == true
? darkTheme(darkDynamic)
: darkThemeOldVersions(colors[appConfigProvider.staticColor])
: darkThemeOldVersions(colors[appConfigProvider.staticColor]),
? appConfigProvider.useDynamicColor == true
? lightTheme(lightDynamic)
: lightThemeOldVersions(colors[appConfigProvider.staticColor])
: lightThemeOldVersions(colors[appConfigProvider.staticColor]),
darkTheme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31
? appConfigProvider.useDynamicColor == true
? darkTheme(darkDynamic)
: darkThemeOldVersions(colors[appConfigProvider.staticColor])
: darkThemeOldVersions(colors[appConfigProvider.staticColor]),
themeMode: appConfigProvider.selectedTheme,
debugShowCheckedModeBanner: false,
localizationsDelegates: const [

View file

@ -1,20 +1,9 @@
import 'dart:convert';
class DhcpModel {
int loadStatus = 0;
DhcpData? data;
DhcpModel({
required this.loadStatus,
this.data,
});
}
class DhcpData {
List<NetworkInterface> networkInterfaces;
DhcpStatus dhcpStatus;
DhcpData({
DhcpModel({
required this.networkInterfaces,
required this.dhcpStatus,
});

View file

@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/models/dhcp.dart';
class DhcpProvider with ChangeNotifier {
LoadStatus _loadStatus = LoadStatus.loading;
DhcpModel? _dhcp;
DhcpModel? get dhcp {
return _dhcp;
}
LoadStatus get loadStatus {
return _loadStatus;
}
void setDhcpData(DhcpModel data) {
_dhcp = data;
notifyListeners();
}
void setDhcpLoadStatus(LoadStatus status, bool notify) {
_loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
}

View file

@ -18,11 +18,6 @@ class ServersProvider with ChangeNotifier {
List<Server> _serversList = [];
Server? _selectedServer;
final DhcpModel _dhcp = DhcpModel(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
final RewriteRules _rewriteRules = RewriteRules(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
@ -46,10 +41,6 @@ class ServersProvider with ChangeNotifier {
return _selectedServer;
}
DhcpModel get dhcp {
return _dhcp;
}
RewriteRules get rewriteRules {
return _rewriteRules;
}
@ -75,18 +66,6 @@ class ServersProvider with ChangeNotifier {
_selectedServer = server;
notifyListeners();
}
void setDhcpData(DhcpData data) {
_dhcp.data = data;
notifyListeners();
}
void setDhcpLoadStatus(int status, bool notify) {
_dhcp.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setRewriteRulesData(List<RewriteRulesData> data) {
_rewriteRules.data = data;

View file

@ -13,42 +13,22 @@ import 'package:adguard_home_manager/screens/settings/dhcp/dhcp_leases.dart';
import 'package:adguard_home_manager/screens/settings/dhcp/select_interface_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/dhcp_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/dhcp.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
class Dhcp extends StatelessWidget {
const Dhcp({Key? key}) : super(key: key);
class DhcpScreen extends StatefulWidget {
const DhcpScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return DhcpWidget(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider
);
}
State<DhcpScreen> createState() => _DhcpScreenState();
}
class DhcpWidget extends StatefulWidget {
final ServersProvider serversProvider;
final AppConfigProvider appConfigProvider;
const DhcpWidget({
Key? key,
required this.serversProvider,
required this.appConfigProvider
}) : super(key: key);
@override
State<DhcpWidget> createState() => _DhcpWidgetState();
}
class _DhcpWidgetState extends State<DhcpWidget> {
class _DhcpScreenState extends State<DhcpScreen> {
NetworkInterface? selectedInterface;
bool enabled = false;
@ -74,17 +54,20 @@ class _DhcpWidgetState extends State<DhcpWidget> {
bool dataValid = false;
void loadDhcpStatus() async {
widget.serversProvider.setDhcpLoadStatus(0, false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final dhcpProvider = Provider.of<DhcpProvider>(context, listen: false);
final result = await getDhcpData(server: widget.serversProvider.selectedServer!);
dhcpProvider.setDhcpLoadStatus(LoadStatus.loading, false);
final result = await getDhcpData(server: serversProvider.selectedServer!);
if (mounted) {
if (result['result'] == 'success') {
widget.serversProvider.setDhcpLoadStatus(1, true);
widget.serversProvider.setDhcpData(result['data']);
dhcpProvider.setDhcpData(result['data']);
dhcpProvider.setDhcpLoadStatus(LoadStatus.loaded, true);
setState(() {
if (result['data'].dhcpStatus.interfaceName != '') {
selectedInterface = result['data'].networkInterfaces.firstWhere((interface) => interface.name == result['data'].dhcpStatus.interfaceName);
selectedInterface = result['data'].networkInterfaces.firstWhere((iface) => iface.name == result['data'].dhcpStatus.interfaceName);
enabled = result['data'].dhcpStatus.enabled;
ipv4StartRangeController.text = result['data'].dhcpStatus.v4.rangeStart;
@ -97,7 +80,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
});
}
else {
widget.serversProvider.setDhcpLoadStatus(2, true);
dhcpProvider.setDhcpLoadStatus(LoadStatus.error, true);
}
}
checkDataValid();
@ -213,6 +196,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dhcpProvider = Provider.of<DhcpProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -298,10 +282,10 @@ class _DhcpWidgetState extends State<DhcpWidget> {
processModal.close();
if (result['result'] == 'success') {
DhcpData data = serversProvider.dhcp.data!;
DhcpModel data = dhcpProvider.dhcp!;
data.dhcpStatus.staticLeases = [];
data.dhcpStatus.leases = [];
serversProvider.setDhcpData(data);
dhcpProvider.setDhcpData(data);
showSnacbkar(
appConfigProvider: appConfigProvider,
@ -356,7 +340,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
showDialog(
context: context,
builder: (context) => SelectInterfaceModal(
interfaces: serversProvider.dhcp.data!.networkInterfaces,
interfaces: dhcpProvider.dhcp!.networkInterfaces,
onSelect: (interface) => setState(() {
clearAll();
selectedInterface = interface;
@ -369,7 +353,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
showModalBottomSheet(
context: context,
builder: (context) => SelectInterfaceModal(
interfaces: serversProvider.dhcp.data!.networkInterfaces,
interfaces: dhcpProvider.dhcp!.networkInterfaces,
onSelect: (i) => setState(() {
clearAll();
selectedInterface = i;
@ -383,8 +367,8 @@ class _DhcpWidgetState extends State<DhcpWidget> {
}
Widget generateBody() {
switch (serversProvider.dhcp.loadStatus) {
case 0:
switch (dhcpProvider.loadStatus) {
case LoadStatus.loading:
return SizedBox(
width: double.maxFinite,
child: Column(
@ -404,7 +388,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
),
);
case 1:
case LoadStatus.loaded:
if (selectedInterface != null) {
return SingleChildScrollView(
child: Wrap(
@ -683,7 +667,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
onTap: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) => DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.leases,
items: dhcpProvider.dhcp!.dhcpStatus.leases,
staticLeases: false,
)
));
@ -716,7 +700,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
onTap: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) => DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.staticLeases,
items: dhcpProvider.dhcp!.dhcpStatus.staticLeases,
staticLeases: true,
)
));
@ -751,7 +735,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
if (!(Platform.isAndroid || Platform.isIOS)) {
SplitView.of(context).push(
DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.leases,
items: dhcpProvider.dhcp!.dhcpStatus.leases,
staticLeases: false,
)
);
@ -759,7 +743,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
else {
Navigator.push(context, MaterialPageRoute(
builder: (context) => DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.leases,
items: dhcpProvider.dhcp!.dhcpStatus.leases,
staticLeases: false,
)
));
@ -778,7 +762,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
if (!(Platform.isAndroid || Platform.isIOS)) {
SplitView.of(context).push(
DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.staticLeases,
items: dhcpProvider.dhcp!.dhcpStatus.staticLeases,
staticLeases: true,
)
);
@ -786,7 +770,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
else {
Navigator.push(context, MaterialPageRoute(
builder: (context) => DhcpLeases(
items: serversProvider.dhcp.data!.dhcpStatus.staticLeases,
items: dhcpProvider.dhcp!.dhcpStatus.staticLeases,
staticLeases: true,
)
));
@ -840,7 +824,7 @@ class _DhcpWidgetState extends State<DhcpWidget> {
);
}
case 2:
case LoadStatus.error:
return SizedBox(
width: double.maxFinite,
child: Column(

View file

@ -10,6 +10,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/settings/dhcp/delete_static_lease_modal.dart';
import 'package:adguard_home_manager/screens/settings/dhcp/add_static_lease_modal.dart';
import 'package:adguard_home_manager/providers/dhcp_provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
@ -30,6 +31,7 @@ class DhcpLeases extends StatelessWidget {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dhcpProvider = Provider.of<DhcpProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -47,9 +49,9 @@ class DhcpLeases extends StatelessWidget {
processModal.close();
if (result['result'] == 'success') {
DhcpData data = serversProvider.dhcp.data!;
DhcpModel data = dhcpProvider.dhcp!;
data.dhcpStatus.staticLeases = data.dhcpStatus.staticLeases.where((l) => l.mac != lease.mac).toList();
serversProvider.setDhcpData(data);
dhcpProvider.setDhcpData(data);
showSnacbkar(
appConfigProvider: appConfigProvider,
@ -80,9 +82,9 @@ class DhcpLeases extends StatelessWidget {
processModal.close();
if (result['result'] == 'success') {
DhcpData data = serversProvider.dhcp.data!;
DhcpModel data = dhcpProvider.dhcp!;
data.dhcpStatus.staticLeases.add(lease);
serversProvider.setDhcpData(data);
dhcpProvider.setDhcpData(data);
showSnacbkar(
appConfigProvider: appConfigProvider,

View file

@ -156,7 +156,7 @@ class SettingsWidget extends StatelessWidget {
title: AppLocalizations.of(context)!.dhcpSettings,
subtitle: AppLocalizations.of(context)!.dhcpSettingsDescription,
thisItem: 2,
screenToNavigate: const Dhcp(),
screenToNavigate: const DhcpScreen(),
),
settingsTile(
icon: Icons.dns_rounded,

View file

@ -1289,7 +1289,7 @@ Future getDhcpData({
return {
'result': 'success',
'data': DhcpData(
'data': DhcpModel(
networkInterfaces: interfaces,
dhcpStatus: DhcpStatus.fromJson(jsonDecode(result[1]['body']))
)