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
@@ -2,12 +2,18 @@
import 'dart:async';
import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:lensai/features/search_browser/domain/entities/modes.dart';
import 'package:lensai/features/search_browser/domain/entities/sheet.dart';
import 'package:lensai/features/search_browser/domain/services/create_tab.dart';
import 'package:lensai/features/topics/data/database/database.dart';
import 'package:lensai/features/topics/domain/repositories/tab.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';
import 'package:rxdart/rxdart.dart';
@@ -137,3 +143,65 @@ class ShowFindInPage extends _$ShowFindInPage {
return false;
}
}
@Riverpod()
class WebViewWidgetCache extends _$WebViewWidgetCache {
final _requestedWidgets = <String>{};
List<TabData> _availableTabs = [];
@override
List<WebView> build() {
ref.listen(
tabRepositoryProvider,
(previous, next) {
if (next.hasValue && next.valueOrNull != null) {
_availableTabs = next.valueOrNull!;
_removeClosedWidgets();
_requestedWidgets.removeWhere(_ensureWidgetCached);
}
},
);
ref.listen(
webViewTabControllerProvider,
(_, tabId) {
if (tabId != null && !_ensureWidgetCached(tabId)) {
_requestedWidgets.add(tabId);
}
},
);
return stateOrNull ?? [];
}
void _removeClosedWidgets() {
state = [...state]..removeWhere(
(element) => !_availableTabs.any((tab) => tab.id == element.tabId),
);
}
bool _ensureWidgetCached(String tabId) {
final index = state.indexWhere((tab) => tab.tabId == tabId);
if (index < 0) {
final tab = _availableTabs.firstWhereOrNull((tab) => tab.id == tabId);
if (tab != null) {
state = [
...state,
WebView(
key: GlobalKey(),
tabId: tabId,
initialUrlRequest: URLRequest(url: WebUri.uri(tab.url)),
),
];
return true;
}
return false;
}
return true;
}
}
@@ -411,5 +411,22 @@ final showFindInPageProvider = NotifierProvider<ShowFindInPage, bool>.internal(
);
typedef _$ShowFindInPage = Notifier<bool>;
String _$webViewWidgetCacheHash() =>
r'7d6f769e8c314d9dc579d700d36d6d4c944e600f';
/// See also [WebViewWidgetCache].
@ProviderFor(WebViewWidgetCache)
final webViewWidgetCacheProvider =
AutoDisposeNotifierProvider<WebViewWidgetCache, List<WebView>>.internal(
WebViewWidgetCache.new,
name: r'webViewWidgetCacheProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$webViewWidgetCacheHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$WebViewWidgetCache = AutoDisposeNotifier<List<WebView>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member