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

View file

@ -1,20 +1,9 @@
import 'dart:convert'; import 'dart:convert';
class DhcpModel { class DhcpModel {
int loadStatus = 0;
DhcpData? data;
DhcpModel({
required this.loadStatus,
this.data,
});
}
class DhcpData {
List<NetworkInterface> networkInterfaces; List<NetworkInterface> networkInterfaces;
DhcpStatus dhcpStatus; DhcpStatus dhcpStatus;
DhcpData({ DhcpModel({
required this.networkInterfaces, required this.networkInterfaces,
required this.dhcpStatus, 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 = []; List<Server> _serversList = [];
Server? _selectedServer; Server? _selectedServer;
final DhcpModel _dhcp = DhcpModel(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
final RewriteRules _rewriteRules = RewriteRules( final RewriteRules _rewriteRules = RewriteRules(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null data: null
@ -46,10 +41,6 @@ class ServersProvider with ChangeNotifier {
return _selectedServer; return _selectedServer;
} }
DhcpModel get dhcp {
return _dhcp;
}
RewriteRules get rewriteRules { RewriteRules get rewriteRules {
return _rewriteRules; return _rewriteRules;
} }
@ -76,18 +67,6 @@ class ServersProvider with ChangeNotifier {
notifyListeners(); 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) { void setRewriteRulesData(List<RewriteRulesData> data) {
_rewriteRules.data = data; _rewriteRules.data = data;
notifyListeners(); notifyListeners();

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

View file

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

View file

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