components/SlideNavigation/SlideNavigation.jsxjavascript
import { useState } from "react";
import { useNavigate, useLocation } from "react-router";
import { UIMCButton } from "@ui-marcom/react/button";
import { UIMCControlButton } from "@ui-marcom/react/control-button";
import { useScreensaver } from "../../services/screensaver";
import { navigateWithTransition } from "../../utils/viewTransition";
import { SlidesOverlay } from "../SlidesOverlay/SlidesOverlay";
import { LinkWidget } from "../LinkWidget/LinkWidget";
import { useContent } from "../../services/content";

// import { useTabs } from "../../services/tabs";

import "./SlideNavigation.scss";

/**
 * Fixed bottom navigation of the slide pages, with three modes:
 * - closed: menu button + prev/next arrows (hidden entirely while the view
 *   has no adjacency, e.g. before content has loaded)
 * - menu: full-width bar with Home / Screensaver / Apps / Slides / close,
 *   plus an "Open Link" button when the current view has a `link`/`visibleLink`
 *   (opened in a new tab via {@link useTabs})
 * - slides: same bar plus the full-screen {@link SlidesOverlay}
 *
 * @param {Object} props
 * @param {string|null} props.prevViewId - Target of the "back" arrow, disables it when null.
 * @param {string|null} props.nextViewId - Target of the "next" arrow, disables it when null.
 * @param {string} props.homeViewId - View the menu's Home button navigates to.
 * @param {string} props.currentViewId - Currently shown view (highlighted in the slides overlay).
 * @param {function(string): void} props.onNavigate - Navigates within the current app, keeping config params.
 */
export const SlideNavigation = ({
  prevViewId,
  nextViewId,
  homeViewId,
  currentViewId,
  onNavigate,
}) => {
  // "closed" shows the regular menu/prev/next bar; "menu" the expanded menu
  // bar; "slides" the menu bar plus the full-screen slide-thumbnail overlay
  const [mode, setMode] = useState("closed");
  const { views } = useContent();
  const navigate = useNavigate();
  const { search } = useLocation();
  const { showNow } = useScreensaver();
  // const { openTab } = useTabs();
  const [linkOpen, setLinkOpen] = useState(0);
  const [currentLink, setCurrentLink] = useState(null);

  if (!prevViewId && !nextViewId) return null;

  const mainMenuButtons = (
    <div className="slide-navigation__menu-group">
      <UIMCButton
        className="slide-navigation__button slide-navigation__button--menu-item"
        variant="standard"
        title="Home"
        onClick={() => {
          setMode("closed");
          onNavigate(homeViewId);
        }}>
        Home
      </UIMCButton>
      <UIMCButton
        className="slide-navigation__button slide-navigation__button--menu-item"
        variant="standard"
        title="Screensaver"
        onClick={() => {
          setMode("closed");
          showNow();
        }}>
        Screensaver
      </UIMCButton>
      <UIMCButton
        className="slide-navigation__button slide-navigation__button--menu-item"
        variant="standard"
        title="Apps"
        onClick={() => {
          setMode("closed");
          navigateWithTransition(navigate, `/${search}`);
        }}>
        Apps
      </UIMCButton>
    </div>
  );

  if (mode === "slides") {
    return (
      <>
        <SlidesOverlay
          currentViewId={currentViewId}
          onSelectSlide={(viewId) => {
            setMode("closed");
            onNavigate(viewId);
          }}
        />
        <div className="slide-navigation slide-navigation--menu">
          {mainMenuButtons}
          <div className="slide-navigation__menu-group">
            <UIMCButton
              className="slide-navigation__button slide-navigation__button--menu-item"
              variant="standard"
              title="Back"
              onClick={() => setMode("menu")}>
              ← Back
            </UIMCButton>
            <UIMCControlButton
              className="slide-navigation__button slide-navigation__button--menu-item"
              variant="standard"
              size="medium"
              icon="close"
              title="Schließen"
              onClick={() => setMode("closed")}
            />
          </div>
        </div>
      </>
    );
  }
  if (mode === "menu") {
    // console.log(" :/ ", views.get(currentViewId));
    const link = views.get(currentViewId).link || null;
    const visiblelink = views.get(currentViewId).visibleLink || null;

    const clickLinkBtn = (linkId) => {
      if (linkId === 1) {
        setLinkOpen(linkId);
        setMode("link");
        setCurrentLink(link);
      }
      if (linkId === 2) {
        setLinkOpen(linkId);
        setMode("link");
        setCurrentLink(visiblelink);
      }
      if ((linkOpen === 1 && linkId === 1) || (linkOpen === 2 && linkId === 2)) setLinkOpen(0);
    };
    return (
      <div className="slide-navigation slide-navigation--menu">
        {/* {linkOpen !== 0 ? (
          <div className="external-link">
            <iframe src={currentLink}></iframe>
          </div>
          <LinkWidget link={currentLink} />
        ) : null} */}
        {mainMenuButtons}
        <div className="slide-navigation__menu-group">
          {visiblelink ? (
            <UIMCControlButton
              className="slide-navigation__button slide-navigation__button--visiblelink "
              variant="standard"
              size="medium"
              icon={`arrow-exit`}
              title="Open Link"
              onClick={() => clickLinkBtn(2)}
            />
          ) : null}
          {link ? (
            <UIMCControlButton
              className="rotate slide-navigation__button--link"
              variant="standard"
              size="medium"
              icon={`arrow-exit`}
              title="Open Link"
              onClick={() => clickLinkBtn(1)}
            />
          ) : null}
          <UIMCButton
            className="slide-navigation__button slide-navigation__button--menu-item"
            variant="standard"
            title="Slides"
            onClick={() => setMode("slides")}>
            Slides
          </UIMCButton>
          <UIMCControlButton
            className="slide-navigation__button slide-navigation__button--menu-item"
            variant="standard"
            size="medium"
            icon="close"
            title="Schließen"
            onClick={() => {
              setMode("closed");
              setLinkOpen(0);
            }}
          />
        </div>
      </div>
    );
  }

  if (mode === "link") {
    const link = views.get(currentViewId).link || null;
    const visiblelink = views.get(currentViewId).visibleLink || null;
    const closeLink = (link) => {
      if (link === currentLink) setMode("menu");
      else setCurrentLink(link);
    };
    return (
      <>
        <LinkWidget link={currentLink} />
        <div className="slide-navigation slide-navigation--menu">
          {mainMenuButtons}
          <div className="slide-navigation__menu-group">
            {visiblelink ? (
              <UIMCControlButton
                className="slide-navigation__button slide-navigation__button--visiblelink "
                variant="standard"
                size="medium"
                icon={`${currentLink === visiblelink ? "close" : "arrow-exit"}`}
                title="Open Link"
                onClick={() => closeLink(visiblelink)}
              />
            ) : null}
            {link ? (
              <UIMCControlButton
                className="rotate slide-navigation__button--link"
                variant="standard"
                size="medium"
                icon={`${currentLink === link ? "close" : "arrow-exit"}`}
                title="Open Link"
                onClick={() => closeLink(link)}
              />
            ) : null}
            <UIMCButton
              className="slide-navigation__button slide-navigation__button--menu-item"
              variant="standard"
              title="Slides"
              onClick={() => setMode("slides")}>
              Slides
            </UIMCButton>
            <UIMCControlButton
              className="slide-navigation__button slide-navigation__button--menu-item"
              variant="standard"
              size="medium"
              icon="close"
              title="Schließen"
              onClick={() => {
                setMode("closed");
                setLinkOpen(0);
              }}
            />
          </div>
        </div>
      </>
    );
  }
  const qrcode = views.get(currentViewId).qrcode || null;

  return (
    <div className="slide-navigation">
      {qrcode ? <img className="slide-navigation__qrcode" src={qrcode} alt="QR Code" /> : null}
      <UIMCControlButton
        className="slide-navigation__button slide-navigation__button--menu"
        variant="standard"
        size="medium"
        icon="menu"
        title="Menu"
        onClick={() => setMode("menu")}
      />
      <UIMCControlButton
        className="slide-navigation__button slide-navigation__button--prev"
        variant="standard"
        size="medium"
        icon="arrow-long-left"
        title="Zurück"
        disabled={!prevViewId}
        onClick={() => prevViewId && onNavigate(prevViewId)}
      />
      <UIMCControlButton
        className="slide-navigation__button slide-navigation__button--next"
        variant="standard"
        size="medium"
        icon="arrow-long-right"
        title="Weiter"
        disabled={!nextViewId}
        onClick={() => nextViewId && onNavigate(nextViewId)}
      />
    </div>
  );
};