filteredTree2 function

  1. @Riverpod(dependencies: [tree2, ComponentTreeNotifier])
List<TreeViewNode<ElementNode>> filteredTree2(
  1. Ref ref
)

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 ?? []);
}