UNPKG

@neo4j-ndl/react

Version:

React implementation of Neo4j Design System

75 lines 3.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SpotlightProvider = exports.useSpotlightContext = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); /** * * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ const react_1 = require("@floating-ui/react"); const classnames_1 = __importDefault(require("classnames")); const react_2 = require("react"); const SpotlightContext = (0, react_2.createContext)(null); const useSpotlightContext = () => { const context = (0, react_2.useContext)(SpotlightContext); if (context === null) { throw new Error('Spotlight components must be wrapped in <SpotlightProvider />'); } return context; }; exports.useSpotlightContext = useSpotlightContext; const SpotlightProvider = ({ children, hasOverlay = true, isOverlayTransparent = false, }) => { const [active, setActive] = (0, react_2.useState)(null); const [isOpen, setIsOpen] = (0, react_2.useState)(false); const [targets, setTargets] = (0, react_2.useState)({}); const registerTarget = (0, react_2.useCallback)((id, ref) => { setTargets((prev) => (Object.assign(Object.assign({}, prev), { [id]: ref }))); }, []); const unregisterTarget = (0, react_2.useCallback)((id) => { setTargets((prev) => { const newTargets = Object.assign({}, prev); delete newTargets[id]; return newTargets; }); }, []); const contextValue = { hasOverlay, isActiveSpotlight: (0, react_2.useCallback)((target) => target === active, [active]), isOpen, registerTarget, registeredTargets: targets, setActiveSpotlight: (0, react_2.useCallback)((target) => setActive(target), []), setIsOpen: (0, react_2.useCallback)((open) => setIsOpen(open), []), unregisterTarget, }; const overlayClasses = (0, classnames_1.default)('ndl-spotlight-overlay', { 'ndl-spotlight-overlay-opaque': !isOverlayTransparent, 'ndl-spotlight-overlay-open': isOpen && active !== null, }); const overlayRootRef = (0, react_2.useRef)(null); if (active !== null) { overlayRootRef.current = document.getElementById(active); } return ((0, jsx_runtime_1.jsxs)(SpotlightContext.Provider, { value: contextValue, children: [hasOverlay && active !== null && isOpen && ((0, jsx_runtime_1.jsx)(react_1.FloatingPortal, { root: overlayRootRef.current, children: (0, jsx_runtime_1.jsx)(react_1.FloatingOverlay, { lockScroll: true, className: overlayClasses, "data-testid": "ndl-spotlight-overlay" }) })), children] })); }; exports.SpotlightProvider = SpotlightProvider; //# sourceMappingURL=SpotlightProvider.js.map