intermediate

This commit is contained in:
Fabian Freund
2024-12-12 09:44:33 +01:00
parent 0710116feb
commit 6b2ae28828
108 changed files with 5531 additions and 2265 deletions
@@ -7,7 +7,7 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/data/models/web_page_info.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/domain/providers.dart';
import 'package:lensai/features/bangs/domain/providers/bangs.dart';
import 'package:lensai/features/bangs/presentation/widgets/site_search.dart';
import 'package:lensai/features/geckoview/domain/providers.dart';
import 'package:lensai/features/geckoview/domain/providers/tab_session.dart';
@@ -92,7 +92,7 @@ class WebPageDialog extends HookConsumerWidget {
onPressed: () async {
if (formKey.currentState?.validate() ?? false) {
await ref
.read(tabSessionProvider(null).notifier)
.read(tabSessionProvider(tabId: null).notifier)
.loadUrl(
url: uri_parser.tryParseUrl(
urlTextController.text,
@@ -19,6 +19,7 @@ import 'package:lensai/features/geckoview/features/browser/domain/services/engin
import 'package:lensai/features/geckoview/features/browser/presentation/dialogs/web_page_dialog.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/app_bar_title.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/browser_view.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/sheets/create_tab.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/sheets/view_tabs.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart';
@@ -47,6 +48,9 @@ class BrowserScreen extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
//Init here to avoid dispose errors of menu items when called
final addonService = ref.watch(addonServiceProvider);
final displayedSheet = ref.watch(bottomSheetControllerProvider);
final displayedOverlayDialog = ref.watch(overlayDialogControllerProvider);
@@ -186,14 +190,15 @@ class BrowserScreen extends HookConsumerWidget {
color: (activeTool == KagiTool.search)
? Theme.of(context).colorScheme.primary
: null,
onPressed: () {
ref
.read(createTabStreamProvider.notifier)
.createTab(
CreateTabSheet(
preferredTool: KagiTool.search,
),
);
onPressed: () async {
// ref
// .read(createTabStreamProvider.notifier)
// .createTab(
// CreateTabSheet(
// preferredTool: KagiTool.search,
// ),
// );
await context.push(SearchRoute().location);
},
icon: Icon(KagiTool.search.icon),
),
@@ -337,30 +342,12 @@ class BrowserScreen extends HookConsumerWidget {
(extension) => IconButton(
onPressed: () async {
//Use parents .ref because after onPressed this consumer gets disposed already
await ref
.read(addonServiceProvider)
.invokeAddonAction(
extension.extensionId,
WebExtensionActionType.page,
);
await addonService.invokeAddonAction(
extension.extensionId,
WebExtensionActionType.page,
);
},
icon: Badge(
isLabelVisible:
extension.badgeText?.isNotEmpty ??
false,
label: (extension.badgeText?.isNotEmpty ==
true)
? Text(extension.badgeText!)
: null,
textColor: extension.badgeTextColor,
backgroundColor:
extension.badgeBackgroundColor,
child: RawImage(
image: extension.icon?.value,
width: 24,
height: 24,
),
),
icon: ExtensionBadgeIcon(extension),
),
),
],
@@ -383,8 +370,8 @@ class BrowserScreen extends HookConsumerWidget {
child: const Text('Settings'),
),
Consumer(
builder: (context, childRef, child) {
final browserExtensions = childRef.watch(
builder: (context, ref, child) {
final browserExtensions = ref.watch(
webExtensionsStateProvider(
WebExtensionActionType.browser,
).select((value) => value.values.toList()),
@@ -396,24 +383,18 @@ class BrowserScreen extends HookConsumerWidget {
(extension) => MenuItemButton(
onPressed: () async {
//Use parents .ref because after onPressed this consumer gets disposed already
await ref
.read(addonServiceProvider)
.invokeAddonAction(
extension.extensionId,
WebExtensionActionType.browser,
);
await addonService.invokeAddonAction(
extension.extensionId,
WebExtensionActionType.browser,
);
},
leadingIcon: RawImage(
image: extension.icon?.value,
width: 24,
height: 24,
),
leadingIcon: ExtensionBadgeIcon(extension),
child: Text(extension.title ?? ''),
),
),
MenuItemButton(
onPressed: () async {
await childRef
await ref
.read(addonServiceProvider)
.startAddonManagerActivity();
},
@@ -530,7 +511,8 @@ class BrowserScreen extends HookConsumerWidget {
MenuItemButton(
onPressed: () async {
final controller = ref.read(
tabSessionProvider(selectedTabId).notifier,
tabSessionProvider(tabId: selectedTabId)
.notifier,
);
await controller.reload();
@@ -556,7 +538,7 @@ class BrowserScreen extends HookConsumerWidget {
onPressed: () async {
final controller = ref.read(
tabSessionProvider(
selectedTabId,
tabId: selectedTabId,
).notifier,
);
@@ -588,7 +570,7 @@ class BrowserScreen extends HookConsumerWidget {
? () async {
final controller = ref.read(
tabSessionProvider(
selectedTabId,
tabId: selectedTabId,
).notifier,
);
@@ -664,7 +646,7 @@ class BrowserScreen extends HookConsumerWidget {
lastBackButtonPress.value = null;
final controller = ref.read(
tabSessionProvider(selectedTabId).notifier,
tabSessionProvider(tabId: selectedTabId).notifier,
);
await controller.goBack();
@@ -7,6 +7,7 @@ import 'package:lensai/core/logger.dart';
import 'package:lensai/features/geckoview/domain/providers.dart';
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';
class BrowserView extends StatefulHookConsumerWidget {
final Duration screenshotPeriod;
@@ -84,6 +85,8 @@ class _BrowserViewState extends ConsumerState<BrowserView>
WidgetsBinding.instance.addObserver(this);
//Initialize and register dependencies
ref.listenManual(tabRepositoryProvider, (previous, next) {});
ref.listenManual(
selectionActionServiceProvider,
(previous, next) {},
@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:lensai/features/geckoview/domain/entities/web_extension_state.dart';
class ExtensionBadgeIcon extends StatelessWidget {
final WebExtensionState state;
const ExtensionBadgeIcon(this.state);
@override
Widget build(BuildContext context) {
final hasBadge = state.badgeText?.isNotEmpty ?? false;
return Badge(
isLabelVisible: hasBadge,
label: hasBadge ? Text(state.badgeText!) : null,
textColor: state.badgeTextColor,
backgroundColor: state.badgeBackgroundColor,
child: RawImage(
image: state.icon?.value,
width: 24,
height: 24,
),
);
}
}
@@ -67,7 +67,31 @@ class _SliverHeaderDelagate extends SliverPersistentHeaderDelegate {
),
],
),
ContainerChips(),
Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Consumer(
builder: (context, ref, child) {
final selectedContainer = ref.watch(
selectedContainerDataProvider
.select((value) => value.valueOrNull),
);
return ContainerChips(
selectedContainer: selectedContainer,
onSelected: (container) {
ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
},
onDeleted: (container) async {
ref
.read(selectedContainerProvider.notifier)
.clearContainer();
},
);
},
),
),
const SizedBox(height: 8),
],
),