import { useEffect, useState } from 'react';
import { v4 as uuidv4 } from 'uuid';
import { useLocation, NavLink } from 'react-router-dom';
import styles from './AppMenu.module.scss';
import { Pane } from '@cybercongress/gravity';
import cx from 'classnames';
import { MenuItem, MenuItems } from 'src/containers/application/AppMenu';

interface Props {
  item: MenuItem | MenuItem['subItems'][0];
  selected: boolean;
  onClick: () => void;
}

function Items({ item, selected, onClick }: Props) {
  return (
    <NavLink
      to={item.to}
      className={() => {
        return cx(styles.bookmarks__item, { [styles.active]: selected });
      }}
      onClick={onClick}
    >
      <Pane display="flex" paddingY={5} alignItems="center" key={item.name}>
        <div
          style={{
            display: 'grid',
            gridTemplateColumns: '30px 1fr',
            gap: 10,
            alignItems: 'center',
            paddingLeft: 15,
          }}
        >
          {item.icon && (
            <img
              src={item.icon}
              style={{ width: 30, height: 30, objectFit: 'contain' }}
              alt="img"
            />
          )}
          <Pane
            alignItems="center"
            whiteSpace="nowrap"
            flexGrow={1}
            fontSize={18}
            display="flex"
          >
            {item.name}
          </Pane>
        </div>
      </Pane>
    </NavLink>
  );
}

const renderSubItems = (
  subItems: MenuItem['subItems'],
  location,
  onClickSubItem
) => {
  return subItems.map((itemSub) => {
    return (
      <Items
        selected={itemSub.to === location.pathname}
        key={itemSub.name}
        item={itemSub}
        onClick={() => onClickSubItem(itemSub.name)}
      />
    );
  });
};

// eslint-disable-next-line import/prefer-default-export
export function Bookmarks({
  items,
  closeMenu,
}: {
  items: MenuItems;
  closeMenu: () => void;
}) {
  const [selectedItem, setSelectedItem] = useState<string>('');
  const [selectedItemSub, setSelectedItemSub] = useState<string>('');
  const location = useLocation();

  function onClickItem(itemKey: MenuItem['name']) {
    setSelectedItem(itemKey);
    setSelectedItemSub('');

    const item = items.find((item) => item.name === itemKey);

    if (item && item.subItems.length === 0) {
      closeMenu();
    }
  }

  function onClickSubItem(itemKey: string) {
    setSelectedItemSub(itemKey);
    closeMenu();
  }

  useEffect(() => {
    setSelectedItemSub('');
  }, [selectedItem]);

  return (
    <div className={styles.bookmarks}>
      {items.map((item) => {
        const key = uuidv4();
        return (
          <div key={key}>
            <Items
              selected={
                (item.to === location.pathname && selectedItemSub === '') ||
                // maybe refactor robot url check
                (item.to === '/robot' &&
                  (location.pathname.includes('@') ||
                    location.pathname.includes('neuron/')))
                // item.active === undefined
              }
              item={item}
              onClick={() => onClickItem(item.name)}
            />
            {item.name === selectedItem && (
              <Pane paddingLeft={50}>
                {renderSubItems(item.subItems, location, onClickSubItem)}
              </Pane>
            )}
          </div>
        );
      })}
    </div>
  );
}

Synonyms

pussy-ts/src/containers/application/AppMenu.tsx

Neighbours