intermediate
This commit is contained in:
+2
-2
@@ -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,
|
||||
|
||||
+31
-49
@@ -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) {},
|
||||
|
||||
+25
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
+25
-1
@@ -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),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user