improved tab handling by id

This commit is contained in:
Fabian Freund
2024-08-19 04:27:47 +02:00
parent a465195ec4
commit 23dad27d61
12 changed files with 78 additions and 40 deletions
@@ -23,7 +23,7 @@ class SwitchNewTabController extends _$SwitchNewTabController {
.read(webViewRepositoryProvider.notifier)
.addTab(WebView(tab: newTab));
ref.read(webViewTabControllerProvider.notifier).showTab(newTab.key);
ref.read(webViewTabControllerProvider.notifier).showTab(newTab.id);
},
);
}
@@ -7,7 +7,7 @@ part of 'switch_new_tab.dart';
// **************************************************************************
String _$switchNewTabControllerHash() =>
r'acc20371e95db182cfc5cdc924a289ff56981692';
r'a5b8f7fd71c8cb6cc2023b41504e5cd467c5b063';
/// See also [SwitchNewTabController].
@ProviderFor(SwitchNewTabController)
@@ -37,6 +37,8 @@ const _webViewSupportedSchemes = [
];
class WebView extends StatefulHookConsumerWidget {
final String tabId;
final ValueNotifier<WebViewPage> _pageNotifier;
final ValueNotifier<bool?> _isReaderable;
@@ -76,6 +78,7 @@ class WebView extends StatefulHookConsumerWidget {
: _pageNotifier = ValueNotifier(tab),
_isReaderable = ValueNotifier(null),
_readerableApplied = ValueNotifier(false),
tabId = tab.id,
super(key: tab.key);
@override
@@ -1,18 +1,17 @@
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/features/web_view/domain/entities/abstract/tab.dart';
import 'package:lensai/features/web_view/domain/repositories/web_view.dart';
import 'package:lensai/features/web_view/presentation/widgets/favicon.dart';
import 'package:lensai/features/web_view/presentation/widgets/web_view.dart';
class WebViewTab extends HookConsumerWidget {
final WebView webView;
final ITab tab;
final bool isActive;
final VoidCallback onClose;
const WebViewTab({
required this.webView,
required this.tab,
required this.isActive,
required this.onClose,
super.key,
@@ -20,10 +19,8 @@ class WebViewTab extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final colorScheme = Theme.of(context).colorScheme;
final page = useValueListenable(webView.page);
return Container(
key: UniqueKey(),
decoration: BoxDecoration(
border: Border.all(
color: isActive ? colorScheme.primary : colorScheme.outline,
@@ -38,8 +35,9 @@ class WebViewTab extends HookConsumerWidget {
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
onTap: () {
if (!isActive) {
ref.read(webViewTabControllerProvider.notifier).showTab(page.key);
//Close first to avoid rebuilds
onClose();
ref.read(webViewTabControllerProvider.notifier).showTab(tab.id);
} else {
onClose();
}
@@ -53,7 +51,7 @@ class WebViewTab extends HookConsumerWidget {
padding: const EdgeInsets.only(left: 6.0),
child: Text(
overflow: TextOverflow.ellipsis,
page.title ?? 'New Tab',
tab.title ?? 'New Tab',
maxLines: 2,
),
),
@@ -64,7 +62,7 @@ class WebViewTab extends HookConsumerWidget {
onPressed: () {
ref
.read(webViewRepositoryProvider.notifier)
.closeTab(page.key);
.closeTab(tab.id);
},
icon: const Icon(Icons.close),
),
@@ -76,14 +74,15 @@ class WebViewTab extends HookConsumerWidget {
width: 6.0,
),
FaviconImage(
webPageInfo: page,
url: tab.url,
favicon: tab.favicon,
),
const SizedBox(
width: 6.0,
),
Expanded(
child: Text(
page.url.authority,
tab.url.authority,
style: Theme.of(context).textTheme.bodySmall,
),
),
@@ -92,7 +91,7 @@ class WebViewTab extends HookConsumerWidget {
const SizedBox(
height: 6,
),
if (page.screenshot != null)
if (tab.screenshot != null)
Expanded(
child: ClipRRect(
borderRadius: const BorderRadius.only(
@@ -103,7 +102,7 @@ class WebViewTab extends HookConsumerWidget {
width: double.infinity,
child: Image.memory(
fit: BoxFit.fitWidth,
page.screenshot!,
tab.screenshot!,
),
),
),