diff --git a/lib/providers/dns_provider.dart b/lib/providers/dns_provider.dart index db1767f..0929f3a 100644 --- a/lib/providers/dns_provider.dart +++ b/lib/providers/dns_provider.dart @@ -42,10 +42,10 @@ class DnsProvider with ChangeNotifier { _loadStatus = LoadStatus.loading; } - final result = await _serversProvider!.apiClient!.getDnsInfo(); + final result = await _serversProvider!.apiClient2!.getDnsInfo(); - if (result['result'] == 'success') { - _dnsInfo = result['data']; + if (result.successful == true) { + _dnsInfo = result.content as DnsInfo; _loadStatus = LoadStatus.loaded; notifyListeners(); return true; diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index a3211b5..7861e6d 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -153,7 +153,7 @@ class LogsProvider with ChangeNotifier { notifyListeners(); } - final result = await _serversProvider!.apiClient!.getLogs( + final result = await _serversProvider!.apiClient2!.getLogs( count: logsQuantity, offset: offst, olderThan: logsOlderThan, @@ -166,11 +166,11 @@ class LogsProvider with ChangeNotifier { notifyListeners(); } - if (result['result'] == 'success') { + if (result.successful == true) { _offset = inOffset != null ? inOffset+logsQuantity : offset+logsQuantity; if (loadingMore != null && loadingMore == true && logsData != null) { - LogsData newLogsData = result['data']; - newLogsData.data = [...logsData!.data, ...result['data'].data]; + LogsData newLogsData = result.content; + newLogsData.data = [...logsData!.data, ...(result.content as LogsData).data]; if (appliedFilters.clients != null) { newLogsData.data = newLogsData.data.where( (item) => appliedFilters.clients!.contains(item.client) @@ -179,7 +179,7 @@ class LogsProvider with ChangeNotifier { _logsData = newLogsData; } else { - LogsData newLogsData = result['data']; + LogsData newLogsData = result.content; if (appliedFilters.clients != null) { newLogsData.data = newLogsData.data.where( (item) => appliedFilters.clients!.contains(item.client) @@ -204,7 +204,7 @@ class LogsProvider with ChangeNotifier { resetFilters(); - final result = await _serversProvider!.apiClient!.getLogs( + final result = await _serversProvider!.apiClient2!.getLogs( count: logsQuantity ); @@ -214,8 +214,8 @@ class LogsProvider with ChangeNotifier { clients: null ); - if (result['result'] == 'success') { - _logsData = result['data']; + if (result.successful == true) { + _logsData = result.content as LogsData; _loadStatus = LoadStatus.loaded; notifyListeners(); return true; @@ -233,7 +233,7 @@ class LogsProvider with ChangeNotifier { setOffset(0); - final result = await _serversProvider!.apiClient!.getLogs( + final result = await _serversProvider!.apiClient2!.getLogs( count: logsQuantity, olderThan: logsOlderThan, responseStatus: selectedResultStatus, @@ -246,8 +246,8 @@ class LogsProvider with ChangeNotifier { clients: selectedClients ); - if (result['result'] == 'success') { - LogsData newLogsData = result['data']; + if (result.successful == true) { + LogsData newLogsData = result.content as LogsData; if (appliedFilters.clients != null) { newLogsData.data = newLogsData.data.where( (item) => appliedFilters.clients!.contains(item.client) diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index addf617..a8f1003 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -7,7 +7,6 @@ import 'package:adguard_home_manager/services/api_client.dart'; import 'package:adguard_home_manager/services/external_requests.dart'; import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/models/update_available.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/conversions.dart'; import 'package:adguard_home_manager/services/db/queries.dart'; import 'package:adguard_home_manager/constants/enums.dart'; @@ -17,7 +16,7 @@ class ServersProvider with ChangeNotifier { List _serversList = []; Server? _selectedServer; - ApiClient? _apiClient; + // ApiClient? _apiClient; ApiClientV2? _apiClient2; bool _updatingServer = false; @@ -27,9 +26,9 @@ class ServersProvider with ChangeNotifier { data: null, ); - ApiClient? get apiClient { - return _apiClient; - } + // ApiClient? get apiClient { + // return _apiClient; + // } ApiClientV2? get apiClient2 { return _apiClient2; @@ -77,10 +76,10 @@ class ServersProvider with ChangeNotifier { notifyListeners(); } - void setApiClient(ApiClient client) { - _apiClient = client; - notifyListeners(); - } + // void setApiClient(ApiClient client) { + // _apiClient = client; + // notifyListeners(); + // } void setApiClient2(ApiClientV2 client) { _apiClient2 = client; @@ -153,7 +152,8 @@ class ServersProvider with ChangeNotifier { _serversList = newServers; if (selectedServer != null &&server.id == selectedServer!.id) { - _apiClient = ApiClient(server: server); + // _apiClient = ApiClient(server: server); + _apiClient2 = ApiClientV2(server: server); } notifyListeners(); @@ -168,7 +168,7 @@ class ServersProvider with ChangeNotifier { final result = await removeServerQuery(_dbInstance!, server.id); if (result == true) { _selectedServer = null; - _apiClient = null; + // _apiClient = null; List newServers = _serversList.where((s) => s.id != server.id).toList(); _serversList = newServers; notifyListeners(); @@ -181,13 +181,13 @@ class ServersProvider with ChangeNotifier { void checkServerUpdatesAvailable({ required Server server, - ApiClient? apiClient + ApiClientV2? apiClient }) async { - final client = apiClient ?? _apiClient; + final client = apiClient ?? _apiClient2; setUpdateAvailableLoadStatus(LoadStatus.loading, true); final result = await client!.checkServerUpdates(); - if (result['result'] == 'success') { - UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']); + if (result.successful == true) { + UpdateAvailableData data = UpdateAvailableData.fromJson(result.content); final gitHubResult = await ExternalRequests.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); if (gitHubResult.successful == true) { data.changelog = gitHubResult.content; @@ -200,12 +200,12 @@ class ServersProvider with ChangeNotifier { } } - Future initializateServer(Server server, ApiClient apiClient, ApiClientV2 apiClient2) async { + Future initializateServer(Server server, /*ApiClient apiClient, */ ApiClientV2 apiClient2) async { final serverStatus = await _apiClient2!.getServerStatus(); if (serverStatus.successful == true) { checkServerUpdatesAvailable( // Do not await server: server, - apiClient: apiClient + apiClient: apiClient2 ); } } @@ -237,11 +237,11 @@ class ServersProvider with ChangeNotifier { if (defaultServer != null) { _selectedServer = defaultServer; - final client = ApiClient(server: defaultServer); + // final client = ApiClient(server: defaultServer); final client2 = ApiClientV2(server: defaultServer); - _apiClient = client; + // _apiClient = client; _apiClient2 = client2; - initializateServer(defaultServer, client, client2); + initializateServer(defaultServer, /*client,*/ client2); } } else { diff --git a/lib/providers/status_provider.dart b/lib/providers/status_provider.dart index 53fd2f5..5fba2dd 100644 --- a/lib/providers/status_provider.dart +++ b/lib/providers/status_provider.dart @@ -149,13 +149,13 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('filtering'); notifyListeners(); - final result = await _serversProvider!.apiClient!.updateFiltering( + final result = await _serversProvider!.apiClient2!.updateFiltering( enable: newStatus, ); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'filtering').toList(); - if (result['result'] == 'success') { + if (result.successful == true) { _serverStatus!.filteringEnabled = newStatus; notifyListeners(); return true; diff --git a/lib/screens/clients/client/logs_list_client.dart b/lib/screens/clients/client/logs_list_client.dart index 8d975a9..422c80c 100644 --- a/lib/screens/clients/client/logs_list_client.dart +++ b/lib/screens/clients/client/logs_list_client.dart @@ -67,7 +67,7 @@ class _LogsListClientState extends State { if (cancelableRequest != null) cancelableRequest!.cancel(); cancelableRequest = CancelableOperation.fromFuture( - serversProvider.apiClient!.getLogs( + serversProvider.apiClient2!.getLogs( count: logsQuantity, offset: offst, search: '"${widget.ip}"' diff --git a/lib/screens/settings/dhcp/dhcp.dart b/lib/screens/settings/dhcp/dhcp.dart index 6440e3b..dbb4a9a 100644 --- a/lib/screens/settings/dhcp/dhcp.dart +++ b/lib/screens/settings/dhcp/dhcp.dart @@ -260,11 +260,11 @@ class _DhcpScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.restoringLeases); - final result = await serversProvider.apiClient!.restoreAllLeases(); + final result = await serversProvider.apiClient2!.restoreAllLeases(); processModal.close(); - if (result['result'] == 'success') { + if (result.successful == true) { DhcpModel data = dhcpProvider.dhcp!; data.dhcpStatus.staticLeases = []; data.dhcpStatus.leases = []; diff --git a/lib/screens/settings/server_info/server_info.dart b/lib/screens/settings/server_info/server_info.dart index 2a51a16..3032dcf 100644 --- a/lib/screens/settings/server_info/server_info.dart +++ b/lib/screens/settings/server_info/server_info.dart @@ -1,61 +1,37 @@ -import 'package:adguard_home_manager/constants/enums.dart'; -import 'package:adguard_home_manager/functions/desktop_mode.dart'; -import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; +import 'package:animations/animations.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/settings/server_info/dns_addresses_modal.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; -import 'package:adguard_home_manager/providers/app_config_provider.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/functions/desktop_mode.dart'; import 'package:adguard_home_manager/models/server_info.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; -class ServerInformation extends StatelessWidget { - const ServerInformation({Key? key}) : super(key: key); +class ServerInformation extends StatefulWidget { + const ServerInformation({super.key}); @override - Widget build(BuildContext context) { - final serversProvider = Provider.of(context); - final appConfigProvider = Provider.of(context); - - return ServerInformationWidget( - serversProvider: serversProvider, - appConfigProvider: appConfigProvider, - ); - } + State createState() => _ServerInformationState(); } -class ServerInformationWidget extends StatefulWidget { - final ServersProvider serversProvider; - final AppConfigProvider appConfigProvider; - - const ServerInformationWidget({ - Key? key, - required this.serversProvider, - required this.appConfigProvider, - }) : super(key: key); - - @override - State createState() => _ServerInformationWidgetState(); -} - -class _ServerInformationWidgetState extends State { +class _ServerInformationState extends State { ServerInfo serverInfo = ServerInfo(loadStatus: LoadStatus.loading); void fetchServerInfo() async { - final result = await Provider.of(context, listen: false).apiClient!.getServerInfo(); - if (mounted) { - if (result['result'] == 'success') { - setState(() { - serverInfo.data = result['data']; - serverInfo.loadStatus = LoadStatus.loaded; - }); - } - else { - setState(() => serverInfo.loadStatus = LoadStatus.error); - } + final result = await Provider.of(context, listen: false).apiClient2!.getServerInfo(); + if (!mounted) return; + if (result.successful == true) { + setState(() { + serverInfo.data = result.content as ServerInfoData; + serverInfo.loadStatus = LoadStatus.loaded; + }); + } + else { + setState(() => serverInfo.loadStatus = LoadStatus.error); } } diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index c3b1337..8d5f384 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -166,7 +166,7 @@ class _SettingsWidgetState extends State { if ( serversProvider.selectedServer != null && statusProvider.serverStatus != null && - serversProvider.apiClient != null + serversProvider.apiClient2 != null ) ...[ SectionLabel(label: AppLocalizations.of(context)!.serverSettings), settingsTile( diff --git a/lib/widgets/bottom_nav_bar.dart b/lib/widgets/bottom_nav_bar.dart index b5ff9df..8d06a8d 100644 --- a/lib/widgets/bottom_nav_bar.dart +++ b/lib/widgets/bottom_nav_bar.dart @@ -8,14 +8,14 @@ import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/models/app_screen.dart'; class BottomNavBar extends StatelessWidget { - const BottomNavBar({Key? key}) : super(key: key); + const BottomNavBar({super.key}); @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); - List screens = serversProvider.selectedServer != null && serversProvider.apiClient != null + List screens = serversProvider.selectedServer != null && serversProvider.apiClient2 != null ? screensServerConnected : screensSelectServer; @@ -44,12 +44,12 @@ class BottomNavBar extends StatelessWidget { } } - if ((serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1) { + if ((serversProvider.selectedServer == null || serversProvider.apiClient2 == null) && appConfigProvider.selectedScreen > 1) { appConfigProvider.setSelectedScreen(0); } return NavigationBar( - selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient2 == null) && appConfigProvider.selectedScreen > 1 ? 0 : appConfigProvider.selectedScreen, destinations: screens.map((screen) => NavigationDestination( diff --git a/lib/widgets/layout.dart b/lib/widgets/layout.dart index 8a0a14b..4d6e131 100644 --- a/lib/widgets/layout.dart +++ b/lib/widgets/layout.dart @@ -62,7 +62,7 @@ class _LayoutState extends State with WidgetsBindingObserver { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); - final screens = serversProvider.selectedServer != null + final screens = serversProvider.selectedServer != null && serversProvider.apiClient2 != null ? screensServerConnected : screensSelectServer; @@ -120,26 +120,15 @@ class _LayoutState extends State with WidgetsBindingObserver { ), ], ), - if (serversProvider.selectedServer != null) - ...screensServerConnected.asMap().entries.map( - (s) => DrawerTile( - icon: s.value.icon, - title: translatedName(s.value.name), - isSelected: appConfigProvider.selectedScreen == s.key, - onSelect: () => _goBranch(s.key), - withoutTitle: !_drawerExpanded, - ), - ), - if (serversProvider.selectedServer == null) - ...screensSelectServer.asMap().entries.map( - (s) => DrawerTile( - icon: s.value.icon, - title: translatedName(s.value.name), - isSelected: appConfigProvider.selectedScreen == s.key, - onSelect: () => _goBranch(s.key), - withoutTitle: !_drawerExpanded, - ), + ...screens.asMap().entries.map( + (s) => DrawerTile( + icon: s.value.icon, + title: translatedName(s.value.name), + isSelected: appConfigProvider.selectedScreen == s.key, + onSelect: () => _goBranch(s.key), + withoutTitle: !_drawerExpanded, ), + ), ], ), ), @@ -164,7 +153,7 @@ class _LayoutState extends State with WidgetsBindingObserver { ); } else { - final screens = serversProvider.selectedServer != null && serversProvider.apiClient != null + final screens = serversProvider.selectedServer != null && serversProvider.apiClient2 != null ? screensServerConnected : screensSelectServer; @@ -184,7 +173,7 @@ class _LayoutState extends State with WidgetsBindingObserver { : screens[0].child, ), bottomNavigationBar: NavigationBar( - selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient2 == null) && appConfigProvider.selectedScreen > 1 ? 0 : appConfigProvider.selectedScreen, onDestinationSelected: (s) => _goBranch(s), diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 063993c..2d2e1ef 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -9,7 +9,7 @@ import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; class SideNavigationRail extends StatelessWidget { - const SideNavigationRail({Key? key}) : super(key: key); + const SideNavigationRail({super.key}); @override Widget build(BuildContext context) { @@ -46,12 +46,12 @@ class SideNavigationRail extends StatelessWidget { } } - if ((serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1) { + if ((serversProvider.selectedServer == null || serversProvider.apiClient2 == null) && appConfigProvider.selectedScreen > 1) { appConfigProvider.setSelectedScreen(0); } return NavigationRail( - selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient2 == null) && appConfigProvider.selectedScreen > 1 ? 0 : appConfigProvider.selectedScreen, destinations: screens.map((screen) => NavigationRailDestination( diff --git a/lib/widgets/servers_list/server_tile_functions.dart b/lib/widgets/servers_list/server_tile_functions.dart new file mode 100644 index 0000000..e3fa4d6 --- /dev/null +++ b/lib/widgets/servers_list/server_tile_functions.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart'; +import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart'; + +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/models/server_status.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/status_provider.dart'; +import 'package:adguard_home_manager/services/api_client.dart'; +import 'package:adguard_home_manager/services/auth.dart'; +import 'package:adguard_home_manager/classes/process_modal.dart'; +import 'package:adguard_home_manager/models/server.dart'; + +EdgeInsets generateMargins({ + required int index, + required int serversListLength +}) { + if (index == 0) { + return const EdgeInsets.only(top: 16, left: 16, right: 8, bottom: 8); + } + if (index == 1) { + return const EdgeInsets.only(top: 16, left: 8, right: 16, bottom: 8); + } + else if (index == serversListLength-1 && (index+1)%2 == 0) { + return const EdgeInsets.only(top: 8, left: 8, right: 16, bottom: 16); + } + else if (index == serversListLength-1 && (index+1)%2 == 1) { + return const EdgeInsets.only(top: 8, left: 16, right: 8, bottom: 16); + } + else { + if ((index+1)%2 == 0) { + return const EdgeInsets.only(top: 8, left: 8, right: 16, bottom: 8); + } + else { + return const EdgeInsets.only(top: 8, left: 16, right: 8, bottom: 8); + } + } +} + +void showDeleteModal({ + required BuildContext context, + required Server server +}) async { + await Future.delayed(const Duration(seconds: 0), () => { + showDialog( + context: context, + builder: (context) => DeleteModal( + serverToDelete: server, + ), + barrierDismissible: false + ) + }); +} + +void openServerModal({ + required BuildContext context, + required double width, + Server? server, +}) async { + await Future.delayed(const Duration(seconds: 0), (() => { + openServerFormModal(context: context, width: width, server: server) + })); +} + +void connectToServer({ + required BuildContext context, + required Server server +}) async { + final ProcessModal process = ProcessModal(context: context); + process.open(AppLocalizations.of(context)!.connecting); + + final result = server.runningOnHa == true + ? await ServerAuth.loginHA(server) + : await ServerAuth.login(server); + + if (result == AuthStatus.success && context.mounted) { + final serversProvider = Provider.of(context, listen: false); + final statusProvider = Provider.of(context, listen: false); + + final ApiClientV2 apiClient2 = ApiClientV2(server: server); + serversProvider.setApiClient2(apiClient2); + serversProvider.setSelectedServer(server); + + statusProvider.setServerStatusLoad(LoadStatus.loading); + final serverStatus = await apiClient2.getServerStatus(); + if (serverStatus.successful == true) { + statusProvider.setServerStatusData( + data: serverStatus.content as ServerStatus + ); + serversProvider.checkServerUpdatesAvailable( + server: server, + ); + statusProvider.setServerStatusLoad(LoadStatus.loaded); + } + else { + statusProvider.setServerStatusLoad(LoadStatus.error); + } + + process.close(); + } + else { + process.close(); + if (!context.mounted) return; + final appConfigProvider = Provider.of(context, listen: false); + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.cannotConnect, + color: Colors.red + ); + } +} + +void setDefaultServer({ + required BuildContext context, + required Server server +}) async { + final serversProvider = Provider.of(context, listen: false); + final result = await serversProvider.setDefaultServer(server); + if (!context.mounted) return; + final appConfigProvider = Provider.of(context, listen: false); + if (result == null) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.connectionDefaultSuccessfully, + color: Colors.green + ); + } + else { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.connectionDefaultFailed, + color: Colors.red + ); + } +} \ No newline at end of file diff --git a/lib/widgets/servers_list/servers_list_item.dart b/lib/widgets/servers_list/servers_list_item.dart index 492a5e8..e67b436 100644 --- a/lib/widgets/servers_list/servers_list_item.dart +++ b/lib/widgets/servers_list/servers_list_item.dart @@ -104,8 +104,6 @@ class _ServersListItemState extends State with SingleTickerProv : await login(server); if (result['result'] == 'success') { - final ApiClient apiClient = ApiClient(server: server); - serversProvider.setApiClient(apiClient); final ApiClientV2 apiClient2 = ApiClientV2(server: server); serversProvider.setApiClient2(apiClient2); serversProvider.setSelectedServer(server); diff --git a/lib/widgets/servers_list/servers_tile_item.dart b/lib/widgets/servers_list/servers_tile_item.dart index 0422368..61c2a64 100644 --- a/lib/widgets/servers_list/servers_tile_item.dart +++ b/lib/widgets/servers_list/servers_tile_item.dart @@ -4,18 +4,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart'; -import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart'; +import 'package:adguard_home_manager/widgets/servers_list/server_tile_functions.dart'; -import 'package:adguard_home_manager/models/server_status.dart'; -import 'package:adguard_home_manager/services/api_client.dart'; -import 'package:adguard_home_manager/classes/process_modal.dart'; -import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/status_provider.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'; import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -26,12 +18,12 @@ class ServersTileItem extends StatefulWidget { final double breakingWidth; const ServersTileItem({ - Key? key, + super.key, required this.server, required this.index, required this.onChange, required this.breakingWidth - }) : super(key: key); + }); @override State createState() => _ServersTileItemState(); @@ -46,332 +38,272 @@ class _ServersTileItemState extends State with SingleTickerProv final width = MediaQuery.of(context).size.width; - void showDeleteModal(Server server) async { - await Future.delayed(const Duration(seconds: 0), () => { - showDialog( - context: context, - builder: (context) => DeleteModal( - serverToDelete: server, - ), - barrierDismissible: false - ) - }); - } - - void openServerModal({Server? server}) async { - await Future.delayed(const Duration(seconds: 0), (() => { - openServerFormModal(context: context, width: width, server: server) - })); - } - - void connectToServer(Server server) async { - final ProcessModal process = ProcessModal(context: context); - process.open(AppLocalizations.of(context)!.connecting); - - final result = server.runningOnHa == true - ? await loginHA(server) - : await login(server); - - if (result['result'] == 'success') { - final ApiClient apiClient = ApiClient(server: server); - serversProvider.setApiClient(apiClient); - final ApiClientV2 apiClient2 = ApiClientV2(server: server); - serversProvider.setApiClient2(apiClient2); - serversProvider.setSelectedServer(server); - - statusProvider.setServerStatusLoad(LoadStatus.loading); - final serverStatus = await apiClient2.getServerStatus(); - if (serverStatus.successful == true) { - statusProvider.setServerStatusData( - data: serverStatus.content as ServerStatus - ); - serversProvider.checkServerUpdatesAvailable( - server: server, - ); - statusProvider.setServerStatusLoad(LoadStatus.loaded); - } - else { - statusProvider.setServerStatusLoad(LoadStatus.error); - } - - process.close(); - } - else { - process.close(); - appConfigProvider.addLog(result['log']); - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.cannotConnect, - color: Colors.red - ); - } - } - - void setDefaultServer(Server server) async { - final result = await serversProvider.setDefaultServer(server); - if (result == null) { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.connectionDefaultSuccessfully, - color: Colors.green - ); - } - else { - appConfigProvider.addLog( - AppLog( - type: 'set_default_server', - dateTime: DateTime.now(), - message: result.toString() - ) - ); - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.connectionDefaultFailed, - color: Colors.red - ); - } - } - - Widget leadingIcon(Server server) { - if (server.defaultServer == true) { - return Stack( - alignment: Alignment.center, - children: [ - Icon( - Icons.storage_rounded, - color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? statusProvider.serverStatus != null - ? Colors.green - : Colors.orange - : null, - ), - SizedBox( - width: 25, - height: 25, - child: Stack( - alignment: Alignment.bottomRight, - children: [ - Container( - padding: const EdgeInsets.all(1), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primaryContainer, - borderRadius: BorderRadius.circular(20) - ), - child: Icon( - Icons.star, - color: Theme.of(context).colorScheme.onPrimaryContainer, - size: 10, - ), - ), - ], - ), - ) - ], - ); - } - else { - return Icon( - Icons.storage_rounded, - color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? statusProvider.serverStatus != null - ? Colors.green - : Colors.orange - : null, - ); - } - } - - Widget topRow(Server server, int index) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Row( - children: [ - Container( - margin: const EdgeInsets.only(right: 16), - child: leadingIcon(server), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "${server.connectionMethod}://${server.domain}${server.path ?? ""}${server.port != null ? ':${server.port}' : ""}", - textAlign: TextAlign.left, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w400, - color: Theme.of(context).colorScheme.onSurface - ), - ), - Column( - children: [ - const SizedBox(height: 3), - Text( - server.name, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w400, - color: Theme.of(context).colorScheme.onSurfaceVariant - ), - ) - ], - ) - ], - ), - ), - ], - ), - ), - ], - ); - } - - Widget bottomRow(Server server, int index) { - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - PopupMenuButton( - itemBuilder: (context) => [ - PopupMenuItem( - enabled: server.defaultServer == false - ? true - : false, - onTap: server.defaultServer == false - ? (() => setDefaultServer(server)) - : null, - child: SizedBox( - child: Row( - children: [ - const Icon(Icons.star), - const SizedBox(width: 15), - Text( - server.defaultServer == true - ? AppLocalizations.of(context)!.defaultConnection - : AppLocalizations.of(context)!.setDefault, - ) - ], - ), - ) - ), - PopupMenuItem( - onTap: (() => openServerModal(server: server)), - child: Row( - children: [ - const Icon(Icons.edit), - const SizedBox(width: 15), - Text(AppLocalizations.of(context)!.edit) - ], - ) - ), - PopupMenuItem( - onTap: (() => showDeleteModal(server)), - child: Row( - children: [ - const Icon(Icons.delete), - const SizedBox(width: 15), - Text(AppLocalizations.of(context)!.delete) - ], - ) - ), - ] - ), - SizedBox( - child: serversProvider.selectedServer != null && - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null && - serversProvider.selectedServer?.id == server.id - ? Padding( - padding: const EdgeInsets.only(right: 16), - child: Row( - children: [ - Icon( - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null - ? Icons.check - : Icons.warning, - color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null - ? Colors.green - : Colors.orange, - ), - const SizedBox(width: 10), - Text( - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null - ? AppLocalizations.of(context)!.connected - : AppLocalizations.of(context)!.selectedDisconnected, - style: TextStyle( - color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null - ? Colors.green - : Colors.orange, - fontWeight: FontWeight.w500 - ), - ) - ], - ), - ) - : Container( - margin: const EdgeInsets.only(right: 10), - child: FilledButton.icon( - icon: const Icon(Icons.login), - onPressed: () => connectToServer(server), - label: Text(AppLocalizations.of(context)!.connect), - ), - ), - ) - ], - ) - ], - ); - } - - EdgeInsets generateMargins(int index) { - if (index == 0) { - return const EdgeInsets.only(top: 16, left: 16, right: 8, bottom: 8); - } - if (index == 1) { - return const EdgeInsets.only(top: 16, left: 8, right: 16, bottom: 8); - } - else if (index == serversProvider.serversList.length-1 && (index+1)%2 == 0) { - return const EdgeInsets.only(top: 8, left: 8, right: 16, bottom: 16); - } - else if (index == serversProvider.serversList.length-1 && (index+1)%2 == 1) { - return const EdgeInsets.only(top: 8, left: 16, right: 8, bottom: 16); - } - else { - if ((index+1)%2 == 0) { - return const EdgeInsets.only(top: 8, left: 8, right: 16, bottom: 8); - } - else { - return const EdgeInsets.only(top: 8, left: 16, right: 8, bottom: 8); - } - } - } - return FractionallySizedBox( widthFactor: width > widget.breakingWidth ? 0.5 : 1, child: Card( margin: width > widget.breakingWidth - ? generateMargins(widget.index) + ? generateMargins(index: widget.index, serversListLength: serversProvider.serversList.length) : const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( children: [ Padding( padding: const EdgeInsets.all(16), - child: topRow(widget.server, widget.index), + child: _TopRow(server: widget.server, index: widget.index) ), Padding( padding: const EdgeInsets.only( left: 8, right: 8, bottom: 16 ), - child: bottomRow(widget.server, widget.index), + child: _BottomRow( + server: widget.server, + connectToServer: (s) => connectToServer(context: context, server: s), + openServerModal: (s) => openServerModal(context: context, server: s, width: width), + setDefaultServer: (s) => setDefaultServer(context: context, server: s), + showDeleteModal: (s) => showDeleteModal(context: context, server: s), + ) ) ], ), ), ); } +} + +class _LeadingIcon extends StatelessWidget { + final Server server; + + const _LeadingIcon({ + required this.server, + }); + + @override + Widget build(BuildContext context) { + final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); + + if (server.defaultServer == true) { + return Stack( + alignment: Alignment.center, + children: [ + Icon( + Icons.storage_rounded, + color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id + ? statusProvider.serverStatus != null + ? Colors.green + : Colors.orange + : null, + ), + SizedBox( + width: 25, + height: 25, + child: Stack( + alignment: Alignment.bottomRight, + children: [ + Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(20) + ), + child: Icon( + Icons.star, + color: Theme.of(context).colorScheme.onPrimaryContainer, + size: 10, + ), + ), + ], + ), + ) + ], + ); + } + else { + return Icon( + Icons.storage_rounded, + color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id + ? statusProvider.serverStatus != null + ? Colors.green + : Colors.orange + : null, + ); + } + } +} + +class _TopRow extends StatelessWidget { + final Server server; + final int index; + + const _TopRow({ + required this.server, + required this.index, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Container( + margin: const EdgeInsets.only(right: 16), + child: _LeadingIcon(server: server), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${server.connectionMethod}://${server.domain}${server.path ?? ""}${server.port != null ? ':${server.port}' : ""}", + textAlign: TextAlign.left, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Theme.of(context).colorScheme.onSurface + ), + ), + Column( + children: [ + const SizedBox(height: 3), + Text( + server.name, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + color: Theme.of(context).colorScheme.onSurfaceVariant + ), + ) + ], + ) + ], + ), + ), + ], + ), + ), + ], + ); + } +} + +class _BottomRow extends StatelessWidget { + final Server server; + final void Function(Server) setDefaultServer; + final void Function(Server) openServerModal; + final void Function(Server) showDeleteModal; + final void Function(Server) connectToServer; + + const _BottomRow({ + required this.server, + required this.setDefaultServer, + required this.openServerModal, + required this.showDeleteModal, + required this.connectToServer, + }); + + @override + Widget build(BuildContext context) { + final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); + + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + PopupMenuButton( + itemBuilder: (context) => [ + PopupMenuItem( + enabled: server.defaultServer == false + ? true + : false, + onTap: server.defaultServer == false + ? (() => setDefaultServer(server)) + : null, + child: SizedBox( + child: Row( + children: [ + const Icon(Icons.star), + const SizedBox(width: 15), + Text( + server.defaultServer == true + ? AppLocalizations.of(context)!.defaultConnection + : AppLocalizations.of(context)!.setDefault, + ) + ], + ), + ) + ), + PopupMenuItem( + onTap: (() => openServerModal(server)), + child: Row( + children: [ + const Icon(Icons.edit), + const SizedBox(width: 15), + Text(AppLocalizations.of(context)!.edit) + ], + ) + ), + PopupMenuItem( + onTap: (() => showDeleteModal(server)), + child: Row( + children: [ + const Icon(Icons.delete), + const SizedBox(width: 15), + Text(AppLocalizations.of(context)!.delete) + ], + ) + ), + ] + ), + SizedBox( + child: serversProvider.selectedServer != null && + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null && + serversProvider.selectedServer?.id == server.id + ? Padding( + padding: const EdgeInsets.only(right: 16), + child: Row( + children: [ + Icon( + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null + ? Icons.check + : Icons.warning, + color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null + ? Colors.green + : Colors.orange, + ), + const SizedBox(width: 10), + Text( + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null + ? AppLocalizations.of(context)!.connected + : AppLocalizations.of(context)!.selectedDisconnected, + style: TextStyle( + color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null + ? Colors.green + : Colors.orange, + fontWeight: FontWeight.w500 + ), + ) + ], + ), + ) + : Container( + margin: const EdgeInsets.only(right: 10), + child: FilledButton.icon( + icon: const Icon(Icons.login), + onPressed: () => connectToServer(server), + label: Text(AppLocalizations.of(context)!.connect), + ), + ), + ) + ], + ) + ], + ); + } } \ No newline at end of file