container chip for unassigned

This commit is contained in:
Fabian Freund
2025-07-21 23:09:16 +02:00
parent 6ffc9479c0
commit 4c4c7153d3
3 changed files with 57 additions and 11 deletions
@@ -205,15 +205,21 @@ class _TabSheetHeader extends HookConsumerWidget {
return ContainerChips(
selectedContainer: selectedContainer,
onSelected: (container) async {
final result = await ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
if (container != null) {
final result = await ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
if (context.mounted &&
result == SetContainerResult.successHasProxy) {
await ref
.read(startProxyControllerProvider.notifier)
.maybeStartProxy(context);
if (context.mounted &&
result == SetContainerResult.successHasProxy) {
await ref
.read(startProxyControllerProvider.notifier)
.maybeStartProxy(context);
}
} else {
ref
.read(selectedContainerProvider.notifier)
.clearContainer();
}
},
onDeleted: (container) {
@@ -1,11 +1,13 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
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/features/tabs/data/entities/container_filter.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/tab.dart';
@@ -17,7 +19,7 @@ class ContainerChips extends HookConsumerWidget {
final ContainerData? selectedContainer;
final bool Function(ContainerDataWithCount)? containerFilter;
final void Function(ContainerDataWithCount)? onSelected;
final void Function(ContainerDataWithCount?)? onSelected;
final void Function(ContainerDataWithCount)? onDeleted;
final ValueListenable<TextEditingValue>? searchTextListenable;
@@ -149,6 +151,35 @@ class ContainerChips extends HookConsumerWidget {
},
);
},
prefixListItems: [
Consumer(
builder: (context, ref, child) {
final tabCount = ref.watch(
containerTabCountProvider(
// ignore: provider_parameters
ContainerFilterById(containerId: null),
).select((value) => value.valueOrNull ?? 0),
);
return FilterChip(
avatar: const Icon(MdiIcons.folderHidden),
labelPadding: (tabCount > 0)
? null
: const EdgeInsets.only(right: 2.0),
label: (tabCount > 0)
? Text(tabCount.toString())
: const SizedBox.shrink(),
selected: selectedContainer == null,
showCheckmark: false,
onSelected: (value) {
if (value) {
onSelected?.call(null);
}
},
);
},
),
],
availableItems: availableContainers,
selectedItem: selectedContainer,
onSelected: onSelected,
@@ -22,6 +22,7 @@ class _BadgeWrapper extends StatelessWidget {
class SelectableChips<T extends S, S, K> extends StatelessWidget {
final List<T> availableItems;
final List<Widget> prefixListItems;
final S? selectedItem;
final int maxCount;
final bool deleteIcon;
@@ -44,6 +45,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
this.itemBadgeCount,
this.itemWrap,
this.itemTooltip,
this.prefixListItems = const [],
required this.availableItems,
this.selectedItem,
this.maxCount = 25,
@@ -75,9 +77,16 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
//Improve list performance by not rendering outside screen at all
cacheExtent: 0,
scrollDirection: Axis.horizontal,
itemCount: items.length,
itemCount: prefixListItems.length + items.length,
itemBuilder: (context, index) {
final item = items[index];
if (index < prefixListItems.length) {
return Padding(
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
child: prefixListItems[index],
);
}
final item = items[index - prefixListItems.length];
final child = Padding(
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
child: _BadgeWrapper(