Bin
2025-12-17 05a69820e0c402b0b33c063d3b922f0a0571cbbb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { useEffect, useState } from "react";
import { NavLink } from "react-router-dom";
import { useConfig } from "../../providers/ConfigProvider";
import { useBreadcrumbs, useFindRouteComponent } from "../../providers/RoutesProvider";
import { cn } from "../../utils/bem";
import { absoluteURL } from "../../utils/helpers";
import { Dropdown } from "@humansignal/ui";
import { Menu } from "../Menu/Menu";
import "./Breadcrumbs.scss";
 
export const Breadcrumbs = () => {
  const config = useConfig();
  const reactBreadcrumbs = useBreadcrumbs();
  const findComponent = useFindRouteComponent();
  const [breadcrumbs, setBreadcrumbs] = useState(reactBreadcrumbs);
 
  useEffect(() => {
    if (reactBreadcrumbs.length) {
      setBreadcrumbs(reactBreadcrumbs);
    } else if (config.breadcrumbs) {
      setBreadcrumbs(config.breadcrumbs);
    }
  }, [reactBreadcrumbs, config]);
 
  return (
    <div className={cn("breadcrumbs").toClassName()}>
      <ul className={cn("breadcrumbs").elem("list").toClassName()}>
        {breadcrumbs.map((item, index, list) => {
          const isLastItem = index === list.length - 1;
 
          const key = `item-${index}-${item.title}`;
 
          const href = item.href ?? item.path;
 
          const isInternal = findComponent(href) !== null;
 
          const title = (
            <span
              className={cn("breadcrumbs")
                .elem("label")
                .mod({ faded: index === item.length - 1 })
                .toClassName()}
            >
              {item.title}
            </span>
          );
 
          const dropdownSubmenu = item.submenu ? (
            <Dropdown>
              <Menu>
                {item.submenu.map((sub, index) => {
                  return (
                    <Menu.Item
                      key={`${index}-${item.title}`}
                      label={sub.title}
                      icon={sub.icon}
                      href={sub.href ?? sub.path}
                      active={sub.active}
                    />
                  );
                })}
              </Menu>
            </Dropdown>
          ) : null;
 
          return item.onClick ? (
            <li key={key} className={cn("breadcrumbs").elem("item").mod({ last: isLastItem }).toClassName()}>
              <span onClick={item.onClick}>{title}</span>
            </li>
          ) : dropdownSubmenu ? (
            <Dropdown.Trigger
              key={key}
              component="li"
              className={cn("breadcrumbs").elem("item").mod({ last: isLastItem }).toClassName()}
              content={dropdownSubmenu}
            >
              <span>{title}</span>
            </Dropdown.Trigger>
          ) : href && !isLastItem ? (
            <li key={key} className={cn("breadcrumbs").elem("item").mod({ last: isLastItem }).toClassName()}>
              {isInternal ? (
                <NavLink to={href} data-external={true}>
                  {title}
                </NavLink>
              ) : (
                <a href={absoluteURL(href)}>{title}</a>
              )}
            </li>
          ) : (
            <li key={key} className={cn("breadcrumbs").elem("item").mod({ last: isLastItem }).toClassName()}>
              {title}
            </li>
          );
        })}
      </ul>
    </div>
  );
};