Files
umbrix/lib/features/config_option/notifier/warp_option_notifier.dart

99 lines
3.6 KiB
Dart
Raw Normal View History

2024-02-18 12:35:11 +03:30
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:umbrix/core/preferences/preferences_provider.dart';
import 'package:umbrix/features/config_option/data/config_option_repository.dart';
import 'package:umbrix/features/config_option/model/config_option_failure.dart';
import 'package:umbrix/singbox/service/singbox_service_provider.dart';
import 'package:umbrix/utils/utils.dart';
2024-02-03 12:36:27 +03:30
import 'package:riverpod_annotation/riverpod_annotation.dart';
2024-02-18 12:35:11 +03:30
import 'package:shared_preferences/shared_preferences.dart';
2024-02-03 12:36:27 +03:30
2024-02-18 12:35:11 +03:30
part 'warp_option_notifier.freezed.dart';
2024-02-03 12:36:27 +03:30
part 'warp_option_notifier.g.dart';
@Riverpod(keepAlive: true)
2024-02-18 12:35:11 +03:30
class WarpOptionNotifier extends _$WarpOptionNotifier with AppLogger {
2024-02-03 12:36:27 +03:30
@override
2024-02-18 12:35:11 +03:30
WarpOptions build() {
final consent = _prefs.getBool(warpConsentGiven) ?? false;
bool hasWarpConfig = false;
try {
final accountId = _prefs.getString("warp-account-id");
final accessToken = _prefs.getString("warp-access-token");
hasWarpConfig = accountId != null && accessToken != null;
} catch (e) {
loggy.warning(e);
}
return WarpOptions(
consentGiven: consent,
configGeneration: hasWarpConfig ? const AsyncValue.data("") : AsyncError(const MissingWarpConfigFailure(), StackTrace.current),
2024-02-18 12:35:11 +03:30
);
2024-02-03 12:36:27 +03:30
}
SharedPreferences get _prefs => ref.read(sharedPreferencesProvider).requireValue;
2024-02-18 12:35:11 +03:30
2024-02-03 12:36:27 +03:30
Future<void> agree() async {
await ref.read(sharedPreferencesProvider).requireValue.setBool(warpConsentGiven, true);
2024-02-18 12:35:11 +03:30
state = state.copyWith(consentGiven: true);
await generateWarpConfig();
}
Future<void> generateWarpConfig() async {
if (state.configGeneration.isLoading) return;
state = state.copyWith(configGeneration: const AsyncLoading());
2024-03-02 22:53:14 +03:30
final result = await AsyncValue.guard(() async {
final warp = await ref
.read(singboxServiceProvider)
.generateWarpConfig(
licenseKey: ref.read(ConfigOptions.warpLicenseKey),
previousAccountId: ref.read(ConfigOptions.warpAccountId),
previousAccessToken: ref.read(ConfigOptions.warpAccessToken),
)
.getOrElse((l) => throw l)
.run();
await ref.read(ConfigOptions.warpAccountId.notifier).update(warp.accountId);
await ref.read(ConfigOptions.warpAccessToken.notifier).update(warp.accessToken);
await ref.read(ConfigOptions.warpWireguardConfig.notifier).update(warp.wireguardConfig);
return warp.log;
});
state = state.copyWith(configGeneration: result);
}
Future<void> generateWarp2Config() async {
if (state.configGeneration.isLoading) return;
state = state.copyWith(configGeneration: const AsyncLoading());
final result = await AsyncValue.guard(() async {
final warp = await ref
.read(singboxServiceProvider)
.generateWarpConfig(
licenseKey: ref.read(ConfigOptions.warpLicenseKey),
previousAccountId: ref.read(ConfigOptions.warp2AccountId),
previousAccessToken: ref.read(ConfigOptions.warp2AccessToken),
)
.getOrElse((l) => throw l)
.run();
await ref.read(ConfigOptions.warp2AccountId.notifier).update(warp.accountId);
await ref.read(ConfigOptions.warp2AccessToken.notifier).update(warp.accessToken);
await ref.read(ConfigOptions.warp2WireguardConfig.notifier).update(warp.wireguardConfig);
2024-03-02 22:53:14 +03:30
return warp.log;
});
2024-02-18 12:35:11 +03:30
state = state.copyWith(configGeneration: result);
2024-02-03 12:36:27 +03:30
}
static const warpConsentGiven = "warp_consent_given";
}
2024-02-18 12:35:11 +03:30
@freezed
class WarpOptions with _$WarpOptions {
const factory WarpOptions({
required bool consentGiven,
2024-02-20 22:16:47 +03:30
required AsyncValue<String> configGeneration,
2024-02-18 12:35:11 +03:30
}) = _WarpOptions;
}