intermediate

This commit is contained in:
Fabian Freund
2024-09-13 09:11:06 +02:00
parent 3b047b5d8a
commit 37d2c84d7f
155 changed files with 5666 additions and 1816 deletions
@@ -2,76 +2,16 @@
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/kagi/data/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';
part 'providers.g.dart';
@Riverpod()
class OverlayDialog extends _$OverlayDialog {
@override
Widget? build() {
return null;
}
void show(Widget dialog) {
state = dialog;
}
void dismiss() {
state = null;
}
}
@Riverpod()
class BottomSheet extends _$BottomSheet {
@override
Sheet? build() {
//Don't use select here because it will only fire on new != previous
return ref.watch(createTabStreamProvider).valueOrNull;
}
void show(Sheet sheet) {
state = sheet;
}
void dismiss() {
state = null;
}
}
@Riverpod(keepAlive: true)
class BottomSheetExtend extends _$BottomSheetExtend {
late StreamController<double> _extentStreamController;
void add(double extent) {
_extentStreamController.add(extent);
}
@override
Stream<double> build() {
_extentStreamController = StreamController();
ref.onDispose(() async {
await _extentStreamController.close();
});
return _extentStreamController.stream
.sampleTime(const Duration(milliseconds: 50));
}
}
@Riverpod(keepAlive: true)
class SelectedBangTrigger extends _$SelectedBangTrigger {
void setTrigger(String trigger) {
@@ -143,65 +83,3 @@ 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;
}
}