Gatsby function returns undefined

Andreas

I have a file where I try to determine which data should be used in a Gatsby template. I get an array that contains child pages in return, these child pages may contain other child pages. I want to support up to three levels of child pages.

I have a template where I use my paginator (component to find the correct pages), I look for correct pages to render bypassing the slug via pageContext from gatsby-node.js

Template (minus imports)

const projectsSubPages = ({ data, pageContext }) => {
  return (
    <Layout>
      <Menu parentPage={pageContext.parentSlug} />

      {data.allSanityProjects.edges.map((childNode) =>
        <>
          {childNode.node.childPages.length > 0 &&
            <Paginator
              pageData={childNode.node.childPages}
              parentPage={pageContext.parentSlug}
              key={childNode.node._id}
            />
          }
        </>
      )}
    </Layout>
  );
};

export const query = graphql`
{
  allSanityProjects {
    edges {
      node {
        childPages {
          _rawBlockContent
          title
          slug
          childPages {
            slug
            title
            childPages {
              title
              slug
              childPages {
                slug
                title
                _key
              }
              _key
            }
            _key
          }
          _key
        }
        _key
      }
    }
  }
}

`;

export default projectsSubPages;

My paginator component (minus imports)

   const subPageLevelFinder = ({ pageData, parentPage }) => {

  const SubLevels = () => {
    let pageLevel = "test";

    if (pageData.slug === parentPage) {
      pageLevel = pageData.slug
    }
    if (pageData.childPages && pageData.childPages.length > 0) {
      pageData.childPages.map((secondLevel) => {
        if (secondLevel.slug === parentPage) {
          pageLevel = secondLevel.slug
          return (pageLevel)
        } else if (pageData.childPages.childPage && pageData.childPages.childPages.length > 0) {
          secondLevel.childPages.map((thirdLevel) => {
            if (thirdLevel.slug === parentPage) {
              pageLevel = thirdLevel.slug
              return (pageLevel)
            }
          })
        } else {
          return (
          pageLevel = "No page level found"
          )
        }
      

      })
    }
    return (
      pageLevel
    )

  }

  return (
    <>
        {console.log(SubLevels())}
        {SubLevels()}
    </>
  )
};

See this gist for the return of the GraphQL query and gatsby-node.js https://gist.github.com/AndreasJacobsen/371faf073a1337b6879e4fd6b860b26f

My goal is to run a component that has a template in my paginator and passing the data this template should use from the SubLevels function, but this function returns the first set let value every time. So all of my if-statements fail, I can't figure out where the issue is, I've tried changing the if parameters several times, but this seems to fit the GraphQL query

Andreas

It turns out that the error came from my trying to access array elements in a multi dimentional array.

So the array I got back had three elements, all with a slug. I tried to access the slug but in order to get that slug I had to loop through the elements.

See attached solution that works (but is not very efficient), notice that this solution has a map function at the very top level; this solved the issue.

import React from "react";
import SubPageTemplate from "./subPageTemplate";
import { Link } from "gatsby";

import { useStaticQuery, graphql } from "gatsby";

const BlockContent = require("@sanity/block-content-to-react");

const subPageLevelFinder = ({ pageData, parentPage, childSlug }) => {
  const subLevels = () => {
    let pageLevel = null;
    pageData.map((mappedData) => {
      if (mappedData.slug === childSlug) {
        pageLevel = mappedData;
        return pageLevel;
      } else {
        if (mappedData.childPages && mappedData.childPages.length > 0) {
          if (mappedData.slug === childSlug) {
            return (pageLevel = mappedData);
          } else {
            mappedData.childPages.map((secondLevel) => {
              if (secondLevel.slug === childSlug) {
                pageLevel = secondLevel;
                return pageLevel;
              } else if (
                mappedData.childPages.childPage &&
                mappedData.childPages.childPages.length > 0
              ) {
                secondLevel.childPages.map((thirdLevel) => {
                  if (thirdLevel.slug === childSlug) {
                    pageLevel = thirdLevel;
                    return pageLevel;
                  }
                });
              }
            });
          }
        } else {
          return false;
        }
      }
    });

    return pageLevel;
  };

  return <>{subLevels() && <SubPageTemplate pageLevel={subLevels()} />}</>;
};

export default subPageLevelFinder;

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related