filteredTree function

  1. @Riverpod(dependencies: [ComponentTreeNotifier])
Tree? filteredTree(
  1. Ref ref
)

Implementation

@Riverpod(dependencies: [ComponentTreeNotifier])
Tree? filteredTree(Ref ref) {
  final tree = ref.watch(componentTreeNotifierProvider);
  final query = ref.watch(searchQueryProvider);
  final selectedTags = ref.watch(tagFilterProvider);

  if (query.isEmpty && selectedTags.isEmpty) return tree;

  return filterTree(
    tree,
    (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;
    },
  );
}