Skip to content

Commit 0d35359

Browse files
committed
site assign context menu
1 parent a8e0c07 commit 0d35359

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import 'package:flutter/services.dart';
2424
import 'package:flutter_hooks/flutter_hooks.dart';
2525
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
2626
import 'package:hooks_riverpod/hooks_riverpod.dart';
27+
import 'package:nullability/nullability.dart';
2728
import 'package:share_plus/share_plus.dart';
2829
import 'package:weblibre/core/routing/routes.dart';
2930
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart';
@@ -35,6 +36,7 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/dialog
3536
import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart';
3637
import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart';
3738
import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart';
39+
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
3840
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
3941
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart';
4042
import '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),

app/lib/features/geckoview/features/tabs/domain/providers.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import 'package:nullability/nullability.dart';
2121
import 'package:riverpod/riverpod.dart';
2222
import 'package:riverpod_annotation/riverpod_annotation.dart';
23+
import 'package:weblibre/features/geckoview/domain/entities/states/tab.dart';
24+
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
2325
import 'package:weblibre/features/geckoview/features/tabs/data/database/definitions.drift.dart';
2426
import 'package:weblibre/features/geckoview/features/tabs/data/entities/container_filter.dart';
2527
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
@@ -124,3 +126,18 @@ Stream<String?> watchContainerTabId(Ref ref, String tabId) {
124126
Stream<List<SiteAssignment>> watchAllAssignedSites(Ref ref) {
125127
return ref.read(tabDatabaseProvider).containerDao.allAssignedSites().watch();
126128
}
129+
130+
@Riverpod()
131+
Stream<bool> watchIsCurrentSiteAssignedToContainer(Ref ref) {
132+
final currentUri = ref.watch(
133+
selectedTabStateProvider.select(
134+
(value) => value?.url ?? TabState.$default('').url,
135+
),
136+
);
137+
138+
return ref
139+
.read(tabDatabaseProvider)
140+
.containerDao
141+
.isSiteAssignedToContainer(currentUri)
142+
.watchSingle();
143+
}

app/lib/features/geckoview/features/tabs/domain/providers.g.dart

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)