Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions lib/core/errors/service_error.dart
Original file line number Diff line number Diff line change
Expand Up @@ -290,3 +290,21 @@ final class StorageError extends ServiceError {
final Object? originalError;
const StorageError({this.originalError});
}

// ============================================================================
// Device/Router Errors
// ============================================================================

/// Serial number mismatch between expected and actual router
final class SerialNumberMismatchError extends ServiceError {
final String expected;
final String actual;
const SerialNumberMismatchError(
{required this.expected, required this.actual});
}

/// Router connectivity error (cannot reach router)
final class ConnectivityError extends ServiceError {
final String? message;
const ConnectivityError({this.message});
}
129 changes: 7 additions & 122 deletions lib/core/jnap/providers/dashboard_manager_provider.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:intl/intl.dart';
import 'package:privacy_gui/constants/_constants.dart';
import 'package:privacy_gui/core/jnap/actions/better_action.dart';
import 'package:privacy_gui/core/jnap/models/device_info.dart';
import 'package:privacy_gui/core/jnap/models/guest_radio_settings.dart';
import 'package:privacy_gui/core/jnap/models/radio_info.dart';
import 'package:privacy_gui/core/jnap/models/soft_sku_settings.dart';
import 'package:privacy_gui/core/jnap/providers/dashboard_manager_state.dart';
import 'package:privacy_gui/core/jnap/providers/polling_provider.dart';
import 'package:privacy_gui/core/jnap/result/jnap_result.dart';
import 'package:privacy_gui/core/jnap/router_repository.dart';
import 'package:privacy_gui/core/jnap/services/dashboard_manager_service.dart';
import 'package:privacy_gui/core/utils/bench_mark.dart';
import 'package:privacy_gui/core/utils/logger.dart';
import 'package:shared_preferences/shared_preferences.dart';
Expand All @@ -23,87 +17,10 @@ class DashboardManagerNotifier extends Notifier<DashboardManagerState> {
@override
DashboardManagerState build() {
final coreTransactionData = ref.watch(pollingProvider).value;
return createState(
pollingResult: coreTransactionData,
);
final service = ref.read(dashboardManagerServiceProvider);
return service.transformPollingData(coreTransactionData);
}

DashboardManagerState createState({
CoreTransactionData? pollingResult,
}) {
Map<String, dynamic>? getDeviceInfoData;
Map<String, dynamic>? getRadioInfoData;
Map<String, dynamic>? getGuestRadioSettingsData;
Map<String, dynamic>? getSystemStats;
Map<String, dynamic>? getEthernetPortConnections;
Map<String, dynamic>? getLocalTime;

final result = pollingResult?.data;
if (result != null) {
getDeviceInfoData =
(result[JNAPAction.getDeviceInfo] as JNAPSuccess?)?.output;
getRadioInfoData =
(result[JNAPAction.getRadioInfo] as JNAPSuccess?)?.output;
getGuestRadioSettingsData =
(result[JNAPAction.getGuestRadioSettings] as JNAPSuccess?)?.output;
getSystemStats =
(result[JNAPAction.getSystemStats] as JNAPSuccess?)?.output;
getEthernetPortConnections =
(result[JNAPAction.getEthernetPortConnections] as JNAPSuccess?)
?.output;
getLocalTime = (result[JNAPAction.getLocalTime] as JNAPSuccess?)?.output;
}

var newState = const DashboardManagerState();
if (getDeviceInfoData != null) {
newState = newState.copyWith(
deviceInfo: NodeDeviceInfo.fromJson(getDeviceInfoData));
}
if (getRadioInfoData != null) {
newState = _getMainRadioList(newState, getRadioInfoData);
}
if (getGuestRadioSettingsData != null) {
newState = _getGuestRadioList(newState, getGuestRadioSettingsData);
}

if (getSystemStats != null) {
final uptimeSeconds = getSystemStats['uptimeSeconds'];
final cpuLoad = getSystemStats['CPULoad'];
final memoryLoad = getSystemStats['MemoryLoad'];
newState = newState.copyWith(
uptimes: uptimeSeconds, cpuLoad: cpuLoad, memoryLoad: memoryLoad);
}

if (getEthernetPortConnections != null) {
final lanPortConnections =
List<String>.from(getEthernetPortConnections['lanPortConnections']);
final wanPortConnection = getEthernetPortConnections['wanPortConnection'];
newState = newState.copyWith(
lanConnections: lanPortConnections, wanConnection: wanPortConnection);
}

String? timeString;
if (getLocalTime != null) {
timeString = getLocalTime['currentTime'];
}

final localTime = (timeString != null
? DateFormat("yyyy-MM-ddThh:mm:ssZ").tryParse(timeString)
: DateTime.now())
?.millisecondsSinceEpoch;
newState = newState.copyWith(localTime: localTime);

final softSKUSettings = JNAPTransactionSuccessWrap.getResult(
JNAPAction.getSoftSKUSettings, result ?? {});
if (softSKUSettings != null) {
final settings = SoftSKUSettings.fromMap(softSKUSettings.output);
newState = newState.copyWith(skuModelNumber: settings.modelNumber);
}

return newState;
}

// ... (other methods remain the same)
Future<void> saveSelectedNetwork(
String serialNumber, String networkId) async {
logger.i('[Prepare]: saveSelectedNetwork - $networkId, $serialNumber');
Expand All @@ -116,53 +33,21 @@ class DashboardManagerNotifier extends Notifier<DashboardManagerState> {
}

Future<NodeDeviceInfo> checkRouterIsBack() async {
NodeDeviceInfo? nodeDeviceInfo;
final routerRepository = ref.read(routerRepositoryProvider);
final result = await routerRepository.send(JNAPAction.getDeviceInfo,
fetchRemote: true, retries: 0);
nodeDeviceInfo = NodeDeviceInfo.fromJson(result.output);
final service = ref.read(dashboardManagerServiceProvider);
final prefs = await SharedPreferences.getInstance();
final currentSN =
prefs.getString(pCurrentSN) ?? prefs.getString(pPnpConfiguredSN);
if (currentSN == nodeDeviceInfo.serialNumber) {
return nodeDeviceInfo;
} else {
logger.d('[CheckRouterBack]: SN not match');
throw Exception('[CheckRouterBack]: SN not match');
}
return service.checkRouterIsBack(currentSN ?? '');
}

Future<NodeDeviceInfo> checkDeviceInfo(String? serialNumber) async {
final benchMark = BenchMarkLogger(name: 'checkDeviceInfo');
benchMark.start();
NodeDeviceInfo? nodeDeviceInfo = state.deviceInfo;
if (nodeDeviceInfo == null) {
final routerRepository = ref.read(routerRepositoryProvider);
final result = await routerRepository.send(JNAPAction.getDeviceInfo,
retries: 0, timeoutMs: 3000);
nodeDeviceInfo = NodeDeviceInfo.fromJson(result.output);
}
final service = ref.read(dashboardManagerServiceProvider);
final nodeDeviceInfo = await service.checkDeviceInfo(state.deviceInfo);
benchMark.end();
return nodeDeviceInfo;
}

// bool isHealthCheckModuleSupported(String module) {
// return state.healthCheckModules.contains(module);
// }

DashboardManagerState _getMainRadioList(
DashboardManagerState state, Map<String, dynamic> data) {
final getRadioInfoData = GetRadioInfo.fromMap(data);
return state.copyWith(mainRadios: getRadioInfoData.radios);
}

DashboardManagerState _getGuestRadioList(
DashboardManagerState state, Map<String, dynamic> data) {
final guestRadioSettings = GuestRadioSettings.fromMap(data);
return state.copyWith(
guestRadios: guestRadioSettings.radios,
isGuestNetworkEnabled: guestRadioSettings.isGuestNetworkEnabled);
}
}

final selectedNetworkIdProvider = StateProvider<String?>((ref) {
Expand Down
Loading