@@ -24,6 +24,7 @@ import 'package:flutter/services.dart';
2424import 'package:flutter_hooks/flutter_hooks.dart' ;
2525import 'package:flutter_material_design_icons/flutter_material_design_icons.dart' ;
2626import 'package:hooks_riverpod/hooks_riverpod.dart' ;
27+ import 'package:nullability/nullability.dart' ;
2728import 'package:share_plus/share_plus.dart' ;
2829import 'package:weblibre/core/routing/routes.dart' ;
2930import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart' ;
@@ -35,6 +36,7 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/dialog
3536import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart' ;
3637import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart' ;
3738import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart' ;
39+ import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart' ;
3840import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart' ;
3941import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart' ;
4042import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart' ;
@@ -214,6 +216,50 @@ class TabMenu extends HookConsumerWidget {
214216 }
215217 },
216218 ),
219+ Consumer (
220+ child: MenuItemButton (
221+ leadingIcon: const Icon (MdiIcons .webPlus),
222+ child: const Text ('Assign Site to Container' ),
223+ onPressed: () async {
224+ final targetContainerId = await ContainerSelectionRoute ()
225+ .push <String ?>(context);
226+
227+ if (targetContainerId != null ) {
228+ final containerData = await ref
229+ .read (containerRepositoryProvider.notifier)
230+ .getContainerData (targetContainerId);
231+
232+ if (containerData != null ) {
233+ final tabState = ref.read (tabStateProvider (selectedTabId));
234+ final origin = tabState? .url.origin.mapNotNull (Uri .parse);
235+
236+ if (origin != null ) {
237+ await ref
238+ .read (containerRepositoryProvider.notifier)
239+ .replaceContainer (
240+ containerData.copyWith.metadata (
241+ containerData.metadata.copyWith.assignedSites ([
242+ ...? containerData.metadata.assignedSites,
243+ origin,
244+ ]),
245+ ),
246+ );
247+ }
248+ }
249+ }
250+ },
251+ ),
252+ builder: (context, ref, child) {
253+ final isSiteAssigned = ref.watch (
254+ watchIsCurrentSiteAssignedToContainerProvider,
255+ );
256+
257+ return Visibility (
258+ visible: isSiteAssigned.hasValue && ! isSiteAssigned.requireValue,
259+ child: child! ,
260+ );
261+ },
262+ ),
217263 Consumer (
218264 child: MenuItemButton (
219265 leadingIcon: const Icon (MdiIcons .folderCancelOutline),
0 commit comments