UNPKG

@datalayer/core

Version:
101 lines (100 loc) 3.2 kB
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; /* * Copyright (c) 2023-2025 Datalayer, Inc. * Distributed under the terms of the Modified BSD License. */ import { createContext, useState, useContext } from 'react'; import PropTypes from 'prop-types'; import { LayoutBackdrop } from "./layouts"; export const BackdropContext = createContext({ closeBackdrop: () => { }, displayBackdrop: (nextBackdrop) => { }, }); export function useBackdrop() { const context = useContext(BackdropContext); if (!context) throw new Error('useContext must be inside a provider with a value.'); return context; } /** * The type for the Backdrop context provider. */ export const BackdropContextProvider = BackdropContext.Provider; /* Example ------- import React from 'react' import { BackdropProvider } from 'use-backdrop'; import ExampleComponent from './ExampleComponent' const renderCustomBackdropSurface = (children) => ( <div style={{ // Style your own backdrop surface! position: 'fixed', top: 0, left: 0, height: '100vh', width: '100vw', backgroundColor: 'rgba(0, 0, 0, 0.5)', }}> {children} </div> ) const App = () => ( <BackdropProvider backdropSurface={renderCustomBackdropSurface} > <ExampleComponent /> </BackdropProvider> ) export default App */ export function BackdropProvider(props) { const { children, zIndex, disableDarken, backdropSurface } = props; const defaultBackdropSurface = { position: "fixed", top: 0, left: 0, width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: disableDarken ? 'initial' : 'rgba(0, 0, 0, 0.5)', zIndex, }; const [backdrop, setBackdrop] = useState({ open: false, render: (closeBackdrop) => _jsx(_Fragment, {}) }); const displayBackdrop = (nextBackdrop) => { setBackdrop({ open: true, render: nextBackdrop }); }; const closeBackdrop = () => { setBackdrop({ open: false, render: (closeBackdrop) => _jsx(_Fragment, {}) }); }; return (_jsxs(BackdropContextProvider, { value: { closeBackdrop, displayBackdrop }, children: [_jsx(LayoutBackdrop, {}), children, backdrop.open && (backdropSurface ? (backdropSurface(backdrop.render(closeBackdrop))) : (_jsx("div", { style: defaultBackdropSurface, children: backdrop.render(closeBackdrop) })))] })); } BackdropProvider.propTypes = { children: PropTypes.element, // zIndex of the backdrop surface. Unused if backdropSurface is overridden. zIndex: PropTypes.number, // If true, backdrop background is transparent. disableDarken: PropTypes.bool, // A render function that returns a Component that overrides (takes the // place of) the default darkened div background. // See /example/src/ExampleApp.jsx for proper use. backdropSurface: PropTypes.func }; BackdropProvider.defaultProps = { children: undefined, disableBackdrop: false, zIndex: 9999, backdropSurface: null };