'NGXS: Update deep level nested array state

So I have the following state:

[
   {
      name: "Main Tree",
      branches: [
        {
          name: "Branch 1",
          branches: []
        },
        {
          name: "Branch 2",
          branches: [
            {
              name: "Sub Branch 1",
              branches: []
            }
          ]
        }
      ]
   }
]

My question is, how do I append another branch under the branches in Sub Branch 1 using state operators? I tried the solution on this link (State Operators) but it converts the data from array into object which is not the desired output.

Also the above scenario is just an example, my use-case is that it could be an infinite level of sub branches with branches inside them.

Thank you in advance.



Solution 1:[1]

This should work for the above example:

// import { append, patch, updateItem } from '@ngxs/store/operators';

interface BranchTree {
  name: string;
  branches: BranchTree[];
}

type BranchStateModel = Array<BranchTree>;

//..
@Action(UpdateSubBranch)
updateSubBranch({ setState }: StateContext<BranchStateModel>) {
  const newBranch: BranchTree = {
    name: 'Sub 1 of Sub Branch 1',
    branches: [],
  };
  setState(
    updateItem(
      (branch) => branch.name === 'Main Tree',
      patch({
        branches: updateItem<BranchTree>(
          (subBranch) => subBranch.name === 'Branch 2',
          patch({
            branches: updateItem<BranchTree>(
              (subBranch) => subBranch.name === 'Sub Branch 1',
              patch({ branches: append([newBranch]) })
            ),
          })
        ),
      })
    )
  );
}

However, you need to implement your recursive solution for the infinite tree based on the above solution.

Read more about NGXS State Operators here: https://www.ngxs.io/v/v3.7/advanced/operators

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1