/* eslint-disable
jsx-a11y/click-events-have-key-events,
jsx-a11y/no-noninteractive-element-interactions */
import { useStaticQuery, graphql, Link } from 'gatsby';
import React from 'react';
import './LeftNav.scss';
const { v4: uuidv4 } = require('uuid');
let slugs;
class ListItem extends React.Component {
constructor(props) {
super(props);
const { data, isRoot, identifier } = this.props;
this.state = {
data,
isRoot,
identifier,
active: [],
currentUrl: '',
expandedPanels: [],
};
this.toggleActive = this.toggleActive.bind(this);
this.toggleExpansion = this.toggleExpansion.bind(this); // Bind toggleExpansion method
}
componentDidMount() {
this.setState({ currentUrl: window.location.pathname });
}
setActive = (name) => {
const {active, expandedPanels} = this.state;
if (active.indexOf(name) === -1) {
this.setState((prev) => ({active: [...prev.active, name]}));
if (!expandedPanels.includes(name)) { // Check if name is already in expandedPanels
this.setState((prev) => ({expandedPanels: [...prev.expandedPanels, name]}));
}
}
};
toggleExpansion(identifier) {
const { expandedPanels } = this.state;
if (expandedPanels.includes(identifier)) {
const updatedExpandedPanels = expandedPanels.filter((panel) => panel !== identifier);
this.setState({ expandedPanels: updatedExpandedPanels });
} else {
this.setState((prev) => ({ expandedPanels: [...prev.expandedPanels, identifier] }));
}
}
toggleActive = (e) => {
let title;
if (e.target.attributes.identifier) {
title = e.target.attributes.identifier.value;
} else if (e.target.nextSibling?.attributes.identifier) {
title = e.target.nextSibling.attributes.identifier.value;
}
const { active } = this.state;
const titleIndex = active.indexOf(title);
if (titleIndex !== -1) {
active.splice(titleIndex, 1);
this.setState({ active });
} else {
this.setActive(title);
}
} // toggles list item as active or inactive based on previous state. Triggered on click
isActive = (name) => {
const { active } = this.state;
return active.includes(name);
}
inUrl = (url) => {
const { currentUrl } = this.state;
return currentUrl.includes(url);
}
child = (data, url) => {
const name = slugs.filter((val) => url === val.fields.slug);
const { title } = name[0].frontmatter;
return ( url.indexOf("/overview/") === -1 &&
{data.leftNavTitle || title}
);
} // Renders child element. Gets name from slugs array
parent = (data, name) => {
const { active, isRoot } = this.state;
if (this.inUrl(`/${name}/`)) {
this.setActive(name);
}
// Appending overview page link to Parent node (which has arrow icon with title)
// Instead of having overview as a separate link.
let overviewLink = null;
Object.keys(data).reverse().map(key => {
if (data.hasOwnProperty('overview')) {
if (data['overview'].url.indexOf(`/${name}/overview/`) !== -1)
overviewLink = data['overview'].url;
}
else if (data[key].hasOwnProperty('overview')) {
if (data[key]['overview'].url.indexOf(`/${name}/overview/`) !== -1)
overviewLink = data[key]['overview'].url;
} else {
overviewLink = data [key].url;
if(overviewLink == undefined){
if(key != "leftNavTitle")
overviewLink = data [key] [Object.keys(data [key])[0]].url;
else
overviewLink = data[Object.keys(data).reverse()[0]].url;
}
}
})
return (
-
{ overviewLink && ({ data.leftNavTitle || name.replace(/-/g, ' ')} ) }
{ !overviewLink && ()}
);
} // renders parent element that has children
render() {
const { data } = this.state;
const parsedData = JSON.parse(data);
const keys = Object.keys(JSON.parse(data)).map((val) => val);
return (
<>
{keys.map((val) => {
if(val !== 'leftNavTitle' && val !== "old") {
if (parsedData[val].url) {
return this.child(parsedData[val], parsedData[val].url);
}
return this.parent(parsedData[val], val);
}
})}
>
);
}
}
const LeftNav = () => {
const data = useStaticQuery(graphql`
query {
allMarkdownRemark(sort: {fields: id, order: ASC}) {
nodes {
fields {
slug
}
frontmatter {
title
}
id
}
},
leftNavLinks {
value
}
}`);
slugs = data.allMarkdownRemark.nodes;
return (
<>
>
);
};
export default LeftNav;
/* eslint-enable */