@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
JavaScript
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 };
}