diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index c8ca502b..e0604553 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -144,7 +144,7 @@ class TabRepository extends _$TabRepository { final unassignedTabs = await ref .read(containerRepositoryProvider.notifier) - .getContainerTabIds(currentContainerId); + .getContainerTabIds(null); if (unassignedTabs.isNotEmpty) { return _tabsService.selectTab(tabId: unassignedTabs.first); diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index 2f2366a8..a383722e 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabRepositoryHash() => r'a798385b50c101e41b9789e92181cbd5b6188246'; +String _$tabRepositoryHash() => r'10768bd2c880edd40f82ed49532d9e2e2043e61f'; /// See also [TabRepository]. @ProviderFor(TabRepository) diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/app_bar_title.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/app_bar_title.dart index 4d40cad4..4c8cd022 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/app_bar_title.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/app_bar_title.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:lensai/features/geckoview/domain/entities/states/tab.dart'; +import 'package:lensai/features/geckoview/features/browser/presentation/widgets/tab_icon.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:text_scroll/text_scroll.dart'; @@ -45,13 +46,7 @@ class AppBarTitle extends StatelessWidget { onLongPress: onLongPress, child: Row( children: [ - Skeletonizer( - enabled: tab.icon == null, - child: Skeleton.replace( - replacement: const Bone.icon(size: 16), - child: RawImage(image: tab.icon?.value, height: 16, width: 16), - ), - ), + TabIcon(state: tab), const SizedBox(width: 8), Expanded( child: Column( diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_icon.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_icon.dart new file mode 100644 index 00000000..24d0a78b --- /dev/null +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_icon.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:lensai/domain/services/generic_website.dart'; +import 'package:lensai/features/geckoview/domain/entities/states/tab.dart'; +import 'package:lensai/presentation/hooks/cached_future.dart'; +import 'package:skeletonizer/skeletonizer.dart'; + +class TabIcon extends HookConsumerWidget { + final TabState state; + + final double iconSize; + + const TabIcon({super.key, required this.state, this.iconSize = 16}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final icon = useCachedFuture(() async { + if (state.icon != null) { + return state.icon!.value; + } + + final icon = await ref + .read(genericWebsiteServiceProvider.notifier) + .getCachedIcon(state.url); + + return icon?.image.value; + }); + + return Skeletonizer( + enabled: + icon.connectionState != ConnectionState.done && icon.data == null, + child: Skeleton.replace( + replacement: Bone.icon(size: iconSize), + child: RawImage(image: icon.data, height: iconSize, width: iconSize), + ), + ); + } +} diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart index 1d4a47b7..1086a5fb 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart @@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:lensai/features/geckoview/domain/entities/states/tab.dart'; import 'package:lensai/features/geckoview/domain/providers/tab_state.dart'; import 'package:lensai/features/geckoview/domain/repositories/tab.dart'; +import 'package:lensai/features/geckoview/features/browser/presentation/widgets/tab_icon.dart'; class TabPreview extends StatelessWidget { final TabState tab; @@ -66,7 +67,7 @@ class TabPreview extends StatelessWidget { Row( children: [ const SizedBox(width: 6.0), - RawImage(image: tab.icon?.value, height: 16, width: 16), + TabIcon(state: tab), const SizedBox(width: 6.0), Expanded( child: Text(