UNPKG

@awsui/components-react

Version:

AWS UI is a collection of [React](https://reactjs.org/) components that help create intuitive, responsive, and accessible user experiences for web applications. It is developed by Amazon Web Services (AWS). This work is available under the terms of the [A

65 lines (64 loc) 2.78 kB
import { __assign, __rest } from "tslib"; import React, { createContext, useLayoutEffect, useRef, useState } from 'react'; function getContextFromElement(element, contextKey) { return element[contextKey]; } function setContextToElement(element, contextKey, contextValue) { element[contextKey] = contextValue; var event = document.createEvent('CustomEvent'); event.initCustomEvent(contextKey, false, false, null); element.dispatchEvent(event); } function findupContext(contextKey, element) { var currentElement = element; while (currentElement) { if (getContextFromElement(currentElement, contextKey) !== undefined) { return currentElement; } currentElement = currentElement.parentElement; } return null; } export function createDomContext(name, defaultValue) { var context = createContext(defaultValue); var contextKey = "__awsui_context_" + name; var ReactProvider = context.Provider; function RootProvider(_a) { var value = _a.value, rest = __rest(_a, ["value"]); var ref = useRef(null); useLayoutEffect(function () { if (ref.current) { setContextToElement(ref.current, contextKey, value); } }, [value]); return (React.createElement(ReactProvider, { value: value }, React.createElement("div", __assign({ ref: ref }, rest)))); } function IntermediateProvider(_a) { var children = _a.children, parentElement = _a.parentElement; var _b = useState(undefined), discoveredValue = _b[0], setDiscoveredValue = _b[1]; useLayoutEffect(function () { var providerElement = findupContext(contextKey, parentElement); if (!providerElement) { setDiscoveredValue(null); } else { setDiscoveredValue(getContextFromElement(providerElement, contextKey)); var changeListener_1 = function () { var newValue = getContextFromElement(providerElement, contextKey); setDiscoveredValue(newValue); }; providerElement.addEventListener(contextKey, changeListener_1); return function () { return providerElement.removeEventListener(contextKey, changeListener_1); }; } }, [parentElement]); if (discoveredValue === undefined) { return null; } if (discoveredValue === null) { return React.createElement(React.Fragment, null, children); } return React.createElement(ReactProvider, { value: discoveredValue }, children); } return { context: context, RootProvider: RootProvider, IntermediateProvider: IntermediateProvider }; }