This commit is contained in:
Fabian Freund
2025-02-16 23:21:44 +01:00
parent ddb0f14059
commit 6368e30479
81 changed files with 20308 additions and 88 deletions
@@ -4,7 +4,7 @@ import 'package:lensai/features/user/domain/repositories/engine_settings.dart';
import 'package:lensai/features/user/domain/repositories/general_settings.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'engine_settings.g.dart';
part 'engine_settings_replication.g.dart';
@Riverpod(keepAlive: true)
class EngineSettingsReplicationService
@@ -1,6 +1,6 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'engine_settings.dart';
part of 'engine_settings_replication.dart';
// **************************************************************************
// RiverpodGenerator
@@ -0,0 +1,44 @@
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:lensai/data/models/equatable_iterable.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/providers.dart';
import 'package:lensai/features/tor/domain/services/tor_proxy.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'proxy_settings_replucation.g.dart';
@Riverpod(keepAlive: true)
class ProxySettingsReplucation extends _$ProxySettingsReplucation {
final _service = GeckoContainerProxyService();
@override
void build() {
ref.listen(
torProxyServiceProvider.select((data) => data.valueOrNull),
(previous, next) async {
if (next != null) {
await _service.setProxyPort(next);
}
},
);
ref.listen(
containersWithCountProvider.select(
(value) => EquatableCollection(
value.valueOrNull
?.where((container) => container.metadata.useProxy)
.map((container) => container.metadata.contextualIdentity)
.nonNulls
.toList(),
immutable: true,
),
),
(previous, next) async {
if (next.collection != null) {
for (final contextId in next.collection!) {
await _service.addContainerProxy(contextId);
}
}
},
);
}
}
@@ -0,0 +1,27 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'proxy_settings_replucation.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$proxySettingsReplucationHash() =>
r'08cb19e895056d4ddbf0399b23a9d159a0c86915';
/// See also [ProxySettingsReplucation].
@ProviderFor(ProxySettingsReplucation)
final proxySettingsReplucationProvider =
NotifierProvider<ProxySettingsReplucation, void>.internal(
ProxySettingsReplucation.new,
name: r'proxySettingsReplucationProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$proxySettingsReplucationHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ProxySettingsReplucation = Notifier<void>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@@ -33,6 +33,7 @@ import 'package:lensai/features/kagi/data/entities/modes.dart';
import 'package:lensai/presentation/hooks/draggable_scrollable_controller.dart';
import 'package:lensai/presentation/hooks/menu_controller.dart';
import 'package:lensai/presentation/hooks/overlay_portal_controller.dart';
import 'package:lensai/presentation/icons/tor_icons.dart';
import 'package:lensai/utils/ui_helper.dart' as ui_helper;
import 'package:share_plus/share_plus.dart';
@@ -418,6 +419,13 @@ class BrowserScreen extends HookConsumerWidget {
);
},
),
MenuItemButton(
onPressed: () async {
await context.push(TorProxyRoute().location);
},
leadingIcon: const Icon(TorIcons.onionAlt),
child: const Text('Tor'),
),
const Divider(),
MenuItemButton(
onPressed: () async {
@@ -10,7 +10,8 @@ import 'package:lensai/features/geckoview/domain/providers/tab_state.dart';
import 'package:lensai/features/geckoview/domain/providers/web_extensions_state.dart';
import 'package:lensai/features/geckoview/domain/repositories/tab.dart';
import 'package:lensai/features/geckoview/features/browser/domain/services/delete_browser_data.dart';
import 'package:lensai/features/geckoview/features/browser/domain/services/engine_settings.dart';
import 'package:lensai/features/geckoview/features/browser/domain/services/engine_settings_replication.dart';
import 'package:lensai/features/geckoview/features/browser/domain/services/proxy_settings_replucation.dart';
import 'package:lensai/features/geckoview/features/tabs/features/vector_store/domain/repositories/document.dart';
import 'package:lensai/features/user/domain/repositories/cache.dart';
import 'package:lensai/features/user/domain/repositories/general_settings.dart';
@@ -146,6 +147,11 @@ class _BrowserViewState extends ConsumerState<BrowserView>
engineSettingsReplicationServiceProvider,
(previous, next) {},
);
ref.listenManual(
proxySettingsReplucationProvider,
(previous, next) {},
);
}
@override
@@ -21,6 +21,7 @@ import 'package:lensai/features/geckoview/features/tabs/domain/repositories/cont
import 'package:lensai/features/geckoview/features/tabs/domain/repositories/tab.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/repositories/tab_search.dart';
import 'package:lensai/features/geckoview/features/tabs/presentation/widgets/container_chips.dart';
import 'package:lensai/features/tor/presentation/controllers/start_tor_proxy.dart';
import 'package:lensai/presentation/hooks/listenable_callback.dart';
import 'package:lensai/presentation/widgets/speech_to_text_button.dart';
@@ -181,9 +182,16 @@ class _Tab extends HookConsumerWidget {
return ContainerChips(
selectedContainer: selectedContainer,
onSelected: (container) async {
await ref
final result = await ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
if (context.mounted &&
result == SetContainerResult.successHasProxy) {
await ref
.read(startProxyControllerProvider.notifier)
.maybeStartProxy(context);
}
},
onDeleted: (container) async {
ref