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 "./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
* - 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 navigate = useNavigate();
const { search } = useLocation();
const { showNow } = useScreensaver();
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") {
return (
<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="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")}
/>
</div>
</div>
);
}
return (
<div className="slide-navigation">
<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>
);
};