diff --git a/lib/main.dart b/lib/main.dart index ddfbe3e..6ea9fb4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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( create: (context) => filtersProvider, @@ -181,15 +185,15 @@ class _MainState extends State
{ 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 [ diff --git a/lib/models/dhcp.dart b/lib/models/dhcp.dart index 4910e68..c870b9b 100644 --- a/lib/models/dhcp.dart +++ b/lib/models/dhcp.dart @@ -1,20 +1,9 @@ import 'dart:convert'; - class DhcpModel { - int loadStatus = 0; - DhcpData? data; - - DhcpModel({ - required this.loadStatus, - this.data, - }); -} - -class DhcpData { List networkInterfaces; DhcpStatus dhcpStatus; - DhcpData({ + DhcpModel({ required this.networkInterfaces, required this.dhcpStatus, }); diff --git a/lib/providers/dhcp_provider.dart b/lib/providers/dhcp_provider.dart new file mode 100644 index 0000000..d03759b --- /dev/null +++ b/lib/providers/dhcp_provider.dart @@ -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(); + } + } +} \ No newline at end of file diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index c34a27b..eb795a8 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -18,11 +18,6 @@ class ServersProvider with ChangeNotifier { List _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 data) { _rewriteRules.data = data; diff --git a/lib/screens/settings/dhcp/dhcp.dart b/lib/screens/settings/dhcp/dhcp.dart index c45dfd7..1e9d796 100644 --- a/lib/screens/settings/dhcp/dhcp.dart +++ b/lib/screens/settings/dhcp/dhcp.dart @@ -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(context); - final appConfigProvider = Provider.of(context); - - return DhcpWidget( - serversProvider: serversProvider, - appConfigProvider: appConfigProvider - ); - } + State 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 createState() => _DhcpWidgetState(); -} - -class _DhcpWidgetState extends State { +class _DhcpScreenState extends State { NetworkInterface? selectedInterface; bool enabled = false; @@ -74,17 +54,20 @@ class _DhcpWidgetState extends State { bool dataValid = false; void loadDhcpStatus() async { - widget.serversProvider.setDhcpLoadStatus(0, false); + final serversProvider = Provider.of(context, listen: false); + final dhcpProvider = Provider.of(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 { }); } else { - widget.serversProvider.setDhcpLoadStatus(2, true); + dhcpProvider.setDhcpLoadStatus(LoadStatus.error, true); } } checkDataValid(); @@ -213,6 +196,7 @@ class _DhcpWidgetState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final dhcpProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -298,10 +282,10 @@ class _DhcpWidgetState extends State { 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 { 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 { 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 { } 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 { ), ); - case 1: + case LoadStatus.loaded: if (selectedInterface != null) { return SingleChildScrollView( child: Wrap( @@ -683,7 +667,7 @@ class _DhcpWidgetState extends State { 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 { 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 { 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 { 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 { 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 { 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 { ); } - case 2: + case LoadStatus.error: return SizedBox( width: double.maxFinite, child: Column( diff --git a/lib/screens/settings/dhcp/dhcp_leases.dart b/lib/screens/settings/dhcp/dhcp_leases.dart index 39a3303..ede2ef1 100644 --- a/lib/screens/settings/dhcp/dhcp_leases.dart +++ b/lib/screens/settings/dhcp/dhcp_leases.dart @@ -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(context); + final dhcpProvider = Provider.of(context); final appConfigProvider = Provider.of(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, diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 4586b28..d08c322 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -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, diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 8016da9..3997dfd 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -1289,7 +1289,7 @@ Future getDhcpData({ return { 'result': 'success', - 'data': DhcpData( + 'data': DhcpModel( networkInterfaces: interfaces, dhcpStatus: DhcpStatus.fromJson(jsonDecode(result[1]['body'])) )