From 90681fe2e98c0e13852b9c6136b112a6c78447d3 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Mon, 7 Jul 2025 22:55:15 +0200 Subject: [PATCH] refactor container assign logic --- .../tabs/domain/repositories/tab.dart | 35 +++++++++++++++--- .../tabs/domain/repositories/tab.g.dart | 2 +- .../presentation/screens/container_list.dart | 4 ++ .../presentation/widgets/container_chips.dart | 37 ++----------------- .../widgets/container_list_tile.dart | 7 ++-- 5 files changed, 42 insertions(+), 43 deletions(-) diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart index 9e099cef..81f585d0 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart @@ -1,16 +1,41 @@ +import 'package:nullability/nullability.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; +import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart'; +import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart'; part 'tab.g.dart'; @Riverpod(keepAlive: true) class TabDataRepository extends _$TabDataRepository { - Future assignContainer(String tabId, String? containerId) { - return ref - .read(tabDatabaseProvider) - .tabDao - .assignContainer(tabId, containerId: containerId); + Future assignContainer( + String tabId, + ContainerData targetContainer, + ) async { + final currentContainerId = await ref + .read(tabDataRepositoryProvider.notifier) + .containerTabId(tabId); + + final currentContainerData = await currentContainerId.mapNotNull( + (containerId) => ref + .read(containerRepositoryProvider.notifier) + .getContainerData(containerId), + ); + + if (targetContainer.metadata.contextualIdentity == + currentContainerData?.metadata.contextualIdentity) { + await ref + .read(tabDatabaseProvider) + .tabDao + .assignContainer(tabId, containerId: targetContainer.id); + } else { + await ref + .read(tabRepositoryProvider.notifier) + .duplicateTab(selectTabId: tabId, containerId: targetContainer.id); + + await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); + } } Future assignOrderKey(String tabId, String orderKey) { diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart index 7de2c49b..f76fa69b 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabDataRepositoryHash() => r'0de1de9f948e38cc0a6d2fc18a06b1327d41c7ca'; +String _$tabDataRepositoryHash() => r'15be3ca749b329c293e8e18c61d6ed92e4979072'; /// See also [TabDataRepository]. @ProviderFor(TabDataRepository) diff --git a/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart b/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart index ad5ed52b..787b951b 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart @@ -108,6 +108,9 @@ class ContainerListScreen extends HookConsumerWidget { child: ContainerListTile( container, isSelected: container.id == selectedContainer, + onTap: () async { + await ContainerEditRoute(container).push(context); + }, ), ); }, @@ -119,6 +122,7 @@ class ContainerListScreen extends HookConsumerWidget { itemCount: 3, itemBuilder: (context, index) => ContainerListTile( ContainerData(id: 'null', color: Colors.transparent), + onTap: null, isSelected: false, ), ), diff --git a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart index 26ca2854..e0165929 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart @@ -6,10 +6,8 @@ import 'package:nullability/nullability.dart'; import 'package:weblibre/core/providers/global_drop.dart'; import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/data/models/drag_data.dart'; -import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'; -import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart'; import 'package:weblibre/presentation/widgets/selectable_chips.dart'; @@ -103,40 +101,13 @@ class ContainerChips extends HookConsumerWidget { overlayController.hide(); }, onAcceptWithDetails: (details) async { - final containerId = await ref + await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(details.data.tabId); - - final containerData = await containerId - .mapNotNull( - (containerId) => ref - .read( - containerRepositoryProvider.notifier, - ) - .getContainerData(containerId), + .assignContainer( + details.data.tabId, + container, ); - if (container.metadata.contextualIdentity == - containerData?.metadata.contextualIdentity) { - await ref - .read(tabDataRepositoryProvider.notifier) - .assignContainer( - details.data.tabId, - container.id, - ); - } else { - await ref - .read(tabRepositoryProvider.notifier) - .duplicateTab( - selectTabId: details.data.tabId, - containerId: container.id, - ); - - await ref - .read(tabRepositoryProvider.notifier) - .closeTab(details.data.tabId); - } - dragTargetTabId.value = null; overlayController.hide(); }, diff --git a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart index 0794c325..898d77e1 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart @@ -1,14 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; class ContainerListTile extends HookWidget { final ContainerData container; + final GestureTapCallback? onTap; final bool isSelected; const ContainerListTile( this.container, { + required this.onTap, required this.isSelected, super.key, }); @@ -22,9 +23,7 @@ class ContainerListTile extends HookWidget { selected: isSelected, leading: CircleAvatar(backgroundColor: container.color), title: Text(container.name ?? 'New Container'), - onTap: () async { - await ContainerEditRoute(container).push(context); - }, + onTap: onTap, trailing: const Icon(Icons.chevron_right), ), );