improved tab & topic handling

This commit is contained in:
Fabian Freund
2024-08-28 16:00:39 +02:00
parent 95dd254484
commit 0a7e84236f
43 changed files with 2035 additions and 847 deletions
@@ -1,5 +1,5 @@
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:lensai/features/web_view/domain/entities/consistent_controller.dart';
import 'package:lensai/features/topics/data/providers.dart';
import 'package:lensai/features/web_view/domain/repositories/web_view.dart';
import 'package:lensai/features/web_view/presentation/services/readerability_script.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -8,19 +8,25 @@ part 'readerability.g.dart';
@Riverpod()
class ReaderabilityController extends _$ReaderabilityController {
late InAppWebViewController? _controller;
late ReaderabilityScriptService _service;
late KeepAliveLink _aliveLink;
@override
AsyncValue<({bool readerable, bool applied})> build(
ConsistentController controller,
String tabId,
) {
_controller = controller.value;
_service =
ref.watch(readerabilityScriptServiceProvider(controller).notifier);
_service = ref.watch(readerabilityScriptServiceProvider(tabId).notifier);
_aliveLink = ref.keepAlive();
ref.listen(
isTabExistingProvider(tabId),
(previous, next) {
if (next.valueOrNull == false) {
_aliveLink.close();
}
},
);
return const AsyncLoading();
}
@@ -43,7 +49,7 @@ class ReaderabilityController extends _$ReaderabilityController {
state = const AsyncLoading();
state = await AsyncValue.guard(() async {
if (applied) {
await _controller?.reload();
await ref.read(webViewControllerProvider(tabId))?.reload();
} else {
await _service.applyReaderable();
}
@@ -55,8 +61,4 @@ class ReaderabilityController extends _$ReaderabilityController {
void reset() {
state = const AsyncLoading();
}
void dispose() {
_aliveLink.close();
}
}
@@ -7,7 +7,7 @@ part of 'readerability.dart';
// **************************************************************************
String _$readerabilityControllerHash() =>
r'1237e57abce82f71dbc66b6ab46f50dad9e3ddf9';
r'a1c8da3a9cf48300089e390a4fcae89862a6ec1a';
/// Copied from Dart SDK
class _SystemHash {
@@ -32,10 +32,10 @@ class _SystemHash {
abstract class _$ReaderabilityController extends BuildlessAutoDisposeNotifier<
AsyncValue<({bool readerable, bool applied})>> {
late final ConsistentController controller;
late final String tabId;
AsyncValue<({bool readerable, bool applied})> build(
ConsistentController controller,
String tabId,
);
}
@@ -51,10 +51,10 @@ class ReaderabilityControllerFamily
/// See also [ReaderabilityController].
ReaderabilityControllerProvider call(
ConsistentController controller,
String tabId,
) {
return ReaderabilityControllerProvider(
controller,
tabId,
);
}
@@ -63,7 +63,7 @@ class ReaderabilityControllerFamily
covariant ReaderabilityControllerProvider provider,
) {
return call(
provider.controller,
provider.tabId,
);
}
@@ -87,9 +87,9 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
ReaderabilityController, AsyncValue<({bool readerable, bool applied})>> {
/// See also [ReaderabilityController].
ReaderabilityControllerProvider(
ConsistentController controller,
String tabId,
) : this._internal(
() => ReaderabilityController()..controller = controller,
() => ReaderabilityController()..tabId = tabId,
from: readerabilityControllerProvider,
name: r'readerabilityControllerProvider',
debugGetCreateSourceHash:
@@ -99,7 +99,7 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
dependencies: ReaderabilityControllerFamily._dependencies,
allTransitiveDependencies:
ReaderabilityControllerFamily._allTransitiveDependencies,
controller: controller,
tabId: tabId,
);
ReaderabilityControllerProvider._internal(
@@ -109,17 +109,17 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.controller,
required this.tabId,
}) : super.internal();
final ConsistentController controller;
final String tabId;
@override
AsyncValue<({bool readerable, bool applied})> runNotifierBuild(
covariant ReaderabilityController notifier,
) {
return notifier.build(
controller,
tabId,
);
}
@@ -128,13 +128,13 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
return ProviderOverride(
origin: this,
override: ReaderabilityControllerProvider._internal(
() => create()..controller = controller,
() => create()..tabId = tabId,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
controller: controller,
tabId: tabId,
),
);
}
@@ -147,14 +147,13 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
@override
bool operator ==(Object other) {
return other is ReaderabilityControllerProvider &&
other.controller == controller;
return other is ReaderabilityControllerProvider && other.tabId == tabId;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, controller.hashCode);
hash = _SystemHash.combine(hash, tabId.hashCode);
return _SystemHash.finish(hash);
}
@@ -162,8 +161,8 @@ class ReaderabilityControllerProvider extends AutoDisposeNotifierProviderImpl<
mixin ReaderabilityControllerRef on AutoDisposeNotifierProviderRef<
AsyncValue<({bool readerable, bool applied})>> {
/// The parameter `controller` of this provider.
ConsistentController get controller;
/// The parameter `tabId` of this provider.
String get tabId;
}
class _ReaderabilityControllerProviderElement
@@ -173,8 +172,7 @@ class _ReaderabilityControllerProviderElement
_ReaderabilityControllerProviderElement(super.provider);
@override
ConsistentController get controller =>
(origin as ReaderabilityControllerProvider).controller;
String get tabId => (origin as ReaderabilityControllerProvider).tabId;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
@@ -1,12 +1,13 @@
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:lensai/features/topics/domain/providers.dart';
import 'package:lensai/features/topics/domain/repositories/tab.dart';
import 'package:lensai/features/web_view/domain/entities/web_view_page.dart';
import 'package:lensai/features/web_view/domain/repositories/web_view.dart';
import 'package:lensai/features/web_view/presentation/widgets/web_view.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'switch_new_tab.g.dart';
@riverpod
@Riverpod(keepAlive: true)
class SwitchNewTabController extends _$SwitchNewTabController {
@override
FutureOr<void> build() {}
@@ -15,13 +16,15 @@ class SwitchNewTabController extends _$SwitchNewTabController {
state = const AsyncLoading();
state = await AsyncValue.guard(
() async {
final topic = ref.read(selectedTopicProvider);
final newTab = WebViewPage.create(
url: WebUri.uri(url),
topicId: topic,
);
ref
.read(webViewRepositoryProvider.notifier)
.addTab(WebView(tab: newTab));
await ref
.read(topicTabRepositoryProvider(topic).notifier)
.addTab(newTab);
ref.read(webViewTabControllerProvider.notifier).showTab(newTab.id);
},
@@ -7,12 +7,12 @@ part of 'switch_new_tab.dart';
// **************************************************************************
String _$switchNewTabControllerHash() =>
r'fb831015e4b99d3ae86bd2a88a3c6f4c7004783d';
r'7ebfea953aeb81c279ea11254ff0ad558e6a949f';
/// See also [SwitchNewTabController].
@ProviderFor(SwitchNewTabController)
final switchNewTabControllerProvider =
AutoDisposeAsyncNotifierProvider<SwitchNewTabController, void>.internal(
AsyncNotifierProvider<SwitchNewTabController, void>.internal(
SwitchNewTabController.new,
name: r'switchNewTabControllerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +22,6 @@ final switchNewTabControllerProvider =
allTransitiveDependencies: null,
);
typedef _$SwitchNewTabController = AutoDisposeAsyncNotifier<void>;
typedef _$SwitchNewTabController = AsyncNotifier<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