filteredTree2 function
Implementation
@Riverpod(dependencies: [tree2, ComponentTreeNotifier])
List<TreeViewNode<ElementNode>> filteredTree2(Ref ref) {
final tree = ref.watch(tree2Provider);
final originalTree = ref.watch(componentTreeNotifierProvider);
final query = ref.watch(searchQueryProvider);
final selectedTags = ref.watch(tagFilterProvider);
if (query.isEmpty && selectedTags.isEmpty) return tree;
final root = filterTree(
originalTree,
(node) {
bool condition = true;
if (selectedTags.isNotEmpty) {
switch (node.data.data) {
case StoryNode(story: Story(:final tags)):
case ComponentNode(component: Component(meta: Meta(:final tags))):
condition = tags.isNotEmpty &&
tags.toSet().intersection(selectedTags).isNotEmpty;
default:
condition = true;
}
}
if (query.trim().isNotEmpty) {
condition &= node.data.title //
.toLowerCase()
.contains(query.toLowerCase());
}
return condition;
},
);
List<TreeViewNode<ElementNode>> getNodes(List<Tree> tree) {
return [
for (final node in tree)
TreeViewNode(
node.data.data,
children: getNodes(node.children),
expanded: node.data.isExpanded,
),
];
}
return getNodes(root?.children ?? []);
}